Hauptmenü öffnen

Unter Bit-Banging versteht man eine Technik, die mittels Software und I/O-Leitungen eine Hardware-Schnittstelle emuliert, die gewöhnlich mit einem spezifischen Peripherie-Baustein realisiert wird. Auf einem PC können sowohl die serielle als auch die parallele Schnittstelle genutzt werden. Bei Mikrocontrollern nutzt man die I/O-Pins.

Das Bit-Banging-Verfahren kann dann sinnvoll sein, wenn eine bestimmte Schnittstelle nicht in Hardware vorhanden ist, z. B. hat kein Standard-PC ein SPI, oder wenn bei Mikrocontrollern eine Ressource bereits belegt ist. Besonders häufig dient Bit-Banging der Kosteneinsparung durch Ersetzen relativ teurer Peripheriebausteine.

Eine Vielzahl von Schnittstellen kann durch Bit-Banging emuliert werden. Hier einige Beispiele:

Entsprechend der Komplexität des Schnittstellen-Protokolls kommen unterschiedliche Methoden zum Einsatz. Die einfachste Art ist das Polling. Der Prozessor fragt, so oft er kann, Änderungen an den I/O-Leitungen ab. Ist ein bestimmtes Zeitverhalten einzuhalten, benutzt man Warteschleifen oder Timer-Funktionen. Die Nutzung der Interrupt-Leitungen reduziert weiter die Prozessorauslastung. Speziell zur Erzeugung eines PWM-Signals dienen häufig die direkten Timer-Ausgänge. Trickreich ist die Aufwertung einer einfacheren Schnittstelle zu einem komplexen Protokoll.

Nachteile des Bit-Bangings sind die hohe Prozessorauslastung, der erhöhte Softwareaufwand und meist starkes Jitter beim Zeitverhalten. Einige Schnittstellen, etwa SPI, sind dagegen immun, andere, etwa UART, haben strikte Zeitforderungen.

Programmbeispiel in CBearbeiten

Im folgenden Fragment in der Programmiersprache C ist der Sendeteil einer synchronen seriellen Schnittstelle (SPI) mittels Bit-Banging dargestellt. Die I/O-Pins sind als SD_CS (Chip Select), SD_DI (Data) und als SD_CLK (Clock) bezeichnet.

// transmit byte serially, MSB first
void send_8bit_serial_data(unsigned char data)
{
   int i;

   // select device
   output_high(SD_CS);

   // send bits 7..0
   for (i = 0; i < 8; i++)
   {
       // consider leftmost bit
       // set line high if bit is 1, low if bit is 0
       if (data & 0x80)
           output_high(SD_DI);
       else
           output_low(SD_DI);

       // pulse clock to indicate that bit value should be read
       output_low(SD_CLK);
       output_high(SD_CLK);

       // shift byte left so next bit will be leftmost
       data <<= 1;
   }

   // deselect device
   output_low(SD_CS);
}

WeblinksBearbeiten