Kann SPI sicher unterbrochen werden?

17

Ich schreibe von meiner Firmware aus auf eine microSD- Karte, dies ist jedoch die Aufgabe mit der niedrigsten Priorität, sodass sie während des Lese- / Schreibvorgangs von anderen Aufgaben unterbrochen werden kann.

Angenommen, ich habe mit dieser microSD-Karte über einen UART kommuniziert. Das Problem während des Lesens wäre, dass der Hardware-RX- FIFO überlaufen würde, so dass die maximale Verzögerung, die ich anstrengen kann, (FIFO-Größe × Bytes / Sekunde) wäre, und während des Schreibens würde es kein Problem geben, da das andere Ende nur warten würde, bis ich es bin Sende das nächste Zeichen.

Wie funktioniert das jetzt mit SPI? Ist die Situation die gleiche, die für Schreibvorgänge keine Rolle spielt und für Lesevorgänge von der SPI-FIFO-Größe abhängt?

Muis
quelle

Antworten:

22

Die überwiegende Mehrheit der SPI-Geräte ist mit einer Datenrate unter dem angegebenen Maximum vollkommen zufrieden. Man könnte einen Teil einer Transaktion ausführen, jederzeit eine Pause einlegen, einige Jahre später zurückkehren und sie abschließen. Vorausgesetzt, es gab keine Störungen auf der Uhr, der Auswahl oder den Stromleitungen, würde die Transaktion normal abgeschlossen.

Es gibt drei wichtige Vorbehalte zu beachten:

  1. Sobald eine Transaktion auf einem SPI-Bus begonnen hat, darf im Allgemeinen keine der Leitungen auf dem Bus für einen anderen Zweck verwendet werden, bis diese Transaktion abgeschlossen ist. Im Allgemeinen bedeutet dies, dass ein Interrupt möglicherweise keinen SPI-Bus verwendet, es sei denn, es ist das Einzige, das den Bus verwendet (es kann vorkommen, dass der Interrupt zu bestimmten Zeiten ausschließlich den Bus verwendet und für den Hauptbus) Programm zur ausschließlichen Verwendung zu anderen Zeiten). Einige Geräte verfügen über spezielle Pins, mit denen sie den Bus während einer Transaktion "ignorieren" können. Trotz dieser Funktionen würde ich nicht empfehlen, einen Interrupt zu veranlassen, eine SPI-Transaktion mit einem Gerät auszusetzen. Führen Sie eine Transaktion mit einem anderen Gerät durch. und lassen Sie dann den zugrunde liegenden Code seine Transaktion mit dem ersten fortsetzen. Besser, der Interrupt verwendet einen separaten SPI-Bus.
  2. Einige Geräte verhalten sich möglicherweise merkwürdig, wenn eine Transaktion zu lange dauert. Einige Echtzeituhr-Chips puffern beispielsweise die Zeit- / Datumsregister nicht doppelt, sondern speichern alle "Zeitvorlauf" -Ereignisse, die während einer Transaktion auftreten würden, und wenden sie an, nachdem die Transaktion abgeschlossen ist. Wenn eine Transaktion so lange dauert, bis ein zweites Zeitvorlaufereignis eintrifft, wird das letztere Ereignis ignoriert, wodurch die Uhr um diese Zeitspanne verschoben wird. Ich sehe wirklich keine Entschuldigung für das Entwerfen eines Chips auf diese Weise (selbst wenn man nicht die Kosten für das doppelte Puffern der Daten haben wollte, wäre die Angabe, dass die Software dafür verantwortlich ist, dass ihre Kohärenz gewährleistet ist, billiger als das Hinzufügen der "Aktualisierungsverzögerungs" -Logik, und würde die Wahrscheinlichkeit von Taktstörungen minimieren), aber solche Chips existieren.
  3. Es gibt einige Geräte, die ein Takt- und Datensignal verwenden, die jedoch eine "Pause" verwenden, um das Einrahmen zu kennzeichnen. Das jüngste Beispiel dafür war eine LED-Lichterkette mit Controller pro Birne. Ich mag solche Designs nicht besonders (man könnte das Framen genauso gut durch drei aufeinanderfolgende ansteigende Flanken auf der Datenleitung ohne dazwischenliegende Uhr anzeigen), aber es gibt auch solche Geräte.

Während bestimmte Kommunikationsarten die Verwendung bestimmter Timings erfordern, gibt es für SPI-Geräte selten einen Grund, diese zu benötigen. Dennoch muss man sich der Existenz solcher Geräte bewusst sein.

Superkatze
quelle
3
+1 Schön! Stimmen Sie allen Ihren Meinungen / Frustrationen voll und ganz zu. Ich habe es auch zu oft gesehen.
DrFriedParts
11

Wenn Sie eine Kopie der Spezifikation überprüfen (die ich aus Copyright- / NDA-Gründen nicht zitieren kann), wird die SPI-Rate ab 0 Hz angegeben, was bedeutet, dass der statische Betrieb in Ordnung ist. Unter SPI erhalten Sie Daten nur zurück, während das Gerät getaktet wird. Wenn Sie also ein Hardware-SPI verwenden, erhalten Sie etwas erst, nachdem Daten gesendet wurden (auch wenn 0 / egal). In dieser Hinsicht unterscheidet es sich von einem UART, bei dem Sie jederzeit unerwünschte Daten zurückerhalten können.

PeterJ
quelle
Meine einzige Sorge sollte also sein, dass auf der MicroSD-Karte eine Art Timeout eingebaut ist, nicht jedoch SPI selbst?
Muis
5
Nach den Angaben von allem, was ich sehen konnte, sollte auch auf der SD-Karte keine Zeitüberschreitung auftreten. Sie sollten also eigentlich keine Probleme haben. Vor Jahren habe ich einen benutzerdefinierten Code geschrieben und während des Debuggens wurde der Code einzeln durchlaufen, wobei zwischen den SPI-Vorgängen mindestens 10 Sekunden verblieben sind und alles in Ordnung war.
PeterJ
1
+1, In der Lage zu sein, SPI bis zu 0 Hz auszuführen, ist nützlich, um das Debuggen zu kennen. Vielen Dank.
Anindo Ghosh
1
Es ist zu beachten, dass sich bei einigen SPI-Geräten die Datenausgabe nur bei einer bestimmten Taktflanke ändern kann, bei einigen anderen jedoch die Datenausgabe manchmal asynchron. Dies ist insbesondere bei einem "Besetzt" -Bit der Fall. Bei einigen Chips ändert sich der Ausgang asynchron, wenn man den Status des "Besetzt" -Bits ausgebucht hat und es immer noch am Ausgang ist, wenn der Teil nicht besetzt ist. Bei einigen anderen Chips ändert sich der gemeldete "Besetzt" -Zustand erst, wenn er erneut getaktet wird. Beide Designs haben Vor- und Nachteile. Daher ist es nützlich zu wissen, dass beide Designtypen vorhanden sind.
Supercat