- Hvad er Bit Banging?
- Hvornår skal jeg bruge Bit Banging?
- Algoritme til seriel kommunikation via Bit Banging
- Bit banging over SPI
- Eksempel på Bit Banging: SPI-kommunikation i Arduino
- Ulemper ved Bit Banging
- UART via Bit banging i Arduino
Kommunikationsgrænseflader er en af de faktorer, der overvejes, når man vælger en mikrokontroller, der skal bruges til et projekt. Designeren sikrer, at den valgte mikrocontroller har alle de grænseflader, der kræves for at kommunikere med alle de andre komponenter, der skal bruges til produktet. Eksistensen af nogle af disse grænseflader som SPI og I2C på mikrocontroller øger altid omkostningerne ved sådanne mikrocontrollere, og afhængigt af BOM-budgettet kan det muligvis gøre en ønsket mikrokontroller ikke overkommelig. I situationer som disse kommer teknikkerne som Bit Banging ind for at spille.
Hvad er Bit Banging?
Bit banging er en teknik til seriel kommunikation, hvor hele kommunikationsprocessen håndteres via software i stedet for dedikeret hardware. For at overføre data involverer teknikken brugen af software til at kode dataene i signaler og impulser, der bruges til at manipulere tilstanden af en I / O-pin på en mikrocontroller, der fungerer som Tx-pin til at sende data til målenheden. For at modtage data involverer teknikken sampling af tilstanden af Rx-stiften efter bestemte intervaller, der bestemmes af kommunikations-baudhastigheden. Softwaren indstiller alle de parametre, der er nødvendige for at opnå denne kommunikation inklusive synkronisering, timing, niveauer osv., Som normalt bestemmes af dedikeret hardware, når bit banging ikke bruges.
Hvornår skal jeg bruge Bit Banging?
Bit-Banging bruges normalt i situationer, hvor en mikrocontroller med den krævede grænseflade ikke er tilgængelig, eller når det kan være for dyrt at skifte til en mikrokontroller med den nødvendige grænseflade. Det giver således en billig måde at gøre det muligt for den samme enhed at kommunikere ved hjælp af flere protokoller. En mikrokontroller, som tidligere kun er aktiveret til UART-kommunikation, kan udstyres til at kommunikere ved hjælp af SPI og 12C via bit-banging.
Algoritme til seriel kommunikation via Bit Banging
Mens koden til implementering af bit banging kan variere på tværs af forskellige mikrokontrollere og kan også variere for forskellige serielle protokoller, men proceduren / algoritmen til implementering af bit banging er den samme på alle platforme.
For at sende data for eksempel anvendes pseudokoden nedenfor;
- Start
- Send startbit
- Vent på, at timing svarer til modtagerens baudhastighed
- Send databit
- Vent, indtil varigheden svarer til modtagerens baudhastighed igen
- Kontroller, om alle databits er sendt. Hvis nej, gå til 4. Hvis ja, gå til 7
- Send stopbit
- Hold op
Modtagelse af data har en tendens til at være lidt mere kompleks, normalt bruges en afbrydelse til at bestemme, hvornår data er tilgængelige på modtagerstiften. Dette hjælper med at sikre, at mikrokontrolleren ikke spilder for meget processorkraft. Selvom visse implementeringer bruger nogen af microcontrollers I / O-ben, men chancerne for støj og fejl, hvis de ikke sandsynligvis håndteres, er højere. Algoritmen til at modtage data ved hjælp af afbrydelser forklares nedenfor.
- Start
- Aktivér afbrydelse på Rx-pin
- Når afbrydelse udløses, skal du skaffe startbit
- Vent på timing i henhold til baudhastigheden
- Læs Rx-stiften
- Gentag fra 4, indtil alle data er modtaget
- Vent på timing i henhold til baudhastigheden
- Kontroller for stopbit
- Hold op
Bit banging over SPI
Som nævnt ovenfor fungerer bit banging for forskellige protokoller forskelligt, og det er derfor vigtigt at læse om hver protokol, at forstå dataramme og ur inden du forsøger at implementere. Med SPI-tilstand 1 som eksempel er urets basisværdi altid 0, og data sendes eller modtages altid på urets stigende kant. Timingdiagrammet for SPI Mode 1-kommunikationsprotokollen er vist nedenfor.
For at implementere dette kan følgende algoritme bruges;
- Start
- Sæt SS-stiften lavt for at starte kommunikationen
- Indstil stiften til Master Out Slave In (MOSI) til den første bit af de data, der skal sendes
- Indstil urstiften (SCK) højt, så data transmitteres af masteren og modtages af slaven
- Læs tilstanden for Master in Slave Out (MISO) for at modtage den første bit data fra slave
- Indstil SCK Low, så data kan sendes ved den næste stigende kant
- Gå til 2, indtil alle databit er blevet transmitteret.
- Indstil SS-pin High for at stoppe transmission.
- Hold op
Eksempel på Bit Banging: SPI-kommunikation i Arduino
Lad os som et eksempel implementere algoritmen til SPI-kommunikation via bit banging i Arduino for at vise, hvordan data kan bit-banges over SPI ved hjælp af nedenstående kode.
Vi starter med at erklære Arduino-benene, der skal bruges.
const int SSPin = 11; const int SCKPin = 10; const int MISOPin = 9; const int MOSIPin = 8; byte sendData = 64; // Værdi, der skal sendes byte slaveData = 0; // til lagring af værdien sendt af slaven
Dernæst flytter vi til tomrumsopsætningen () -funktionen, hvor stifternes tilstand erklæres. Kun MISO-stiften (Master in Slave out) erklæres som et input, da det er den eneste pin, der modtager data. Alle andre ben erklæres som output. Efter at have erklæret pin-tilstande er SS-pin indstillet til HIGH. Årsagen til dette er at sikre, at processen er fejlfri, og kommunikationen starter kun, når den er indstillet til lav.
ugyldig opsætning () { pinMode (MISOPin, INPUT); pinMode (SSPin, OUTPUT); pinMode (SCKPin, OUTPUT); pinMode (MOSIPin, OUTPUT); digitalWrite (SSPin, HIGH); }
Dernæst starter vi sløjfen for at sende data. Bemærk, at denne sløjfe fortsætter med at sende data gentagne gange.
Vi starter sløjfen ved at skrive SS-stiften lavt for at starte begyndelsen på kommunikation og kalde på bitbangdata- funktionen, der bryder de foruddefinerede data i bits og sender. Når dette er gjort, skriver vi derefter SS-stiften HIGH for at indikere afslutningen på datatransmissionen.
ugyldig loop () { digitalWrite (SSPin, LOW); // SS lav slaveData = bitBangData (sendData); // datatransmission digitalWrite (SSPin, HIGH); // SS høj igen }
Den bitbangdata () funktionen er skrevet nedenfor. Funktionen optager de data, der skal sendes, og nedbryder dem i bits og sender dem ved at løkke over koden til transmission som angivet i algoritmens trin 7.
byte bitBangData (byte _send) // Denne funktion transmitterer dataene via bitbanging { byte _receive = 0; for (int i = 0; i <8; i ++) // 8 bits i en byte { digitalWrite (MOSIPin, bitRead (_send, i)); // Indstil MOSI digitalWrite (SCKPin, HIGH); // SCK high bitWrite (_receive, i, digitalRead (MISOPin)); // Capture MISO digitalWrite (SCKPin, LOW); // SCK low } return _receive; // Returner de modtagne data }
Ulemper ved Bit Banging
Vedtagelse af bit banging bør dog være en gennemtænkt beslutning, da der er flere ulemper ved bit banging, der muligvis gør det ikke pålideligt til implementering i visse løsninger. Bit banging øger den strøm, der forbruges af mikrocontrolleren på grund af den høje processorkraft, der forbruges af processen. Sammenlignet med dedikeret hardware opstår der flere kommunikationsfejl som glitches og jitters, når bit banging bruges, især når datakommunikation udføres af mikrocontrolleren på samme tid som andre opgaver. Kommunikation via bit banging sker med en brøkdel af den hastighed, hvormed den opstår, når der anvendes dedikeret hardware. Dette kan være vigtigt i visse applikationer og kan gøre bit banging til et "ikke så godt" valg.
Bit banging bruges til alle former for seriel kommunikation inklusive; RS-232, asynkron seriel kommunikation, UART, SPI og I2C.
UART via Bit banging i Arduino
En af de populære implementeringer af bit banging er Arduino Software Serial-biblioteket, der gør det muligt for Arduino at kommunikere via UART uden at bruge de dedikerede hardware UART-ben (D0 og D1). Dette giver en masse fleksibilitet, da brugere kan forbinde så mange serielle enheder, som antallet af ben på Arduino-kortet kan understøtte.