Gibt es einen Unterschied zwischen der Verwendung eines eingebauten SPI-Moduls und Bit-Banging?

25

Gibt es einen Unterschied zwischen den beiden, oder handelt es sich nur um eine Abstraktion? Meiner Intuition nach gibt es keinen Unterschied, aber ich würde gerne falsch liegen.

Skaevola
quelle
1
Kommt drauf an, wie gut du im Bitbangen bist. Siehe code.google.com/p/fastspi und waitingforbigo.com :-)
Robert Atkins

Antworten:

33

Ein tatsächliches SPI-Controller-Peripheriegerät in der MCU kann oft viel schneller laufen als das Bit-Banging der Schnittstelle. Natürlich hängt es von der MCU ab, aber es würde mich nicht überraschen, wenn ein SPI-Controller mit über 30 MHz läuft, während das Bit-Banging auf etwa 1 MHz begrenzt sein könnte (wenn Sie Glück haben).

Aber es steckt noch mehr dahinter. Beim Bit-Banging ist die MCU mit dem Bit-Banging beschäftigt. Es verschiebt die Daten heraus und dreht die GPIO-Leitungen. Das heißt, es kann nichts anderes tun. Bei Verwendung eines SPI-Controllers ist der Controller mit all diesen Aufgaben beschäftigt, und die MCU kann andere Aufgaben ausführen.

Mit einem tatsächlichen SPI-Controller ist die tatsächliche SPI-Übertragung also viel schneller und die MCU gewinnt einige Zyklen zurück, die sie für andere Aufgaben verwenden kann.

Dietrich Epp
quelle
11

Es gibt keinen Unterschied, ob Sie mit beiden Methoden dasselbe Ergebnis erzielen können, aber es gibt einige Gründe, warum Sie sich für eine andere entscheiden sollten.

Durch die Verwendung eines SPI-Peripheriegeräts muss der Prozessor nicht mehr das Timing für das Bit-Banging der E / A-Pins generieren, sodass er andere Rechenaufgaben ausführen und die Programmierung der CPU vereinfachen kann. Da das Peripheriegerät in Hardware implementiert ist, läuft es schneller und verbraucht weniger Strom als Bit-Banging-E / A. Es kann Fälle geben, in denen Sie die E / A-Schnittstelle mit SPI blockieren möchten, wenn Ihre Anwendung die Auswahl eines Prozessors ohne SPI-Peripheriegerät erfordert. Aus Gründen der Vernunft würde ich empfehlen, dies zu vermeiden, es sei denn, dies ist absolut notwendig.

Amoch
quelle
Der vernünftige Grund ist Müll. Das Einrichten der SPI-Hardware auf genau die Konfiguration, die Sie benötigen, erfordert häufig mehr Zeit für das Lesen des SPI-Peripheriegerätedatenblatts als nur das Schreiben des SPI-Mastercodes und damit nur das Lesen des Slave-Gerätedatenblatts.
Olin Lathrop
Ich gebe zu, dass ich mit meiner vernünftigen Bemerkung ein bisschen sensationell war, aber die (zugegebenermaßen ungeschriebene) Absicht war, dass mit zunehmender Anwendungskomplexität auch die Last steigt, sicherzustellen, dass das System als Ganzes weiterhin innerhalb der beabsichtigten Zeiten funktioniert. Ich habe es in beide Richtungen implementiert und weiß, dass ich lieber das Peripheriegerät verwenden würde, auch wenn ich einige Minuten länger brauche, um das Datenblatt zu lesen.
Amoch
6

SPI ist eine synchrone Schnittstelle, wobei der Master die Uhr steuert. Das heißt, wenn Sie der Master sind, können Sie die Taktrate und das Timing auswählen. Slave-Geräte haben eine gewisse Obergrenze für die Taktfrequenz, die sie verarbeiten können, es ist ihnen jedoch normalerweise egal, wie langsam die Taktfrequenz darunter ist. Genauer gesagt, es gibt normalerweise eine minimale Zeit, die jeder Slave benötigt, um die Uhr im hohen und niedrigen Zustand zu sehen, bevor sie wieder umschalten kann, und es wird eine minimale Dateneinstellung und Haltebegrenzung für die Datenleitung geben, die die Taktflanke umgibt, auf der die Slave liest die Datenleitung.

Aus diesem Grund ist die Implementierung eines SPI-Masters in Firmware sehr einfach. Ich habe dies oft getan, um bestimmte Pins zu verwenden, wenn es keine eingebaute SPI-Hardware gab oder sie aus irgendeinem Grund nicht für diesen Zweck verfügbar war. Ein SPI-Master in Firmware zu erstellen ist so einfach wie nie zuvor.

Viele SPI-Slave-Geräte sind recht schnell, daher werden die minimalen Takt- und Einrichtungszeiten häufig einfach dadurch eingehalten, dass sichergestellt wird, dass jeder Befehl mindestens einen Befehlszyklus breit ist. In diesem Fall ist der Code sehr kurz und schnell. In einigen Fällen kann ein Slave-Gerät zwei oder drei Befehlszyklen pro Taktphase erfordern, aber es ist auch nicht schwer, dies zu garantieren. Die Low-Level-SPI-Bitschleife erfordert das Verschieben des nächsten Ausgangsbits in die Position, das Ergreifen des Eingangsbits und das Überprüfen des Schleifenzählers. Sie können in der Regel die Mindestzeitvorgaben für zwei oder drei Zyklen erfüllen, indem Sie das Fahren und Abtasten der Leitungen mit einem Teil des anderen Overheads an den richtigen Stellen arrangieren. Wenn Geschwindigkeit wichtig ist, können Sie den Assembler-Präprozessor verwenden, um eine entrollte Schleife zu schreiben. Mit Techniken wie dieser,

Es gibt einige Vorteile, den SPI-Master in Firmware auszuführen. Die Konfiguration der SPI-Hardware ist manchmal etwas umständlich. Es ist immer die Frage, was genau passieren soll, wenn die Slave-Auswahl aktiviert wird. Wird dann das erste Bit in die Datenleitungen geschrieben? Was ist, wenn die Uhr niedrig startet und die Datenleitungen an der fallenden Flanke zwischengespeichert werden sollen? Manchmal ist das wichtig, manchmal nicht. Mit einem Firmware-SPI-Master können Sie fehlerverzeihender sein und möglicherweise dieselbe Routine für die Kommunikation mit verschiedenen Slaves verwenden. Sie können beispielsweise sicherstellen, dass die MOSI-Datenleitung (Master Out Slave In) an beiden Flanken der Uhr stabil ist. SPI-Hardware kann das im Allgemeinen nicht. Daher muss diese Hardware neu konfiguriert werden, je nachdem, mit welchem ​​Slave sie gerade kommuniziert.

Ein weiterer Vorteil eines Firmware-SPI-Masters besteht darin, dass Sie eine beliebige Anzahl von Bits pro SPI-Sequenz auswählen können. Hardware ist normalerweise auf ein Vielfaches von 8 Bit beschränkt. Die meisten Geräte sind für die Übertragung ganzer Bytes ausgelegt, erfordern diese jedoch häufig nicht. Beispielsweise sendet ein 10-Bit-A / D wahrscheinlich zuerst die 10 Datenbits und anschließend 0 oder Garbage, wenn Sie die Taktung fortsetzen. Wenn Sie Hardware-SPI verwenden, müssen Sie 16 Bit übertragen und den Müll maskieren. Alles wird gut funktionieren, aber ein Firmware-SPI-Master könnte in diesem Fall tatsächlich schneller als die Hardware sein, da er nur die mindestens erforderlichen 10 Bits überträgt.

Der Hauptvorteil von Hardware-SPI-Mastern besteht darin, dass die Firmware eine Byte-Übertragung initiieren und dann loslegen und etwas anderes tun kann. Die Taktung kann in der Regel auch schneller sein, als dies selbst mit einer entrollten Firmware-Schleife möglich ist. Beachten Sie, dass diese beiden Vorteile unter bestimmten Umständen wichtig sein können, sie jedoch häufig nicht relevant sind. Der meiste SPI-Code, der Hardware zum Übertragen eines Bytes verwendet, geht dann sofort in eine Warteschleife, damit die Hardware die Übertragung beendet. Überprüfen Sie auch die Slave-Timing-Anforderungen sorgfältig. SPI-Geräte sind im Allgemeinen insgesamt schnell, aber es gibt Fälle, in denen Sie die Hardware trotzdem verlangsamen müssen, um die maximale Geschwindigkeit zu erreichen, mit der der Slave umgehen kann.

Das war alles aus der Sicht des Meisters. Kurz gesagt, die Verwendung von SPI-Hardware als Master bietet häufig nur geringe Vorteile und manchmal sogar ein paar Vorteile, wenn sie nicht verwendet wird. Dies ist jedoch bei Sklaven anders. Da der Master die Uhr steuert, müssen die Slaves für alles bereit sein, was der Master tut, wenn der Master es tut. Die Timing-Anforderungen sind im Verhältnis zu den Instruktionszeiten oftmals recht kurz. Daher ist die Implementierung eines SPI-Slaves in der Regel genau das Richtige für Sie.

Sie können SPI-Slaves in der Firmware ausführen, aber das ist schwierig. Sie müssen die Zyklen und die Latenz sorgfältig zählen und implementieren in der Regel eine Teilmenge des Protokolls, das Ihr bestimmter Master verwendet. Zum Beispiel musste ich einmal ein digitales Äquivalent einer alten analogen Controller-Karte entwerfen (sie wollten zusätzliche Funktionen, die in Analog nicht vernünftigerweise möglich waren, und sie wollten etwas Kleineres, Billigeres in der Herstellung und Stabileres). Diese Karte war über einen SPI-Bus mit dem Rest des Systems verbunden. Die alte Analogkarte hatte einen zweikanaligen D / A-Anschluss zum Einstellen der Steuerwerte und einen zweikanaligen A / D-Anschluss zum Zurücklesen der Messwerte. Beides in einem einzigen Prozessor zu implementieren war schwierig und beinhaltete das Herausfinden, welche Teilmenge des Hardware-D / A- und A / D-SPI-Protokolls der vorhandene Master tatsächlich verwendete. Es wurde auch ein Prozessor entwickelt, der deutlich schneller als die SPI-Taktrate laufen könnte. Am Ende habe ich drei Interrupts verwendet, einen für jede Slave-Auswahl und einen für die ansteigende Flanke der Taktleitung. Der letzte musste der Interrupt mit der höchsten Priorität im System sein, da sonst die Latenzbedingung nicht erfüllt werden konnte.

Der springende Punkt ist jedoch, dass ein Firmware-SPI-Master einfach, klein, schnell und flexibel ist und es kaum einen Grund gibt, sich davor zu scheuen, dies zu tun. Auf der anderen Seite möchte man für einen Slave wirklich Hardware, oder man muss aufwachen und sehr sorgfältig über Timing, Latenz und dergleichen nachdenken.

Olin Lathrop
quelle
Haben Sie Mikrocontroller-Slave-Implementierungen gefunden, die sich wie typische Hardware-SPI-Geräte verhalten können (z. B. kann der Master den Status von CS und Read jederzeit ändern und CS zum Markieren von Befehlsgrenzen verwenden? Die meisten Implementierungen, die ich gesehen habe, funktionieren nicht sogar melden, ob es eine CS-Flanke zwischen dem aktuellen und dem vorherigen Byte gab
supercat
@supe: Ja, das ist ein Problem. Die Slave-SPI-Hardware ignoriert normalerweise Takt- und Eingangsdaten und hält die Ausgangsdatenleitung hochohmig, wenn die Chipauswahl nicht aktiviert ist, aber normalerweise nicht sagt, wo sich die Chipauswahlgrenzen befinden. Zumindest mit der PIC-SPI-Hardware, an die ich mich erinnere, müssten Sie dafür Ihren eigenen Interrupt-on-Chip-Select einrichten.
Olin Lathrop
Ich habe mich gefragt, ob Ihnen anständige Implementierungen bekannt sind. Ich denke nicht. Das Problem bei der Verwendung eines Hardware-Interrupts auf der Auswahlleitung besteht darin, dass der Slave möglicherweise nur schwer feststellen kann, ob ein Übergang auf der Auswahlleitung kurz nach dem Senden eines Bytes vor oder nach dem betreffenden Byte stattgefunden hat. Ich finde es rätselhaft, dass fast jeder Chip eine SPI-Slave-Implementierung hat, aber es scheint, dass keiner von ihnen tatsächlich wie ein typisches SPI-Hardware-Slave-Gerät verwendet werden kann. Die Situation ähnelt in etwa dem Prozessor-Slave-Port des PIC im Vergleich zum 8048.
Supercat
Der Slave-Port des 8048-Prozessors verfügt über einen Adress-Pin. Wenn Daten extern in den 8048 geschrieben werden, speichert der 8048 den Status dieses Pins und stellt ihn seinem Code zur Verfügung (normalerweise wird das erste Byte eines Befehls an eine Adresse und Parameter oder Daten an die andere Adresse geschrieben). Ein Lesevorgang von einer Adresse ergibt, was auch immer der 8048-Code dort anzeigt, aber einige Bits, die von der anderen Adresse gelesen werden, werden von der 8048-Hardware erzeugt, um anzuzeigen, ob sie bereit ist, Daten lesen oder schreiben zu lassen.
Supercat
+1, um darauf hinzuweisen, dass der Unterschied darin besteht, einen Master (leicht) und einen Slave (viel schwieriger) zu schlagen.
Tcrosley
1

Es hängt davon ab, wofür Sie SPI verwenden. Wenn Sie daran interessiert sind, die höchsten Datenraten zu erzielen, ist Hardware immer schneller als Bitbanging (z. B. der Armcortex - Chip im Teenager 3). Ich kann Daten mit 22 Mbit / s über die Hardware - SPI - Unterstützung übertragen, im Vergleich zu ~ 4,5 Mbit / s mit Bitbanging (it) kann auch eine beliebige Anzahl von Bits pro Übertragung von 3-16 verarbeiten - nützlich, wenn Daten in 12-Bit-Blöcken für bestimmte LED-Controller gesendet werden!)). Bei 16-MHz-AVRs ist der Unterschied etwas geringer. Die höchste Datenrate mit Hardware scheint bei 4 bis 5 Mbit / s zu liegen, während das Bitbanging bei 2,3 Mbit / s liegt.

Wenn Sie die Hardwareunterstützung verwenden, stehen Ihnen abhängig vom jeweiligen Mikrocontroller Optionen zur Verfügung, mit denen Sie Ihre Daten mithilfe von DMA-Controllern auslagern können. So können Sie Ihren Code auf andere, möglicherweise interessantere Dinge zurückführen, als die Daten zu babysitten schreiben.

Alles hängt davon ab, ob Hardware-SPI überhaupt eine Option ist oder nicht.

rDg
quelle
0

Wenn Sie SPI-Bit-Bang verwenden, können Sie den SSP-Interrupt nicht für die Kommunikation verwenden. Dies ist für SPI für viele Anwendungen nicht so wichtig

Scott Seidman
quelle
1
Da kein bestimmter Prozessor erwähnt wurde, ist "SSP-Interrupt" in diesem Zusammenhang ein bedeutungsloser Begriff.
Olin Lathrop