- Mikä on Bit Banging?
- Milloin käyttää Bit Bangingia
- Algoritmi sarjamuotoiseen tiedonsiirtoon bittihakemisen kautta
- Hieman hakkaa SPI: n yli
- Esimerkki Bit Banging: SPI-viestinnästä Arduinossa
- Bit Bangingin haitat
- UART kautta Bit banging Arduinossa
Tiedonsiirtoliitännät ovat yksi tekijöistä, jotka otetaan huomioon valittaessa projektissa käytettävää mikro-ohjainta. Suunnittelija varmistaa, että valitulla mikrokontrollerilla on kaikki liitännät, joita tarvitaan yhteydenpitoon kaikkien muiden tuotteessa käytettävien komponenttien kanssa. Joidenkin näiden rajapintojen, kuten SPI: n ja I2C: n, olemassaolo mikro-ohjaimessa kasvattaa poikkeuksetta tällaisten mikro-ohjaimien kustannuksia, ja BOM-budjetista riippuen se voi tehdä toivotusta mikro-ohjaimesta ei kohtuuhintaisen. Tällaisissa tilanteissa tekniikat, kuten Bit Banging, tulevat pelaamaan.
Mikä on Bit Banging?
Bittien hakkaaminen on sarjaliikenteen tekniikka, jossa koko viestintäprosessi hoidetaan ohjelmiston kautta erillisen laitteiston sijaan. Datan lähettämiseksi tekniikka käsittää ohjelmiston käytön tietojen koodaamiseksi signaaleiksi ja pulsseiksi, joita käytetään mikrokontrollerin I / O-nastan tilan manipulointiin, joka toimii Tx-nastana tietojen lähettämiseksi kohdelaitteelle. Datan vastaanottamiseksi tekniikka käsittää näytteenoton Rx-nastan tilasta tiettyjen aikavälien jälkeen, jotka määritetään tiedonsiirtonopeudella. Ohjelmisto asettaa kaikki tarvittavat parametrit tämän tiedonsiirron aikaansaamiseksi, mukaan lukien synkronointi, ajoitus, tasot jne., Joista yleensä päättää erillinen laitteisto, kun bittipanosta ei käytetä.
Milloin käyttää Bit Bangingia
Bit-Bangingia käytetään yleensä tilanteissa, joissa mikro-ohjainta, jolla on vaadittu liitäntä, ei ole saatavana tai kun siirtyminen mikro-ohjaimeen vaaditulla liitännällä voi olla liian kallista. Se tarjoaa siten halvan tavan antaa saman laitteen kommunikoida useiden protokollien avulla. Mikrokontrolleri, joka on aiemmin otettu käyttöön vain UART-tiedonsiirtoa varten, voidaan varustaa kommunikoimaan SPI: n ja 12C: n avulla bittipuristuksella.
Algoritmi sarjamuotoiseen tiedonsiirtoon bittihakemisen kautta
Vaikka bittien hakkaamisen toteuttamiskoodi voi olla erilainen eri mikrokontrollereissa ja se voi myös vaihdella eri sarjaprotokollien välillä, mutta menettely / algoritmi bittien hakkaamisen toteuttamiseksi on sama kaikissa alustoissa.
Tietojen lähettämiseen käytetään esimerkiksi alla olevaa pseudokoodia;
- alkaa
- Lähetä aloitusbitti
- Odota, että ajoitus vastaa vastaanottimen baudinopeutta
- Lähetä databitti
- Odota, että kesto vastaa uudelleen vastaanottimen baudinopeutta
- Tarkista, onko kaikki databitit lähetetty. Jos ei, siirry kohtaan 4. Jos kyllä, jatka 7
- Lähetä lopetusbitti
- Lopettaa
Datan vastaanottaminen on yleensä hieman monimutkaisempaa, yleensä keskeytystä käytetään määrittämään, milloin tietoja on saatavilla vastaanottimen tapilla. Tämä auttaa varmistamaan, että mikro-ohjain ei tuhlaa liikaa prosessointitehoa. Vaikka tietyt toteutukset käyttävät mitä tahansa mikro-ohjaimen I / O-nastaa, mutta melun ja virheiden mahdollisuus, ellei niitä todennäköisesti käsitellä, on suurempi. Algoritmi datan vastaanottamiseksi keskeytyksillä selitetään alla.
- alkaa
- Ota keskeytys käyttöön Rx-nastassa
- Kun keskeytys laukaistaan, hanki aloitusbitti
- Odota ajoitusta siirtonopeuden mukaan
- Lue Rx-tappi
- Toista vaiheesta 4, kunnes kaikki tiedot on vastaanotettu
- Odota ajoitusta siirtonopeuden mukaan
- Tarkista pysäytyskärki
- Lopettaa
Hieman hakkaa SPI: n yli
Kuten edellä mainittiin, erilaisten protokollien bittinen paukutus toimii eri tavalla, ja siksi on tärkeää lukea jokaisesta protokollasta, ymmärtää datan kehystys ja kello ennen kuin yrität toteuttaa. Otetaan esimerkkinä SPI-tila 1, kellon perusarvo on aina 0 ja tietoja lähetetään tai vastaanotetaan aina kellon nousevalla reunalla. SPI Mode 1 -yhteysprotokollan ajoituskaavio on esitetty alla.
Tämän toteuttamiseksi voidaan käyttää seuraavaa algoritmia;
- alkaa
- Aseta SS-nasta matalalle aloittaaksesi viestinnän
- Aseta Master Out Slave In (MOSI) -tappi ensimmäiseksi lähetettäväksi dataksi
- Aseta kellotappi (SCK) korkealle, jotta isäntä lähettää ja orja vastaanottaa tietoja
- Lue isännän tila Slave Out -tilassa (MISO) saadaksesi ensimmäisen bitin tietoja orjalta
- Aseta SCK Low, jotta tietoja voidaan lähettää seuraavalle nousevalle reunalle
- Siirry kohtaan 2, kunnes kaikki databitit on lähetetty.
- Aseta SS-tappi korkealle lopettaaksesi lähetyksen.
- Lopettaa
Esimerkki Bit Banging: SPI-viestinnästä Arduinossa
Otetaan esimerkkinä käyttöön SPI-viestinnän algoritmi bittipuristamisen avulla Arduinossa osoittaaksemme, kuinka tietoja voidaan bittihiottu SPI: n avulla alla olevan koodin avulla.
Aloitamme julistamalla Arduinon nastat käytettäviksi.
const int SSPin = 11; const int SCKPin = 10; const int MISOPin = 9; const int MOSIPin = 8; tavu sendData = 64; // Lähetettävä arvo tavu slaveData = 0; // orjan lähettämän arvon tallentamiseksi
Seuraavaksi siirrymme void setup () -toimintoon, jossa nastojen tila ilmoitetaan. Vain Master in Slave out (MISO) -tappi ilmoitetaan tulona, koska se on ainoa nasta, joka vastaanottaa tietoja. Kaikki muut nastat ilmoitetaan tuotoksena. Nastatilojen ilmoittamisen jälkeen SS-tappi asetetaan arvoon HIGH. Syynä tähän on varmistaa, että prosessi on virheetön ja viestintä alkaa vasta, kun se on asetettu matalalle.
void setup () { pinMode (MISOPin, INPUT); pinMode (SSPin, OUTPUT); pinMode (SCKPin, OUTPUT); pinMode (MOSIPin, OUTPUT); digitalWrite (SSPin, HIGH); }
Seuraavaksi aloitamme silmukan tietojen lähettämiseksi. Huomaa, että tämä silmukka lähettää tietoja jatkuvasti.
Aloitamme silmukan kirjoittamalla SS-nastan matalalle, aloittaaksemme tiedonsiirron alkamisen, ja kutsumme käyttöön bitbangdata- toiminnon, joka hajottaa ennalta määritellyt tiedot bitteiksi ja lähettää. Kun tämä on tehty, kirjoitetaan sitten SS-tappi HIGH osoittamaan tiedonsiirron loppua.
void loop () { digitalWrite (SSPin, LOW); // SS low slaveData = bitBangData (sendData); // tiedonsiirto digitalWrite (SSPin, HIGH); // SS taas korkea }
Bitbangdata () funktio on kirjoitettu alla. Toiminto ottaa vastaan lähetettävän datan, jakaa sen bitteihin ja lähettää sen silmukkaamalla lähetyskoodia algoritmin vaiheessa 7 osoitetulla tavalla.
tavu bitBangData (tavu _lähetys) // Tämä toiminto lähettää datan bitbangingin kautta { tavu _receive = 0; for (int i = 0; i <8; i ++) // 8 bittiä tavussa { digitalWrite (MOSIPin, bitRead (_send, i)); // Aseta MOSI digitalWrite (SCKPin, HIGH); // SCK high bitWrite (_vastaanota, i, digitalRead (MISOPin)); // Sieppaa MISO digitalWrite (SCKPin, LOW); // SCK low } return _receive; // Palauta vastaanotetut tiedot }
Bit Bangingin haitat
Bittipanomisen hyväksymisen pitäisi kuitenkin olla hyvin harkittu päätös, koska bittipuristuksessa on useita haittapuolia, jotka saattavat tehdä siitä epäluotettavan toteutettavaksi tietyissä ratkaisuissa. Bittinen paukutus lisää mikrokontrollerin kuluttamaa tehoa prosessin kuluttaman korkean prosessointitehon vuoksi. Verrattuna omistettuun laitteistoon, enemmän tiedonsiirtovirheitä, kuten häiriöitä ja tärinää, esiintyy, kun käytetään bittipanosta, varsinkin kun mikro-ohjain suorittaa tiedonsiirtoa samanaikaisesti muiden tehtävien kanssa. Tiedonsiirto bittisoiton kautta tapahtuu murto-osalla nopeudesta, jolla se tapahtuu käytettäessä erillistä laitteistoa. Tämä voi olla tärkeää tietyissä sovelluksissa ja saattaa tehdä vähän paukutuksesta "ei niin hyvä" valinnan.
Bittien paukutusta käytetään kaikenlaiseen sarjaliikenteeseen, mukaan lukien; RS-232, asynkroninen sarjaliikenne, UART, SPI ja I2C.
UART kautta Bit banging Arduinossa
Yksi suosituimmista bittitapahtumien toteutuksista on Arduino Software Serial -kirjasto, jonka avulla Arduino voi kommunikoida UART: n kautta ilman erillisiä laitteiston UART-nastoja (D0 ja D1). Tämä antaa paljon joustavuutta, koska käyttäjät voivat liittää niin monta sarjalaitetta kuin Arduino-kortin nastojen määrä tukee.