- Was ist Bit Banging?
- Wann wird Bit Banging verwendet?
- Algorithmus für die serielle Kommunikation über Bit Banging
- Bit Banging über SPI
- Beispiel für Bit Banging: SPI-Kommunikation in Arduino
- Nachteile von Bit Banging
- UART über Bit Banging in Arduino
Kommunikationsschnittstellen sind einer der Faktoren, die bei der Auswahl eines Mikrocontrollers für ein Projekt berücksichtigt werden. Der Designer stellt sicher, dass der ausgewählte Mikrocontroller über alle Schnittstellen verfügt, die für die Kommunikation mit allen anderen für das Produkt zu verwendenden Komponenten erforderlich sind. Das Vorhandensein einiger dieser Schnittstellen wie SPI und I2C auf einem Mikrocontroller erhöht ausnahmslos die Kosten solcher Mikrocontroller, und je nach Stücklistenbudget kann dies dazu führen, dass ein gewünschter Mikrocontroller nicht erschwinglich wird. In solchen Situationen kommen Techniken wie Bit Banging ins Spiel.
Was ist Bit Banging?
Bit Banging ist eine Technik für die serielle Kommunikation, bei der der gesamte Kommunikationsprozess über Software anstelle von dedizierter Hardware abgewickelt wird. Um Daten zu übertragen, beinhaltet die Technik die Verwendung von Software, um die Daten in Signale und Impulse zu codieren, die verwendet werden, um den Zustand eines E / A-Pins eines Mikrocontrollers zu manipulieren, der als Tx-Pin zum Senden von Daten an das Zielgerät dient. Um Daten zu empfangen, umfasst die Technik das Abtasten des Zustands des Rx-Pins nach bestimmten Intervallen, die durch die Kommunikationsbaudrate bestimmt werden. Die Software legt alle Parameter fest, die für diese Kommunikation erforderlich sind, einschließlich Synchronisation, Timing, Pegel usw., die normalerweise von dedizierter Hardware festgelegt werden, wenn kein Bit-Banging verwendet wird.
Wann wird Bit Banging verwendet?
Bit-Banging wird normalerweise in Situationen verwendet, in denen ein Mikrocontroller mit der erforderlichen Schnittstelle nicht verfügbar ist oder wenn der Wechsel zu einem Mikrocontroller mit der erforderlichen Schnittstelle zu teuer sein kann. Es bietet somit eine kostengünstige Möglichkeit, dass dasselbe Gerät über mehrere Protokolle kommunizieren kann. Ein Mikrocontroller, der zuvor nur für die UART-Kommunikation aktiviert war, kann für die Kommunikation über SPI und 12C über Bit Banging ausgestattet werden.
Algorithmus für die serielle Kommunikation über Bit Banging
Während der Code zum Implementieren von Bit Banging zwischen verschiedenen Mikrocontrollern unterschiedlich sein kann und auch für verschiedene serielle Protokolle variieren kann, ist das Verfahren / der Algorithmus zum Implementieren von Bit Banging auf allen Plattformen gleich.
Zum Senden von Daten wird beispielsweise der folgende Pseudocode verwendet.
- Start
- Startbit senden
- Warten Sie, bis das Timing der Baudrate des Empfängers entspricht
- Datenbit senden
- Warten Sie, bis die Dauer wieder der Baudrate des Empfängers entspricht
- Überprüfen Sie, ob alle Datenbits gesendet wurden. Wenn nein, gehe zu 4. Wenn ja, gehe zu 7
- Stoppbit senden
- Halt
Das Empfangen von Daten ist in der Regel etwas komplexer. In der Regel wird ein Interrupt verwendet, um festzustellen, wann Daten am Empfänger-Pin verfügbar sind. Dies stellt sicher, dass der Mikrocontroller nicht zu viel Rechenleistung verschwendet. Obwohl bestimmte Implementierungen einen der E / A-Pins des Mikrocontrollers verwenden, ist die Wahrscheinlichkeit von Rauschen und Fehlern höher, wenn sie nicht wahrscheinlich behandelt werden. Der Algorithmus zum Empfangen von Daten unter Verwendung von Interrupts wird unten erläutert.
- Start
- Interrupt am Rx-Pin aktivieren
- Wenn ein Interrupt ausgelöst wird, erhalten Sie das Startbit
- Warten Sie auf das Timing entsprechend der Baudrate
- Lesen Sie den Rx-Pin
- Wiederholen Sie von 4 bis alle Daten empfangen wurden
- Warten Sie auf das Timing entsprechend der Baudrate
- Auf Stoppbit prüfen
- Halt
Bit Banging über SPI
Wie oben erwähnt, funktioniert das Bit-Banging für verschiedene Protokolle unterschiedlich. Daher ist es wichtig, jedes Protokoll zu lesen, um das Framing und die Taktung von Daten zu verstehen, bevor Sie versuchen, es zu implementieren. Am Beispiel des SPI-Modus 1 ist der Basiswert des Takts immer 0 und Daten werden immer an der ansteigenden Flanke des Takts gesendet oder empfangen. Das Zeitdiagramm für das SPI-Modus 1-Kommunikationsprotokoll ist unten gezeigt.
Um dies zu implementieren, kann der folgende Algorithmus verwendet werden;
- Start
- Setzen Sie den SS-Pin auf niedrig, um die Kommunikation zu starten
- Setzen Sie den Pin für Master Out Slave In (MOSI) auf das erste Bit der zu sendenden Daten
- Stellen Sie den Clock Pin (SCK) hoch, damit die Daten vom Master gesendet und vom Slave empfangen werden
- Lesen Sie den Status des Master in Slave Out (MISO), um das erste Datenbit vom Slave zu empfangen
- Stellen Sie SCK Low ein, damit Daten bei der nächsten ansteigenden Flanke gesendet werden können
- Gehen Sie zu 2, bis alle Datenbits übertragen wurden.
- Stellen Sie den SS-Pin auf High, um die Übertragung zu stoppen.
- Halt
Beispiel für Bit Banging: SPI-Kommunikation in Arduino
Als Beispiel implementieren wir den Algorithmus für die SPI-Kommunikation über Bitbanging in Arduino, um zu zeigen, wie Daten mithilfe des folgenden Codes über SPI bitgeschlagen werden können.
Wir beginnen damit , die zu verwendenden Stifte des Arduino zu deklarieren.
const int SSPin = 11; const int SCKPin = 10; const int MISOPin = 9; const int MOSIPin = 8; Byte sendData = 64; // Zu sendender Wert Byte SlaveData = 0; // zum Speichern des vom Slave gesendeten Wertes
Als nächstes wechseln wir zur Funktion void setup () , in der der Status der Pins deklariert wird. Nur der MISO-Pin (Master in Slave out) wird als Eingang deklariert, da er der einzige Pin ist, der Daten empfängt. Alle anderen Pins werden als Ausgang deklariert. Nach dem Deklarieren der Pin-Modi wird der SS-Pin auf HIGH gesetzt. Der Grund dafür ist, sicherzustellen, dass der Prozess fehlerfrei ist und die Kommunikation erst beginnt, wenn er auf niedrig eingestellt ist.
void setup () { pinMode (MISOPin, INPUT); pinMode (SSPin, OUTPUT); pinMode (SCKPin, OUTPUT); PinMode (MOSIPin, OUTPUT); digitalWrite (SSPin, HIGH); }}
Als nächstes starten wir die Schleife , um Daten zu senden. Beachten Sie, dass diese Schleife die Daten wiederholt sendet.
Wir starten die Schleife, indem wir den SS-Pin auf Low schreiben, um den Beginn der Kommunikation einzuleiten, und rufen die Bitbangdata- Funktion auf, die die vordefinierten Daten in Bits zerlegt und sendet. Anschließend schreiben wir den SS-Pin HIGH, um das Ende der Datenübertragung anzuzeigen.
void loop () { digitalWrite (SSPin, LOW); // SS low SlaveData = bitBangData (sendData); // Datenübertragung digitalWrite (SSPin, HIGH); // SS wieder hoch }
Die Funktion bitbangdata () ist unten beschrieben. Die Funktion nimmt die zu sendenden Daten auf, zerlegt sie in Bits und sendet sie weiter, indem sie den Code für die Übertragung durchläuft, wie in Schritt 7 des Algorithmus angegeben.
Byte bitBangData (Byte _send) // Diese Funktion überträgt die Daten über Bitbanging { Byte _receive = 0; für (int i = 0; i <8; i ++) // 8 Bits in einem Byte { digitalWrite (MOSIPin, bitRead (_send, i)); // Setze MOSI digitalWrite (SCKPin, HIGH); // SCK high bitWrite (_receive, i, digitalRead (MISOPin)); // MISO digitalWrite erfassen (SCKPin, LOW); // SCK niedrig } return _receive; // Empfangene Daten zurückgeben }
Nachteile von Bit Banging
Die Einführung von Bit Banging sollte jedoch eine gut durchdachte Entscheidung sein, da Bit Banging mehrere Nachteile hat, die es für die Implementierung in bestimmten Lösungen möglicherweise nicht zuverlässig machen. Bit-Banging erhöht den vom Mikrocontroller verbrauchten Strom aufgrund der hohen vom Prozess verbrauchten Rechenleistung. Im Vergleich zu dedizierter Hardware treten mehr Kommunikationsfehler wie Störungen und Jitter auf, wenn Bit Banging verwendet wird, insbesondere wenn die Datenkommunikation vom Mikrocontroller gleichzeitig mit anderen Aufgaben ausgeführt wird. Die Kommunikation über Bit Banging erfolgt mit einem Bruchteil der Geschwindigkeit, mit der sie bei Verwendung dedizierter Hardware auftritt. Dies kann in bestimmten Anwendungen wichtig sein und dazu führen, dass Bit Banging zu einer „nicht so guten“ Wahl wird.
Bit Banging wird für alle Arten der seriellen Kommunikation verwendet, einschließlich; RS-232, Asynchrone serielle Kommunikation, UART, SPI und I2C.
UART über Bit Banging in Arduino
Eine der beliebtesten Implementierungen von Bit Banging ist die Arduino Software Serial Library, mit der Arduino über UART kommunizieren kann, ohne die dedizierten Hardware-UART-Pins (D0 und D1) zu verwenden. Dies bietet viel Flexibilität, da Benutzer so viele serielle Geräte anschließen können, wie die Anzahl der Pins auf der Arduino-Karte unterstützen kann.