- Kaj je razbijanje bitov?
- Kdaj uporabiti Bit Banging
- Algoritem za serijsko komunikacijo prek bit banging
- Bit Banging prek SPI
- Primer razbijanja bitov: SPI komunikacija v Arduinu
- Slabosti razbijanja bitov
- UART prek bit bitkinga v Arduinu
Komunikacijski vmesniki so eden od dejavnikov, ki se upoštevajo pri izbiri mikrokrmilnika, ki se bo uporabljal za projekt. Oblikovalec zagotavlja, da ima izbrani mikrokrmilnik vse vmesnike, potrebne za komunikacijo z vsemi drugimi komponentami, ki se uporabljajo za izdelek. Obstoj nekaterih od teh vmesnikov, kot sta SPI in I2C na mikrokrmilniku, vedno zviša stroške takšnih mikrokrmilnikov, odvisno od proračuna BOM pa lahko želeni mikrokrmilnik postane nedosegljiv. V takih situacijah nastopijo tehnike, kot je Bit Banging.
Kaj je razbijanje bitov?
Razbijanje bitov je tehnika za serijsko komunikacijo, pri kateri se celoten komunikacijski postopek upravlja s programsko opremo namesto s posebno strojno opremo. Za prenos podatkov tehnika vključuje uporabo programske opreme za kodiranje podatkov v signale in impulze, ki se uporabljajo za manipulacijo stanja vhodno / izhodnega zatiča mikrokrmilnika, ki služi kot zatič Tx za pošiljanje podatkov ciljni napravi. Za sprejem podatkov tehnika vključuje vzorčenje stanja Rx zatiča po določenih intervalih, ki je določena s hitrostjo komunikacijskih baudov. Programska oprema nastavi vse parametre, potrebne za dosego te komunikacije, vključno s sinhronizacijo, časom, nivoji itd., Za katere običajno odloča namenska strojna oprema, kadar se ne uporablja udarjanje bitov.
Kdaj uporabiti Bit Banging
Bit-Banging se običajno uporablja v primerih, ko mikrokrmilnik z zahtevanim vmesnikom ni na voljo ali če je preklop na mikrokrmilnik z zahtevanim vmesnikom predrag. Tako omogoča poceni način, da isti napravi omogoča komunikacijo z več protokoli. Mikrokrmilnik, ki je bil predhodno omogočen samo za komunikacijo UART, je lahko opremljen za komunikacijo s pomočjo SPI in 12C s pomočjo bita.
Algoritem za serijsko komunikacijo prek bit banging
Medtem ko se koda za izvajanje razbijanja bitov lahko razlikuje med različnimi mikrokrmilniki in se lahko razlikuje tudi za različne serijske protokole, vendar je postopek / algoritem za izvajanje razbijanja bitov enak na vseh platformah.
Za pošiljanje podatkov se na primer uporablja spodnja psevdo-koda;
- Začni
- Pošlji začetni bit
- Počakajte, da se čas ujema s hitrostjo prenosa sprejemnika
- Pošlji bit podatkov
- Počakajte, da trajanje spet ustreza hitrosti prenosa sprejemnika
- Preverite, ali so bili poslani vsi podatkovni biti. Če ne, pojdite na 4. Če je odgovor da, pojdite na 7
- Pošlji stop bit
- Nehaj
Prejemanje podatkov je ponavadi nekoliko bolj zapleteno, običajno se s prekinitvijo ugotovi, kdaj so podatki na voljo na zatiču sprejemnika. To pomaga zagotoviti, da mikrokrmilnik ne izgublja preveč procesorske moči. Čeprav nekatere izvedbe uporabljajo katerega koli od vhodno / izhodnih zatičev mikrokrmilnikov, pa je verjetnost šuma in napak, če jih verjetno ne obravnavamo, večja. Algoritem za sprejemanje podatkov s prekinitvami je razložen spodaj.
- Začni
- Omogoči prekinitev na zatiču Rx
- Ko se sproži prekinitev, pridobite začetni bit
- Počakajte na čas glede na hitrost prenosa
- Preberite pin Rx
- Ponavljajte od 4. do prejema vseh podatkov
- Počakajte na čas glede na hitrost prenosa
- Preverite, ali je zaustavitveni bit
- Nehaj
Bit Banging prek SPI
Kot smo že omenili, razbijanje bitov za različne protokole deluje različno, zato je pomembno, da preberete vsak protokol, da razumete uokvirjanje in urejanje podatkov, preden poskusite izvesti. Če za primer vzamemo način SPI 1, je osnovna vrednost ure vedno 0, podatki pa so vedno poslani ali prejeti na naraščajočem robu ure. Časovni diagram za komunikacijski protokol SPI Mode 1 je prikazan spodaj.
Za izvedbo tega lahko uporabimo naslednji algoritem;
- Začni
- Za začetek komunikacije nastavite SS pin nizko
- Nastavite pin za Master Out Slave In (MOSI) na prvi bit podatkov, ki jih želite poslati
- Nastavite zatič ure (SCK) visoko, tako da poveljnik posreduje podatke, podrejeni pa jih sprejme
- Preberite stanje Master in Slave Out (MISO), da prejmete prvi bit podatkov iz slave
- Nastavite SCK Low, tako da lahko podatke pošljete na naslednji naraščajoči rob
- Pojdite na 2, dokler niso poslani vsi podatkovni biti.
- Nastavite SS pin High, da ustavite prenos.
- Nehaj
Primer razbijanja bitov: SPI komunikacija v Arduinu
Kot primer naj implementiramo algoritem za komunikacijo SPI z razbijanjem bitov v Arduinu, da pokažemo, kako lahko podatke s pomočjo spodnje kode razbijemo prek SPI.
Začnemo z razglasitvijo zatičev Arduino za uporabo.
const int SSPin = 11; const int SCKPin = 10; const int MISOPin = 9; const int MOSIPin = 8; bajt sendData = 64; // Vrednost, ki jo bo poslal bajt slaveData = 0; // za shranjevanje vrednosti, ki jo je poslal suženj
Nato preidemo na funkcijo void setup (), kjer je navedeno stanje nožic. Kot vhod je prijavljen samo zatič Master in Slave out (MISO), ker je edini zatič, ki sprejema podatke. Vsi drugi zatiči so prijavljeni kot izhodni. Po razglasitvi načinov zatičev je SS pin nastavljen na HIGH. Razlog za to je zagotoviti postopek brez napak in komunikacija se začne šele, ko je nastavljena na nizko.
void setup () { pinMode (MISOPin, INPUT); pinMode (SSPin, IZHOD); pinMode (SCKPin, IZHOD); pinMode (MOSIPin, IZHOD); digitalWrite (SSPin, HIGH); }
Nato zaženemo zanko za pošiljanje podatkov. Upoštevajte, da bo ta zanka še naprej večkrat pošiljala podatke.
Zanko začnemo tako, da pišemo SS pin nizko, da sprožimo začetek komunikacije, in pokličemo funkcijo bitbangdata, ki vnaprej določene podatke razbije v bite in pošlje. Ko to storimo, nato zapišemo SS pin HIGH, da označimo konec prenosa podatkov.
void loop () { digitalWrite (SSPin, LOW); // SS nizki slaveData = bitBangData (sendData); // prenos podatkov digitalWrite (SSPin, HIGH); // SS spet visoko }
Bitbangdata () funkcija je napisana spodaj. Funkcija zavzame podatke, ki jih je treba poslati, in jih razdeli na bitove ter jih pošlje z zanko po kodi za prenos, kot je navedeno v 7. koraku algoritma.
byte bitBangData (byte _send) // Ta funkcija posreduje podatke prek bitbanging { byte _receive = 0; for (int i = 0; i <8; i ++) // 8 bitov v bajtu { digitalWrite (MOSIPin, bitRead (_send, i)); // Nastavitev MOSI digitalWrite (SCKPin, HIGH); // SCK high bitWrite (_receive, i, digitalRead (MISOPin)); // zajem MISO digitalWrite (SCKPin, LOW); // SCK nizka } return _receive; // Vrni prejete podatke }
Slabosti razbijanja bitov
Sprejetje razbijanja bitov pa bi moralo biti premišljena odločitev, saj ima razbijanje bitov nekaj slabosti, zaradi katerih ni zanesljivo za izvajanje v nekaterih rešitvah. Razbijanje bitov poveča moč, ki jo porabi mikrokrmilnik zaradi velike procesorske moči, ki jo porabi postopek. V primerjavi s posebno strojno opremo se pri napajanju bitov pojavi več komunikacijskih napak, kot so napake in tresenja, zlasti kadar mikrokrmilnik hkrati z drugimi nalogami izvaja podatkovno komunikacijo. Komunikacija z udarci bitov se zgodi z delno hitrostjo, s katero se zgodi, ko se uporablja namenska strojna oprema. To je lahko pomembno pri nekaterih aplikacijah in morda razbijanje bitov postane "ne tako dobra" izbira.
Razbijanje bitov se uporablja za vse vrste serijskih komunikacij, vključno z; RS-232, Asinhrona serijska komunikacija, UART, SPI in I2C.
UART prek bit bitkinga v Arduinu
Ena izmed priljubljenih izvedb razbijanja bitov je serijska knjižnica programske opreme Arduino, ki Arduinu omogoča komunikacijo prek UART-a brez uporabe namenskih strojnih zatičev UART (D0 in D1). To daje veliko prilagodljivosti, saj lahko uporabniki priključijo toliko serijskih naprav, kolikor jih podpira število nožic na plošči Arduino.