- Kas ir Bit Banging?
- Kad lietot Bit Banging
- Sērijas komunikācijas algoritms, izmantojot bitu sprādzienu
- Bit Banging pār SPI
- Bit Banging piemērs: SPI komunikācija Arduino
- Bit Banging trūkumi
- UART caur Bit banging Arduino
Komunikācijas saskarnes ir viens no faktoriem, kas tiek ņemts vērā, izvēloties projektam izmantojamo mikrokontrolleru. Projektētājs nodrošina, ka izvēlētajam mikrokontrollerim ir visas saskarnes, kas nepieciešamas, lai sazinātos ar visiem pārējiem izstrādājumam izmantojamajiem komponentiem. Dažu šo interfeisu, piemēram, SPI un I2C, esamība mikrokontrollerī vienmēr palielina šādu mikrokontrolleru izmaksas, un atkarībā no BOM budžeta tas var padarīt vēlamo mikrokontrolleru pieejamu. Šādās situācijās spēlē tādas metodes kā Bit Banging.
Kas ir Bit Banging?
Bitu sprādziens ir sērijveida sakaru paņēmiens, kurā viss saziņas process tiek veikts, izmantojot programmatūru, nevis īpašu aparatūru. Datu pārsūtīšanai paņēmiens ietver programmatūras izmantošanu datu kodēšanai signālos un impulsos, kurus izmanto, lai manipulētu ar mikrokontrollera I / O kontakta stāvokli, kas kalpo kā Tx tapa, lai nosūtītu datus mērķa ierīcei. Lai saņemtu datus, paņēmiens ietver Rx tapas stāvokļa paraugu ņemšanu pēc noteiktiem intervāliem, ko nosaka sakaru pārraides ātrums. Programmatūra nosaka visus parametrus, kas nepieciešami šīs komunikācijas sasniegšanai, ieskaitot sinhronizāciju, laiku, līmeņus utt., Par kuriem parasti lemj īpaša aparatūra, ja netiek izmantota bitu dauzīšana.
Kad lietot Bit Banging
Bit-Banging parasti tiek izmantots situācijās, kad mikrokontrolleris ar nepieciešamo saskarni nav pieejams vai ja pāreja uz mikrokontrolleru ar nepieciešamo saskarni var būt pārāk dārga. Tādējādi tas nodrošina lētu veidu, kā ļaut tai pašai ierīcei sazināties, izmantojot vairākus protokolus. Mikrokontrolleru, kas iepriekš ir iespējots tikai UART saziņai, var aprīkot saziņai, izmantojot SPI un 12C, izmantojot bitu sprādzienu.
Sērijas komunikācijas algoritms, izmantojot bitu sprādzienu
Kaut arī kods, lai ieviestu bitu sprādzienu, dažādos mikrokontrolleros var atšķirties un dažādiem sērijas protokoliem var atšķirties, taču bitu sprādziena ieviešanas procedūra / algoritms visās platformās ir vienāds.
Datu nosūtīšanai, piemēram, tiek izmantots zemāk redzamais pseidokods;
- Sākt
- Nosūtīt sākuma bitu
- Pagaidiet, kamēr laiks atbilst uztvērēja datu pārraides ātrumam
- Nosūtīt datu bitu
- Atkal gaidiet, līdz ilgums atbilst uztvērēja pārraides ātrumam
- Pārbaudiet, vai visi datu biti ir nosūtīti. Ja nē, dodieties uz 4. Ja jā, pārejiet uz 7
- Nosūtīt pieturas bitu
- Apstājies
Datu saņemšana mēdz būt nedaudz sarežģītāka, parasti tiek izmantots pārtraukums, lai noteiktu, kad dati ir pieejami uztvērēja tapā. Tas palīdz nodrošināt, ka mikrokontrolleris neiznieko pārāk daudz apstrādes jaudas. Lai gan dažās realizācijās tiek izmantots kāds no mikrokontrolleru I / O tapām, bet trokšņa un kļūdu iespējamība, ja ar tām, iespējams, netiek galā, ir lielāka. Algoritms datu saņemšanai, izmantojot pārtraukumus, ir paskaidrots tālāk.
- Sākt
- Iespējot pārtraukumu Rx tapā
- Kad tiek aktivizēts pārtraukums, iegūstiet sākuma bitu
- Pagaidiet laiku pēc pārraides ātruma
- Izlasiet Rx tapu
- Atkārtojiet no 4 līdz visi dati ir saņemti
- Pagaidiet laiku pēc pārraides ātruma
- Pārbaudiet, vai nav pieturas
- Apstājies
Bit Banging pār SPI
Kā minēts iepriekš, bitu sprādziens dažādiem protokoliem darbojas atšķirīgi, un tāpēc pirms mēģināšanas ieviest, ir svarīgi izlasīt par katru protokolu, saprast datu ierāmēšanu un pulksteņošanu. Ņemot par piemēru 1. SPI režīmu, pulksteņa bāzes vērtība vienmēr ir 0, un dati vienmēr tiek sūtīti vai saņemti uz pulksteņa augšējās malas. SPI 1. režīma sakaru protokola laika shēma ir parādīta zemāk.
Lai to īstenotu, var izmantot šādu algoritmu;
- Sākt
- Lai sāktu saziņu, iestatiet zemu SS spraudni
- Pirmajam nosūtāmo datu bitam iestatiet piespraudi Master Out Slave In (MOSI)
- Iestatiet augstu pulksteņa tapu (SCK), lai datus pārsūtītu galvenais un vergs tos saņemtu
- Izlasiet Master in Slave Out (MISO) stāvokli, lai saņemtu pirmo datu bitu no verga
- Iestatiet SCK Low, lai datus varētu nosūtīt uz nākamo augšējo malu
- Pārejiet uz 2, līdz visi datu biti ir pārsūtīti.
- Lai apturētu pārraidi, iestatiet SS tapu augstu.
- Apstājies
Bit Banging piemērs: SPI komunikācija Arduino
Piemēram, ieviesīsim SPI komunikācijas algoritmu, izmantojot Arduino bitu sprādzienu, lai parādītu, kā datus var bit-banged pār SPI, izmantojot zemāk esošo kodu.
Mēs sākam ar to, ka paziņojam par Arduino tapu izmantošanu.
const int SSPin = 11; const int SCKPin = 10; const int MISOPin = 9; const int MOSIPin = 8; baits sendData = 64; // Vērtība, kas jānosūta baits slaveData = 0; // verga sūtītās vērtības glabāšanai
Tālāk mēs pārejam uz funkciju void setup (), kur tiek deklarēts tapu stāvoklis. Par ievadi tiek deklarēta tikai MISO (Master in Slave out - MISO) tapa, jo tā ir vienīgā tapa, kas saņem datus. Visas pārējās tapas tiek deklarētas kā izeja. Pēc tapu režīmu deklarēšanas SS tapa tiek iestatīta uz HIGH. Iemesls tam ir nodrošināt procesu bez kļūdām un saziņu sākt tikai tad, kad tas ir iestatīts uz zemu līmeni.
void setup () { pinMode (MISOPin, INPUT); pinMode (SSPin, OUTPUT); pinMode (SCKPin, OUTPUT); pinMode (MOSIPin, OUTPUT); digitalWrite (SSPin, HIGH); }
Tālāk mēs sākam cilpu, lai nosūtītu datus. Ņemiet vērā, ka šī cilpa turpinās atkārtoti nosūtīt datus.
Mēs sākam cilpu , ierakstot zemu SS tapu, lai sāktu saziņas sākumu, un izsaucam funkciju bitbangdata, kas iepriekš noteiktos datus sadala bitos un nosūta. Kad tas izdarīts, mēs pēc tam uzrakstām SS tapu HIGH, lai norādītu datu pārraides beigas.
void loop () { digitalWrite (SSPin, LOW); // SS zemie slaveData = bitBangData (sendData); // datu pārraide digitalWrite (SSPin, HIGH); // atkal SS augsts }
Bitbangdata () funkcija ir rakstīts zemāk. Funkcija uztver nosūtāmos datus, sadala tos bitos un nosūta, pārslēdzot pārraides kodu, kā norādīts algoritma 7. solī.
baits bitBangData (baits _nosūtīt) // Šī funkcija pārraida datus, izmantojot bitjoslu { baits _receive = 0; par (int i = 0; i <8; i ++) // 8 biti baitā { digitalWrite (MOSIPin, bitRead (_send, i)); // Iestatiet MOSI digitalWrite (SCKPin, HIGH); // SCK high bitWrite (_receive, i, digitalRead (MISOPin)); // Capture MISO digitalWrite (SCKPin, LOW); // SCK zems } atgriešanās _saņemt; // Atgriezt saņemtos datus }
Bit Banging trūkumi
Bitu sprādzienu pieņemšanai tomēr vajadzētu būt pārdomātam lēmumam, jo bitu sprādzienam ir vairāki trūkumi, kas var padarīt to neuzticamu ieviešanai noteiktos risinājumos. Bitu sprādziens palielina mikrokontrollera patērēto jaudu, pateicoties procesam patērētajai lielajai apstrādes jaudai. Salīdzinot ar īpašu aparatūru, rodas vairāk sakaru kļūdu, piemēram, kļūmes un satricinājumi, ja tiek izmantots bitu sprādziens, it īpaši, ja datu pārraidi mikrokontrolleris veic vienlaikus ar citiem uzdevumiem. Saziņa ar bitu sprādzienu notiek ar daļu no ātruma, ar kādu tā notiek, ja tiek izmantota īpaša aparatūra. Tas var būt svarīgi dažās lietojumprogrammās, un tas var padarīt mazliet sitienu par “ne tik labu” izvēli.
Bitu sprādziens tiek izmantots visu veidu sērijveida sakariem, ieskaitot; RS-232, asinhronā sērijas komunikācija, UART, SPI un I2C.
UART caur Bit banging Arduino
Viena no populārākajām bitu sprādziena realizācijām ir Arduino programmatūras sērijas bibliotēka, kas ļauj Arduino sazināties pa UART, neizmantojot īpašās aparatūras UART tapas (D0 un D1). Tas dod lielu elastību, jo lietotāji var savienot tik daudz sērijveida ierīču, cik daudz spraudņu var atbalstīt Arduino dēlī.