- Ce este Bit Banging?
- Când se utilizează Bit Banging
- Algoritm pentru comunicarea în serie prin Bit Banging
- Bit Banging peste SPI
- Exemplu de Bit Banging: comunicare SPI în Arduino
- Dezavantaje ale Bit Banging
- UART prin Bit banging în Arduino
Interfețele de comunicare sunt unul dintre factorii care sunt luați în considerare la selectarea unui microcontroler care urmează să fie utilizat pentru un proiect. Proiectantul se asigură că microcontrolerul selectat are toate interfețele necesare pentru a comunica cu toate celelalte componente care vor fi utilizate pentru produs. Existența unora dintre aceste interfețe precum SPI și I2C pe microcontroler crește invariabil costul acestor microcontrolere și, în funcție de bugetul BOM, poate face ca un microcontroler dorit să nu fie accesibil. În astfel de situații, tehnicile precum Bit Banging vin să se joace.
Ce este Bit Banging?
Bit banging-ul este o tehnică pentru comunicarea în serie, în care întregul proces de comunicare este gestionat prin software în loc de hardware dedicat. Pentru a transmite date, tehnica implică utilizarea unui software pentru a codifica datele în semnale și impulsuri care sunt utilizate pentru a manipula starea unui pin I / O al unui microcontroler care servește ca pinul Tx pentru a trimite date către dispozitivul țintă. Pentru a primi date, tehnica implică eșantionarea stării pinului Rx după anumite intervale, care este determinată de rata de transmisie în comun. Software-ul setează toți parametrii necesari pentru realizarea acestei comunicări, inclusiv sincronizarea, sincronizarea, nivelurile etc., care sunt de obicei decise de hardware dedicat atunci când nu se utilizează bangingul de biți.
Când se utilizează Bit Banging
Bit-Banging este de obicei utilizat în situații în care un microcontroler cu interfața necesară nu este disponibil sau când trecerea la un microcontroler cu interfața necesară poate fi prea costisitoare. Astfel, oferă o modalitate ieftină de a permite aceluiași dispozitiv să comunice utilizând mai multe protocoale. Un microcontroler care a fost activat anterior doar pentru comunicarea UART, poate fi echipat pentru a comunica folosind SPI și 12C prin banging de biți.
Algoritm pentru comunicarea în serie prin Bit Banging
În timp ce codul pentru implementarea bangingului de biți poate diferi între diverse microcontrolere și poate varia, de asemenea, pentru diferite protocoale seriale, dar procedura / algoritmul pentru implementarea bangingului de biți este aceeași pe toate platformele.
Pentru a trimite date, de exemplu, este utilizat pseudo-codul de mai jos;
- start
- Trimiteți bitul de început
- Așteptați ca sincronizarea să corespundă cu rata de transmisie a receptorului
- Trimiteți bitul de date
- Așteptați ca durata să corespundă din nou cu rata de transmisie a receptorului
- Verificați dacă toți biții de date au fost expediați. Dacă nu, mergeți la 4. Dacă da, mergeți la 7
- Trimiteți bitul de oprire
- Stop
Primirea datelor tinde să fie puțin mai complexă, de obicei se folosește o întrerupere pentru a determina când datele sunt disponibile pe pinul receptorului. Acest lucru vă asigură că microcontrolerul nu pierde prea multă putere de procesare. Deși anumite implementări utilizează oricare dintre pinii I / O ai microcontrolerelor, dar șansele de zgomot și erori, dacă nu sunt tratate probabil, sunt mai mari. Algoritmul pentru a primi date folosind întreruperi este explicat mai jos.
- start
- Activați întreruperea pe pinul Rx
- Când este declanșată întreruperea, obțineți bitul de pornire
- Așteptați sincronizarea în funcție de rata de transmisie
- Citiți pinul Rx
- Repetați de la 4 până când toate datele au fost primite
- Așteptați sincronizarea în funcție de rata de transmisie
- Verificați bitul de oprire
- Stop
Bit Banging peste SPI
După cum s-a menționat mai sus, bangingul de biți pentru diferite protocoale funcționează diferit și, prin urmare, este important să citiți despre fiecare protocol, să înțelegeți încadrarea datelor și ceasul înainte de a încerca să implementați. Luând ca exemplu modul SPI 1, valoarea de bază a ceasului este întotdeauna 0, iar datele sunt trimise sau primite întotdeauna pe marginea ascendentă a ceasului. Diagrama de sincronizare pentru protocolul de comunicare SPI Mode 1 este prezentată mai jos.
Pentru a implementa acest lucru, se poate utiliza următorul algoritm;
- start
- Setați pinul SS jos pentru a începe comunicarea
- Setați pinul pentru Master Out Slave In (MOSI) la primul bit al datelor de trimis
- Setați pinul de ceas (SCK) la nivel înalt, astfel încât datele să fie transmise de comandant și primite de către sclav
- Citiți starea Master in Slave Out (MISO) pentru a primi primul bit de date de la slave
- Setați SCK Low, astfel încât datele să poată fi trimise pe următoarea margine ascendentă
- Mergeți la 2 până când toți biții de date au fost transmiși.
- Setați pinul SS High pentru a opri transmisia.
- Stop
Exemplu de Bit Banging: comunicare SPI în Arduino
De exemplu, să implementăm algoritmul pentru comunicarea SPI prin bangingul de biți în Arduino pentru a arăta cum pot fi banged-urile de date prin SPI folosind codul de mai jos.
Începem prin declararea utilizării pinilor Arduino.
const int SSPin = 11; const int SCKPin = 10; const int MISOPin = 9; const int MOSIPin = 8; octet sendData = 64; // Valoare de trimis octet slaveData = 0; // pentru stocarea valorii trimise de sclav
Apoi, trecem la funcția void setup () unde este declarată starea pinilor. Numai pinul Master in Slave out (MISO) este declarat ca intrare, deoarece este singurul pin care primește date. Toți ceilalți pini sunt declarați ca ieșire. După declararea modurilor pin, pinul SS este setat la HIGH. Motivul pentru acest lucru este să ne asigurăm că procesul nu conține erori și că comunicarea începe doar atunci când este setată la nivel scăzut.
void setup () { pinMode (MISOPin, INPUT); pinMode (SSPin, OUTPUT); pinMode (SCKPin, OUTPUT); pinMode (MOSIPin, OUTPUT); digitalWrite (SSPin, HIGH); }
Apoi, începem bucla pentru a trimite date. Rețineți că această buclă va continua să trimită datele în mod repetat.
Începem bucla scriind pinul SS jos, pentru a iniția începutul comunicării și apelăm la funcția bitbangdata care rupe datele predefinite în biți și trimite. După ce am făcut acest lucru, scriem apoi pinul SS HIGH pentru a indica sfârșitul transmisiei de date.
bucla void () { digitalWrite (SSPin, LOW); // SS low slaveData = bitBangData (sendData); // transmiterea datelor digitalWrite (SSPin, HIGH); // SS înalt din nou }
Bitbangdata () funcția este scrisă mai jos. Funcția preia datele de trimis și le descompune în biți și le trimite prin looping peste codul pentru transmisie așa cum este indicat în pasul 7 al algoritmului.
byte bitBangData (byte _send) // Această funcție transmite datele prin bitbanging { byte _receive = 0; for (int i = 0; i <8; i ++) // 8 biți într-un octet { digitalWrite (MOSIPin, bitRead (_send, i)); // Setați MOSI digitalWrite (SCKPin, HIGH); // SCK high bitWrite (_receive, i, digitalRead (MISOPin)); // Captează MISO digitalWrite (SCKPin, LOW); // SCK low } return _receive; // Returnează datele primite }
Dezavantaje ale Bit Banging
Adoptarea bangingului de biți ar trebui totuși să fie o decizie bine gândită, deoarece există mai multe dezavantaje ale bangingului de biți care ar putea face ca acesta să nu fie fiabil pentru implementarea în anumite soluții. Bit banging crește puterea consumată de microcontroler datorită puterii mari de procesare consumate de proces. În comparație cu hardware-ul dedicat, mai multe erori de comunicare, cum ar fi erorile și nervozitatea, apar atunci când se utilizează bangingul de biți, în special atunci când comunicarea de date este efectuată de microcontroler în același timp cu alte sarcini. Comunicarea prin banging de biți are loc la o fracțiune din viteza cu care apare atunci când se utilizează hardware dedicat. Acest lucru poate fi important în anumite aplicații și poate face ca banging-ul să fie o alegere „nu atât de bună”.
Bit banging-ul este utilizat pentru toate tipurile de comunicații seriale, inclusiv; RS-232, Asynchronous Serial Communication, UART, SPI și I2C.
UART prin Bit banging în Arduino
Una dintre implementările populare de banging de biți este biblioteca Arduino Software Serial care permite Arduino să comunice prin UART fără a utiliza pinii UART hardware dedicați (D0 și D1). Acest lucru oferă o mulțime de flexibilitate, deoarece utilizatorii pot conecta la fel de multe dispozitive seriale pe cât le poate suporta numărul de pini de pe placa Arduino.