- Què és Bit Banging?
- Quan s’ha d’utilitzar Bit Banging
- Algorisme per a la comunicació en sèrie mitjançant Bit Banging
- Bit bang per SPI
- Exemple de Bit Banging: comunicació SPI a Arduino
- Desavantatges de Bit Banging
- UART mitjançant Bit banging a Arduino
Les interfícies de comunicació són un dels factors que es tenen en compte a l’hora de seleccionar un microcontrolador que s’utilitzarà per a un projecte. El dissenyador assegura que el microcontrolador seleccionat té totes les interfícies necessàries per comunicar-se amb la resta de components que s’utilitzaran per al producte. L'existència d'algunes d'aquestes interfícies com SPI i I2C en microcontroladors augmenta invariablement el cost d'aquests microcontroladors i, segons el pressupost de la llista de materials, pot fer que el microcontrolador desitjat no sigui assequible. En situacions com aquestes, les tècniques com Bit Banging entren en joc.
Què és Bit Banging?
El bit banging és una tècnica per a la comunicació en sèrie en la qual tot el procés de comunicació es gestiona mitjançant un programari en lloc de maquinari dedicat. Per transmetre dades, la tècnica implica l’ús de programari per codificar les dades en senyals i polsos que s’utilitzen per manipular l’estat d’un pin d’E / S d’un microcontrolador que serveix de pin Tx per enviar dades al dispositiu de destinació. Per rebre dades, la tècnica consisteix a fer un mostreig de l’estat del pin Rx després de certs intervals que està determinat per la velocitat en bauds de comunicació. El programari defineix tots els paràmetres necessaris per aconseguir aquesta comunicació, inclosa la sincronització, la sincronització, els nivells, etc., que solen decidir el maquinari dedicat quan no s’utilitza el bloqueig de bits.

Quan s’ha d’utilitzar Bit Banging
El bit-bang s’utilitza normalment en situacions en què no hi ha disponible un microcontrolador amb la interfície requerida o quan canviar a un microcontrolador amb la interfície requerida pot resultar massa costós. Per tant, proporciona una manera econòmica de permetre que el mateix dispositiu es comuniqui mitjançant diversos protocols. Un microcontrolador que prèviament estava habilitat només per a la comunicació UART es pot equipar per comunicar-se mitjançant SPI i 12C mitjançant banging.
Algorisme per a la comunicació en sèrie mitjançant Bit Banging
Tot i que el codi per implementar el banging de bits pot diferir entre diversos microcontroladors i també pot variar per a diferents protocols en sèrie, però el procediment / algorisme per implementar el banging de bits és el mateix en totes les plataformes.
Per enviar dades, per exemple, s'utilitza el pseudocodi següent;
- Començar
- Envia bit inicial
- Espereu que el temps coincideixi amb la velocitat en bauds del receptor
- Envia bit de dades
- Espereu que la durada es correspongui de nou amb la velocitat en bauds del receptor
- Comproveu si s’han enviat tots els bits de dades. Si no, aneu a 4. Si és així, aneu al 7
- Envia bit de parada
- Atura
La recepció de dades tendeix a ser una mica més complexa, normalment s’utilitza una interrupció per determinar quan hi ha dades disponibles al pin del receptor. Això ajuda a garantir que el microcontrolador no perdi massa energia de processament. Tot i que certes implementacions utilitzen qualsevol dels pins d'E / S dels microcontroladors, les probabilitats de soroll i errors, si no és que probablement es manegen, són més altes. A continuació s’explica l’algorisme per rebre dades mitjançant interrupcions.
- Començar
- Activa la interrupció al pin Rx
- Quan s'activa la interrupció, obteniu el bit d'inici
- Espereu la sincronització segons la velocitat de transmissió
- Llegiu el pin Rx
- Repetiu des de 4 fins que s'hagin rebut totes les dades
- Espereu la sincronització segons la velocitat de transmissió
- Comproveu si hi ha un bit d’aturada
- Atura
Bit bang per SPI
Com es va esmentar anteriorment, el bit banging per a diferents protocols funciona de manera diferent i, per tant, és important llegir sobre cada protocol, entendre l’enquadrament de les dades i el rellotge de dades abans d’intentar implementar-lo. Prenent com a exemple el mode SPI 1, el valor base del rellotge sempre és 0 i les dades sempre s’envien o reben a la vora ascendent del rellotge. A continuació es mostra el diagrama de temps per al protocol de comunicació SPI Mode 1.

Per implementar això, es pot utilitzar l'algorisme següent;
- Començar
- Establiu el pin SS per començar la comunicació
- Establiu el PIN per a Master Out Slave In (MOSI) al primer bit de les dades que s’enviaran
- Ajusteu el pin del rellotge (SCK) per tal que les dades siguin transmeses pel mestre i rebudes per l’esclau
- Llegiu l'estat del Master in Slave Out (MISO) per rebre el primer bit de dades de l'esclau
- Establiu SCK Low perquè les dades es puguin enviar a la següent pujada
- Aneu a 2 fins que s'hagin transmès tots els bits de dades.
- Configureu el pin SS High per aturar la transmissió.
- Atura
Exemple de Bit Banging: comunicació SPI a Arduino
Com a exemple, implementem l'algoritme per a la comunicació SPI mitjançant bit banging a Arduino per mostrar com es poden bloquejar les dades mitjançant SPI mitjançant el codi següent.
Comencem declarant que s’utilitzaran els pins de l’Arduino.
const int SSPin = 11; const int SCKPin = 10; const int MISOPin = 9; const int MOSIPin = 8; byte sendData = 64; // Valor a enviar per byte slaveData = 0; // per emmagatzemar el valor enviat per l'esclau
A continuació, passem a la funció void setup () on es declara l'estat dels pins. Només es declara com a entrada el pin Master in Slave out (MISO), ja que és l’únic pin que rep dades. La resta de pins es declaren com a sortida. Després de declarar els modes pin, el pin SS es defineix a HIGH. El motiu d'això és assegurar-se que el procés no té errors i que la comunicació només s'inicia quan s'estableix a baixa.
void setup () { pinMode (MISOPin, INPUT); pinMode (SSPin, OUTPUT); pinMode (SCKPin, OUTPUT); pinMode (MOSIPin, OUTPUT); digitalWrite (SSPin, HIGH); }
A continuació, iniciem el bucle per enviar dades. Tingueu en compte que aquest bucle continuarà enviant les dades repetidament.
Comencem el bucle escrivint el pin SS baix, per iniciar el començament de la comunicació, i fem una crida a la funció bitbangdata que trenca les dades predefinides en bits i les envia. Fet això, escrivim el pin SS HIGH per indicar el final de la transmissió de dades.
bucle buit () { digitalWrite (SSPin, LOW); // SSData esclau = bitBangData (sendData); // transmissió de dades digitalWrite (SSPin, HIGH); // SS alt de nou }
A continuació s’escriu la funció bitbangdata () . La funció inclou les dades que s’envien i les descomponen en bits i les envien fent un bucle sobre el codi per a la transmissió tal com s’indica al pas 7 de l’algorisme.
byte bitBangData (byte _send) // Aquesta funció transmet les dades mitjançant bitbanging { byte _receive = 0; for (int i = 0; i <8; i ++) // 8 bits en un byte { digitalWrite (MOSIPin, bitRead (_send, i)); // Estableix MOSI digitalWrite (SCKPin, HIGH); // SCK high bitWrite (_receive, i, digitalRead (MISOPin)); // Captura MISO digitalWrite (SCKPin, LOW); // SCK low } return _receive; // Torna les dades rebudes }
Desavantatges de Bit Banging
L’adopció de xocs de bits hauria de ser, però, una decisió ben pensada, ja que hi ha diversos inconvenients en el xoc de bits que poden fer que no sigui fiable per a la seva implementació en determinades solucions. Els cops de bits augmenten la potència consumida pel microcontrolador a causa de l’elevada potència de processament consumida pel procés. En comparació amb el maquinari dedicat, es produeixen més errors de comunicació, com ara fallades i nerviosisme, quan s’utilitza un cop de bits, especialment quan el microcontrolador realitza la comunicació de dades al mateix temps que altres tasques. La comunicació mitjançant xocs de bits es produeix a una fracció de la velocitat amb què es produeix quan s’utilitza maquinari dedicat. Això pot ser important en determinades aplicacions i pot convertir el bit banging en una opció "no tan bona".
El bit banging s'utilitza per a tot tipus de comunicacions en sèrie, incloses; RS-232, Comunicació en sèrie asíncrona, UART, SPI i I2C.
UART mitjançant Bit banging a Arduino
Una de les implementacions més populars de bit banging és la biblioteca de programari Arduino que permet a Arduino comunicar-se mitjançant UART sense utilitzar els pins UART de maquinari dedicats (D0 i D1). Això proporciona molta flexibilitat, ja que els usuaris poden connectar tants dispositius de sèrie com admeti el nombre de pins de la placa Arduino.
