- Kas yra „Bit Banging“?
- Kada naudoti „Bit Banging“
- Serijinio ryšio per bitų sprogimą algoritmas
- Šiek tiek trenkiantis per SPI
- „Bit Banging“ pavyzdys: SPI ryšys „Arduino“
- Bitų sprogimo trūkumai
- UART per „Bit banging“ „Arduino“
Ryšio sąsajos yra vienas iš veiksnių, į kuriuos atsižvelgiama renkantis mikrovaldiklį, kuris bus naudojamas projektui. Dizaineris užtikrina, kad pasirinktame mikrovaldiklyje būtų visos sąsajos, reikalingos bendrauti su visais kitais gaminyje naudojamais komponentais. Kai kurios iš šių sąsajų, pvz., SPI ir I2C, esančios mikrovaldikliuose, visada padidina tokių mikrovaldiklių kainą, ir, atsižvelgiant į BOM biudžetą, norimas mikrovaldiklis gali būti nebrangus. Tokiose situacijose, kaip „ Bit Banging“, reikia žaisti.
Kas yra „Bit Banging“?
„Bit banging“ yra nuosekliojo ryšio technika, kai visas komunikacijos procesas yra valdomas programine įranga, o ne skirta aparatine įranga. Norėdami perduoti duomenis, technika apima programinės įrangos naudojimą duomenims koduoti į signalus ir impulsus, kurie naudojami manipuliuoti mikrovaldiklio, kuris tarnauja kaip Tx kaištis, I / O kaiščio būsenai siųsti duomenis į tikslinį įrenginį, būsena. Norint gauti duomenis, metodika apima Rx kaiščio būsenos atranką po tam tikrų intervalų, kurie nustatomi pagal ryšio perdavimo greitį. Programinė įranga nustato visus parametrus, reikalingus šiam ryšiui pasiekti, įskaitant sinchronizavimą, laiką, lygius ir kt., Kuriuos paprastai nusprendžia speciali įranga, kai nenaudojamas bitų sprogimas.
Kada naudoti „Bit Banging“
„Bit-Banging“ dažniausiai naudojamas tais atvejais, kai nėra mikrovaldiklio su reikalinga sąsaja arba kai perėjimas prie mikrovaldiklio su reikalinga sąsaja gali būti per brangus. Taigi tai yra pigus būdas leisti tam pačiam įrenginiui bendrauti naudojant kelis protokolus. Mikrovaldiklis, kuris anksčiau buvo įjungtas tik UART ryšiui, gali būti aprūpintas ryšiu naudojant SPI ir 12C per bitų sprogimą.
Serijinio ryšio per bitų sprogimą algoritmas
Nors kodas skirtingiems mikrovaldikliams gali skirtis ir skirtingiems nuosekliems protokolams gali skirtis, tačiau bitų daužymo procedūra / algoritmas visose platformose yra vienodas.
Duomenims siųsti, pavyzdžiui, naudojamas žemiau pateiktas pseudo kodas;
- Pradėti
- Siųsti pradžios bitą
- Palaukite, kol laikas atitiks imtuvo perdavimo greitį
- Siųsti duomenų bitą
- Palaukite, kol trukmė vėl atitiks imtuvo perdavimo greitį
- Patikrinkite, ar visi duomenų bitai išsiųsti. Jei ne, eikite į 4. Jei taip, eikite į 7
- Siųsti stabdymo bitą
- Sustabdyti
Duomenų priėmimas paprastai būna šiek tiek sudėtingesnis, paprastai naudojamas pertraukimas siekiant nustatyti, kada imtuvo kaište yra duomenų. Tai padeda užtikrinti, kad mikrovaldiklis neišeikvotų per daug apdorojimo galios. Nors tam tikruose įgyvendinimuose naudojami bet kurie mikrovaldiklių įvesties / išvesties kaiščiai, tačiau triukšmo ir klaidų tikimybė yra didesnė, jei tikriausiai jos nėra tvarkomos. Duomenų gavimo naudojant pertraukimus algoritmas paaiškintas toliau.
- Pradėti
- Įgalinti „Rx“ kaiščio pertraukimą
- Kai suaktyvinamas pertraukimas, gaukite pradinį bitą
- Palaukite laiko nustatymo pagal perdavimo greitį
- Perskaitykite Rx kaištį
- Kartokite nuo 4, kol bus gauti visi duomenys
- Palaukite laiko nustatymo pagal perdavimo greitį
- Patikrinkite, ar nėra stabdžių antgalio
- Sustabdyti
Šiek tiek trenkiantis per SPI
Kaip minėta pirmiau, bitų sprogimas skirtingiems protokolams veikia skirtingai, todėl prieš bandant įgyvendinti, svarbu perskaityti kiekvieną protokolą, suprasti duomenų rėminimą ir laikrodį. Kaip pavyzdį imant SPI 1 režimą, laikrodžio bazinė vertė visada yra 0, o duomenys visada siunčiami arba priimami kylančiame laikrodžio krašte. SPI 1 režimo ryšio protokolo laiko schema parodyta žemiau.
Norėdami tai įgyvendinti, galima naudoti šį algoritmą;
- Pradėti
- Norėdami pradėti ryšį, nustatykite žemą SS kaištį
- Pirmam siunčiamų duomenų bitui nustatykite pagrindinio išvesto vergo įvesties (MOSI) kaištį
- Laikrodžio kaištį (SCK) nustatykite aukštai, kad duomenis perduotų pagrindinis aparatas, o vergas juos gautų
- Perskaitykite „Master in Slave Out“ (MISO) būseną, kad gautumėte pirmąjį duomenų kiekį iš vergo
- Nustatykite „SCK Low“, kad duomenis būtų galima siųsti kitame pakilimo krašte
- Eikite į 2, kol bus perduoti visi duomenų bitai.
- Norėdami sustabdyti perdavimą, nustatykite aukštą SS kaištį.
- Sustabdyti
„Bit Banging“ pavyzdys: SPI ryšys „Arduino“
Kaip pavyzdį, įgyvendinkime SPI komunikacijos algoritmą per „Arduino“ bitų sprogimą, kad parodytume, kaip duomenis galima suskirstyti per SPI naudojant toliau pateiktą kodą.
Pirmiausia paskelbiame, kad „Arduino“ kaiščiai yra naudojami.
const int SSPin = 11; const int SCKPin = 10; const int MISOPin = 9; const int MOSIPin = 8; baitas sendData = 64; // Vertė, kurią reikia siųsti baitais slaveData = 0; // vergo siunčiamos vertės saugojimui
Toliau pereiname prie funkcijos void setup (), kur deklaruojama kaiščių būsena. Tik „Master in Slave out“ (MISO) kaištis yra deklaruojamas kaip įvestis, nes tai yra vienintelis kaištis, kuris gauna duomenis. Visi kiti kaiščiai deklaruojami kaip produkcija. Paskelbus kaiščių režimus, SS kaištis nustatomas į AUKŠTAS. To priežastis yra užtikrinti, kad procese nebūtų klaidų, o ryšys pradedamas tik tada, kai jis nustatytas žemai.
negaliojanti sąranka () { pinMode (MISOPin, INPUT); pinMode (SSPin, OUTPUT); pinMode (SCKPin, OUTPUT); „pinMode“ (MOSIPin, OUTPUT); „digitalWrite“ (SSPin, HIGH); }
Tada mes pradedame kilpą duomenims siųsti. Atminkite, kad ši kilpa ir toliau siųs duomenis pakartotinai.
Pradedame kilpą žemai parašydami SS kaištį, kad pradėtume ryšio pradžią, ir iškviečiame funkciją „ bitbangdata“, kuri suskirsto iš anksto nustatytus duomenis į bitus ir siunčia. Tai atlikę, mes parašome SS kaištį HIGH, kad nurodytume duomenų perdavimo pabaigą.
void loop () { digitalWrite (SSPin, LOW); // SS low slaveData = bitBangData (sendData); // duomenų perdavimas digitalWrite (SSPin, HIGH); // SS vėl aukštas }
Bitbangdata () funkcija yra parašyta žemiau. Funkcija priima siunčiamus duomenis, suskirsto juos į bitus ir siunčia juos perjungdama perdavimo kodą, kaip nurodyta algoritmo 7 veiksme.
baitas bitBangData (byte _send) // Ši funkcija perduoda duomenis per bitbanging { byte _receive = 0; už (int i = 0; i <8; i ++) // 8 bitai baite { digitalWrite (MOSIPin, bitRead (_send, i)); // Nustatyti „MOSI digitalWrite“ (SCKPin, HIGH); // SCK high bitWrite (_receive, i, digitalRead (MISOPin)); // Capture MISO digitalWrite (SCKPin, LOW); // SCK low } return _receive; // grąžinti gautus duomenis }
Bitų sprogimo trūkumai
Tačiau bitų sprogimo priėmimas turėtų būti gerai apgalvotas sprendimas, nes yra keletas trūkumų, dėl kurių gali būti nepatikima įgyvendinti tam tikrus sprendimus. Bitų sprogimas padidina mikrovaldiklio sunaudojamą galią dėl didelės proceso metu sunaudojamos apdorojimo galios. Palyginti su specialia aparatine įranga, atsiranda daugiau bendravimo klaidų, tokių kaip trikdžiai ir virpėjimai, kai naudojamas bitų sprogimas, ypač kai mikrovaldiklis vykdo duomenų perdavimą tuo pačiu metu kaip ir kitos užduotys. Ryšys per bitų sprogimą vyksta greičio, kuriuo jis vyksta, kai naudojama speciali aparatūra, dalimi. Tai gali būti svarbu tam tikrose programose ir gali šiek tiek trankyti „ne taip gerai“.
Bitų sprogimas naudojamas visoms serijinėms komunikacijoms, įskaitant; RS-232, asinchroninis nuoseklusis ryšys, UART, SPI ir I2C.
UART per „Bit banging“ „Arduino“
Vienas iš populiariausių bitų sprogimų įgyvendinimų yra „Arduino“ programinės įrangos serijos biblioteka, leidžianti „Arduino“ bendrauti per UART nenaudojant specialių aparatinės įrangos UART kaiščių (D0 ir D1). Tai suteikia daug lankstumo, nes vartotojai gali prijungti tiek serijinių įrenginių, kiek gali palaikyti „Arduino“ plokštės kaiščių skaičius.