- Co je to bití?
- Kdy použít Bit Banging
- Algoritmus pro sériovou komunikaci pomocí bitů
- Bit bít přes SPI
- Příklad bit Bangingu: SPI komunikace v Arduinu
- Nevýhody bití bouchání
- UART přes bitování bitů v Arduinu
Komunikační rozhraní jsou jedním z faktorů, které se berou v úvahu při výběru mikrokontroléru, který se má použít pro projekt. Návrhář zajišťuje, že vybraný mikrokontrolér má všechna rozhraní potřebná ke komunikaci se všemi ostatními komponentami, které mají být pro produkt použity. Existence některých z těchto rozhraní, jako je SPI a I2C, na mikrokontroléru vždy zvyšuje náklady na takové mikrokontroléry a v závislosti na rozpočtu kusovníku může požadovaný mikrokontrolér učinit nedostupným. V takových situacích přicházejí hrát techniky jako Bit Banging.
Co je to bití?
Bitování bitů je technika pro sériovou komunikaci, při které je celý proces komunikace řešen pomocí softwaru místo vyhrazeného hardwaru. K přenosu dat tato technika zahrnuje použití softwaru pro kódování dat do signálů a pulzů, které se používají k manipulaci se stavem I / O pinu mikrokontroléru, který slouží jako Tx pin k odesílání dat do cílového zařízení. Pro příjem dat zahrnuje technika vzorkování stavu Rx pinu po určitých intervalech, které jsou určeny přenosovou rychlostí komunikace. Software nastavuje všechny parametry potřebné k dosažení této komunikace, včetně synchronizace, časování, úrovní atd., Které jsou obvykle určeny vyhrazeným hardwarem, pokud není použit bit bit.
Kdy použít Bit Banging
Bit-bouchání se obvykle používá v situacích, kdy mikrokontrolér s požadovaným rozhraním není k dispozici, nebo když může být přechod na mikrokontrolér s požadovaným rozhraním příliš nákladný. Poskytuje tedy levný způsob, jak umožnit stejnému zařízení komunikovat pomocí několika protokolů. Mikrokontrolér, který je dříve povolen pouze pro komunikaci UART, může být vybaven pro komunikaci pomocí SPI a 12C pomocí bitování bitů.
Algoritmus pro sériovou komunikaci pomocí bitů
Zatímco kód pro implementaci bitování bitů se může lišit napříč různými mikrokontroléry a může se také lišit pro různé sériové protokoly, ale postup / algoritmus pro implementaci bitování bitů je stejný na všech platformách.
K odesílání dat se používá například níže uvedený pseudokód;
- Start
- Odeslat počáteční bit
- Počkejte, až načasování odpovídá přenosové rychlosti přijímače
- Odeslat datový bit
- Počkejte, dokud doba opět neodpovídá přenosové rychlosti přijímače
- Zkontrolujte, zda byly odeslány všechny datové bity. Pokud ne, přejděte na 4. Pokud ano, přejděte na 7
- Odeslat stop bit
- Stop
Příjem dat má tendenci být trochu složitější, obvykle se používá přerušení k určení, kdy jsou data k dispozici na kolíku přijímače. To pomáhá zajistit, aby mikrokontrolér neztrácel příliš mnoho výpočetní síly. I když některé implementace používají některý z I / O pinů mikrokontrolérů, šance na šum a chyby, pokud nejsou pravděpodobně zpracovány, jsou vyšší. Algoritmus pro příjem dat pomocí přerušení je vysvětlen níže.
- Start
- Povolit přerušení na kolíku Rx
- Když je spuštěno přerušení, získejte počáteční bit
- Počkejte na načasování podle přenosové rychlosti
- Přečtěte si kolík Rx
- Opakujte od 4, dokud nebudou přijata všechna data
- Počkejte na načasování podle přenosové rychlosti
- Zkontrolujte stop bit
- Stop
Bit bít přes SPI
Jak již bylo zmíněno výše, bitování bitů pro různé protokoly funguje odlišně, a proto je důležité číst o každém protokolu, porozumět rámování dat a časování před pokusem o implementaci. Jako příklad vezmeme režim SPI 1, základní hodnota hodin je vždy 0 a data jsou vždy odesílána nebo přijímána na náběžné hraně hodin. Schéma časování komunikačního protokolu SPI Mode 1 je uvedeno níže.
K implementaci lze použít následující algoritmus;
- Start
- Chcete-li zahájit komunikaci, nastavte nízký PIN SS
- Nastavte kolík pro Master Out Slave In (MOSI) na první bit dat, která mají být odeslána
- Nastavte hodinový kolík (SCK) vysoko, aby data přenášela hlavní jednotka a přijímala podřízená jednotka
- Přečtěte si stav Master v Slave Out (MISO) a přijměte první bit dat od Slave
- Nastavte SCK Low, aby bylo možné odesílat data na další náběžné hraně
- Přejděte na 2, dokud nebudou přeneseny všechny datové bity.
- Nastavením kolíku SS na Vysoký zastavte přenos.
- Stop
Příklad bit Bangingu: SPI komunikace v Arduinu
Jako příklad pojďme implementovat algoritmus pro komunikaci SPI pomocí bitového bitování v Arduinu, abychom ukázali, jak lze data bitově bít přes SPI pomocí níže uvedeného kódu.
Začneme prohlášením pinů Arduina, které mají být použity.
const int SSPin = 11; const int SCKPin = 10; const int MISOPin = 9; const int MOSIPin = 8; byte sendData = 64; // Hodnota k odeslání byte slaveData = 0; // pro uložení hodnoty odeslané slave
Dále přejdeme k funkci void setup (), kde je deklarován stav pinů. Jako vstup je deklarován pouze pin Master in Slave out (MISO), protože je to jediný pin, který přijímá data. Všechny ostatní piny jsou deklarovány jako výstup. Po deklaraci režimů pinů je pin SS nastaven na HIGH. Důvodem je zajistit, aby byl proces bezchybný a komunikace začala, až když je nastaven na nízkou hodnotu.
void setup () { pinMode (MISOPin, INPUT); pinMode (SSPin, VÝSTUP); pinMode (SCKPin, VÝSTUP); pinMode (MOSIPin, VÝSTUP); digitalWrite (SSPin, HIGH); }
Dále zahájíme smyčku pro odesílání dat. Tato smyčka bude opakovaně odesílat data.
Začneme smyčku tím, že napíšeme SS pin low, zahájíme začátek komunikace a zavoláme funkci bitbangdata, která rozdělí předdefinovaná data na bity a odešle. Když to uděláme, napíšeme SS pin HIGH, abychom označili konec přenosu dat.
void loop () { digitalWrite (SSPin, LOW); // SS low slaveData = bitBangData (sendData); // přenos dat digitalWrite (SSPin, HIGH); // SS opět vysoká }
Níže je napsána funkce bitbangdata () . Funkce převezme data, která mají být odeslána, rozdělí je na bity a odešle je smyčkou přes kód pro přenos, jak je uvedeno v kroku 7 algoritmu.
byte bitBangData (byte _send) // Tato funkce přenáší data pomocí bitbanging { byte _receive = 0; for (int i = 0; i <8; i ++) // 8 bitů v bajtu { digitalWrite (MOSIPin, bitRead (_send, i)); // Nastavit MOSI digitalWrite (SCKPin, HIGH); // SCK high bitWrite (_receive, i, digitalRead (MISOPin)); // Capture MISO digitalWrite (SCKPin, LOW); // SCK low } return _receive; // Vrátit přijatá data }
Nevýhody bití bouchání
Přijetí bitového bouchání by však mělo být dobře promyšleným rozhodnutím, protože existuje několik nevýhod bitového bouchání, díky kterým nemusí být spolehlivé pro implementaci v určitých řešeních. Bitování bitů zvyšuje energii spotřebovanou mikrokontrolérem kvůli vysoké procesní energii spotřebované procesem. Ve srovnání s vyhrazeným hardwarem se při použití bitů bitů vyskytne více komunikačních chyb, jako jsou závady a nervozita, zejména když je datová komunikace prováděna mikrokontrolérem současně s jinými úkoly. Komunikace pomocí bitování bitů probíhá zlomkem rychlosti, s jakou k ní dochází při použití vyhrazeného hardwaru. To může být důležité v určitých aplikacích a může být bitové bitování „ne tak dobrou“ volbou.
Bitování bitů se používá pro všechny druhy sériové komunikace včetně; RS-232, asynchronní sériová komunikace, UART, SPI a I2C.
UART přes bitování bitů v Arduinu
Jednou z populárních implementací bitování bitů je knihovna Arduino Software Serial, která umožňuje Arduinu komunikovat přes UART bez použití vyhrazených hardwarových pinů UART (D0 a D1). To poskytuje velkou flexibilitu, protože uživatelé mohou připojit tolik sériových zařízení, kolik podporuje počet pinů na desce Arduino.