Ist SPI wesentlich schneller als Bit-Banging?

Ich habe ein Projekt, das auf einem Bild 18f4550 basiert. Gibt es beim Schreiben in ein '595-Schieberegister einen deutlichen Vorteil bei der Verwendung von spi gegenüber normalen io-Pins? Ich habe gehört, dass Spi schneller ist, aber ich bin mir nicht sicher, wie. Verwendet er einen anderen, schnelleren Takt als der Rest des Chips oder ist er einfach effizienter? Ich kann ein Byte durch normale io-Pins in einer ziemlich kleinen Anzahl von Anweisungen bit-bangen. Verbraucht spi weniger Rechenleistung? Ich werde während ziemlich intensiver Berechnungen ziemlich oft ausschalten, daher möchte ich, dass so viele Zyklen wie möglich meinem Prozess gewidmet sind und nicht ausschalten.

Mein Hauptgrund, spi nicht verwenden zu wollen, ist, dass mein aktuelles Layout den Zugriff auf die erforderlichen Pins etwas erschweren würde, da ich einige davon bereits für andere Dinge verwende und die Dinge herummischen müsste. Ich wollte herausfinden, welche Vorteile es gibt, bevor ich anfange, Dinge zu zerreißen und zu bewegen.

Sie können SPI durch Bit-Banging ausführen.

Antworten (4)

Angenommen, Sie vergleichen ein Spi-Peripheriegerät oder eine synchrone serielle "Engine" im Mikro mit der Erzeugung derselben Sequenz durch "Bit-Banging", dann ja, es ist tendenziell etwas schneller, aber was noch wichtiger ist, der Prozessor kann ein ganzes Byte an übergeben das Peripheriegerät zu senden und dann andere Dinge zu tun, während es übertragen wird. Im Bit-Banging-Fall neigt der Prozessor dazu, während der Übertragung gebunden zu sein (obwohl das Mikro dazu neigt, der Master zu sein und die meisten Peripheriegeräte vollständig statisch sind, können Sie wahrscheinlich tolerieren, mitten im Byte anzuhalten, um einen Interrupt zu bedienen oder sogar abzufragen Dinge - schnittstellengetaktete serielle ADC und Sample-Intervall-Tasks sind bemerkenswerte Beispiele für Ausnahmen).

Auf leistungsfähigeren MCUs kann es sogar möglich sein, einen DMA-Controller so zu programmieren, dass er ohne weitere Aufmerksamkeit des Prozessors eine Multibyte-Übertragung vom Speicher durch die SPI-Engine ausführt, insbesondere wenn nur Daten in einer Richtung wichtig sind.

Aber viele Mikrocontroller-Projekte sind am Ende hochoptimiert für ihre Aufgabe; Wenn Sie die Zyklen ersparen und die Geschwindigkeitsreduzierung tolerieren können, ist es keineswegs eine ungewöhnliche Wahl, Ihre Software zu komplizieren, um in der Lage zu sein, alle GPIOs zu verwenden, die das physische Layout sauberer machen.

Ja das ^. Wie Chris erwähnt, besteht der größte Vorteil der Verwendung von Hardware-Peripheriegeräten darin, dass Sie ein Datenbyte von einem Stream an das Peripheriegerät übergeben und per Interrupt benachrichtigt werden können, wenn es mit dem Verschieben fertig und für ein weiteres Byte bereit ist. Dadurch wird Ihre CPU-Auslastung für andere Dinge frei, während das Byte verschoben wird - was angesichts der Baudrate dieser seriellen Protokolle eine Lebensdauer in Maschinenzyklen sein kann.
Kein Leben für SPI. Wenn Sie von Geschwindigkeit sprechen, können Sie den SPI möglicherweise mit 10 MHz ausführen, was nur 10 PIC-Befehlen bei voller Geschwindigkeit entspricht. Das ist kaum ein Alter. Gerade genug Zeit, um Ihr nächstes Byte fertig zu machen. Es ist kaum genug Zeit, um einen Interrupt zu bedienen.
Es könnte fair sein zu sagen, dass viel von der beabsichtigten/erforderlichen Baudrate abhängt, die nicht angegeben wurde. Wie ich jedoch betonte, kann es, wenn das Mikro der Master ist, frei sein, das nächste Byte zu spät zu senden, vorausgesetzt, die Anwendung kann die Unregelmäßigkeit/Verringerung des Durchsatzes tolerieren.
@Rocketmagnet, ich stehe korrigiert. SPI ist viel schneller als ich dachte - ich glaube, ich habe es mit langsameren seriellen Protokollen wie UART (wobei 9600 Baud ~ 10 kHz sind) in einen Topf geworfen.
Beachten Sie auch, dass SPI-Master relativ einfach zu bitbangen ist. SPI-Slave kann etwas schwieriger sein, da die Chipauswahl- und Taktübergänge speziell zeitlich festgelegt und behandelt werden müssen (wie ein externer Interrupt-Pin). Ich verwende den SPI-Master-Bit-Bang-Stil oft in meinen Projekten, besonders wenn ich keine hohe Leistung brauche, aber ein sauberes Board möchte (auch gut für das Ätzen zu Hause). Beachten Sie auch, dass es üblich ist, das Gegenteil zu tun: Daten mit SPI und einem GPIO (Latch-Pin) in Schieberegister (HC595 usw.) zu verschieben.

Vorteile des Bit-Banging:

  • Absolute Kontrolle über das Protokoll.
  • Wenn die Zeit zum Ausführen von Anweisungen auf dem Mikrocontroller schneller ist als die Baudrate des SPI, kann es schneller sein, aber das ist unwahrscheinlich. Es würde eine sehr, sehr niedrige SPI-Baudrate mit einem relativ schnellen Mikrocontroller erfordern.
  • Kann eine geringere Latenz als ein SPI-Interrupt haben.
  • Wahl der Stifte.

Nachteile von Bit-Banging:

  • Benötigt viel mehr Code zur Handhabung -Baudrate-Timing -Zuverlässiges Abtasten empfangener Bits -Prozessrahmengrenzen *Jedes obige Codesegment verbraucht Zeit, die für die Ausführung von anderem Code aufgewendet werden könnte.

Vorteile von SPI:

  • Die Registerkonfiguration handhabt das Baudraten-Timing, die Abtastung empfangener Bits und die Verarbeitung von Rahmenzählern
  • Die meisten Mikrocontroller mit SPI haben einen dedizierten Interrupt-Vektor für jedes SPI-Peripheriegerät (überprüfen Sie Ihr Mikro!)
  • Nach der Konfiguration müssen Sie nur prüfen, ob der SPI-TX/RX-Puffer leer/voll ist, und ein Byte schreiben/lesen.
  • Wenn DMA verfügbar ist, kann der SPI große Puffer zusammenhängender Daten ohne jegliche Softwareinterferenz übertragen.

Nachteile von SPI:

  • Ein zusätzliches Peripheriegerät zum Erlernen und Konfigurieren (Ist das wirklich ein Nachteil?)
  • Erfordert zusätzliche Pins oder Pin-Multiplexing
  • Mehrkosten (bei aktuellen Mikrocontrollern eher vernachlässigbar)
  • Ich hatte Rauschprobleme mit SPI, aber diese waren auf Prototyp-Boards bei relativ hohen Geschwindigkeiten (10 MHz)
  • Stark eingeschränkte Pin-Auswahl

Für mich sind die Vorteile von Bit-Banging im Vergleich zu den Vorteilen von SPI gering. Die Nachteile des Bit-Banging sind viel größer als die der SPIs. Die drei Hauptgründe, die ich für die Wahl von Bit-Banging sehe, sind für

  1. Benutzerdefiniertes Low-Speed-Protokoll
  2. Wenn die Kommunikation langsam ist und der Rest der Anwendung geringe Rechenanforderungen hat
  3. Oder wenn die Kommunikation langsam ist und die Pin-Wahl ein großes Problem darstellt

Auf dem PIC benötigt eine herkömmliche Bit-Bang-Implementierung im SPI-Stil etwa fünf Zyklen pro Bit; Mit ein wenig Arbeit an 18Fxx-Teilen kann man das auf etwa vier reduzieren (auf Kosten von etwa drei Zyklen pro Byte zusätzlichen Overhead). Diese Zeit kommt zu jeder Zeit hinzu, die zum Abrufen von Daten erforderlich ist (typischerweise drei Zyklen pro Byte). Stellen Sie sich also ungefähr 40-43 Zyklen pro Byte vor. Mit dem Hardware-SPI verbessert sich die Geschwindigkeit auf zwei Zyklen pro Bit plus ein paar zusätzliche Zyklen pro Byte (einige andere können Back-to-Back-Übertragungen verarbeiten, aber die PICs, die ich gesehen habe, können dies nicht), und während der SPI ein Byte sendet der Prozessor kann das nächste abrufen, was eine Gesamtzeit von etwa 18 Zyklen/Byte erlaubt – ein Geschwindigkeitsgewinn von etwa 2,5x.

Hi. Haben Sie ein Tutorial zum Hochgeschwindigkeits-Bitbanging in der PIC-Montage? Ich versuche mein PIC-Programm zu optimieren, nach einigem Kopfkratzen habe ich die Geschwindigkeit von 5 Zyklen / Bit erreicht (Daten auf HIGH setzen, Bit testen und Daten auf LOW setzen, andernfalls überspringen, Uhr auf LOW setzen, Uhr auf HIGH stellen). Aber es wäre interessant zu sehen, wie jemand anderes es anders gemacht hätte. Ich bin auch neugierig auf die 4-Zyklen / Bit-Lösung auf dem PICF18.
Bei den meisten PICs würde ich im Allgemeinen den von Ihnen beschriebenen Fünf-Zyklen-Ansatz verwenden. Es gibt zwei Möglichkeiten, es in einigen Situationen auf vier zu verbessern: (1) entweder ein Byte berechnen, dessen Bits anzeigen, dass sich ein Bit vom vorherigen unterscheidet, und dann entweder "btfsc flipBits,_ / btf DATA_PIN, " oder "btrsc flipBits , / xorwf DATA_PORT,f" [wobei W die richtige Bitmaske enthält]. Alternativ könnte man in der Lage sein, einen Zyklus zu verkürzen, indem man entweder IORWF oder ANDWF verwendet, um gleichzeitig den Datenpin auf einen bekannten Zustand voreinzustellen und den Takt auf Leerlauf zu setzen.
Erfolg. Jetzt habe ich 4 Zyklen/Bit erreicht. Mein neues Verfahren: Laden Sie bei der Initialisierung eine Bitmaske in W, laden Sie das Byte in den gemeinsamen RAM, wählen Sie die Bank des Ports aus. Um ein Bit zu übertragen, ANDWF das Portregister und W, so dass sowohl Takte als auch Daten gleichzeitig auf LOW gesetzt werden. Testen Sie dann das Bit und überspringen Sie es entweder oder setzen Sie die Daten auf HIGH, und stellen Sie schließlich die Uhr auf HIGH. Danke für den Tipp, jetzt geht es so schnell wie es geht.

Für Bit Banging (BB) hast du vergessen zu erwähnen:

  1. Bindet den Prozessor für die Dauer der Kommunikation. (SPI lädt Register und gibt sie dann zurück, damit Sie etwas anderes tun können)
  2. Hintergrund-Interrupts können den BB-Code ernsthaft stören, was ihn nur in Single-Thread-Designs nützlich macht, denken Sie daran, dass Ihr BB-Code 100 % Aufmerksamkeit auf den Umgang mit dem Protokoll richten muss.