- Co to jest Bit Banging?
- Kiedy używać Bit Banging
- Algorytm komunikacji szeregowej poprzez Bit Banging
- Bit Banging przez SPI
- Przykład Bit Banging: komunikacja SPI w Arduino
- Wady walenia bitami
- UART przez Bit banging w Arduino
Interfejsy komunikacyjne są jednym z czynników branych pod uwagę przy wyborze mikrokontrolera do wykorzystania w projekcie. Projektant zapewnia, że wybrany mikrokontroler ma wszystkie interfejsy wymagane do komunikacji ze wszystkimi pozostałymi komponentami, które mają być użyte dla produktu. Istnienie niektórych z tych interfejsów, takich jak SPI i I2C na mikrokontrolerze, niezmiennie zwiększa koszt takich mikrokontrolerów iw zależności od budżetu BOM może sprawić, że pożądany mikrokontroler nie będzie dostępny. W takich sytuacjach do gry wkraczają takie techniki jak Bit Banging.
Co to jest Bit Banging?
Bit banging to technika komunikacji szeregowej, w której cały proces komunikacji jest obsługiwany za pośrednictwem oprogramowania zamiast dedykowanego sprzętu. Aby przesłać dane, technika ta obejmuje użycie oprogramowania do kodowania danych na sygnały i impulsy, które są wykorzystywane do manipulowania stanem pinu I / O mikrokontrolera, który służy jako pin Tx do wysyłania danych do urządzenia docelowego. Aby odebrać dane, technika ta polega na próbkowaniu stanu styku Rx po pewnych odstępach czasu, które są określane przez szybkość transmisji danych. Oprogramowanie ustawia wszystkie parametry potrzebne do osiągnięcia tej komunikacji, w tym synchronizację, taktowanie, poziomy itp., Które są zwykle określane przez dedykowany sprzęt, gdy nie jest używane uderzenie bitów.
Kiedy używać Bit Banging
Bit-Banging jest zwykle używany w sytuacjach, gdy mikrokontroler z wymaganym interfejsem nie jest dostępny lub gdy przejście na mikrokontroler z wymaganym interfejsem może być zbyt kosztowne. W ten sposób zapewnia tani sposób na umożliwienie temu samemu urządzeniu komunikacji przy użyciu kilku protokołów. Mikrokontroler, który wcześniej był przystosowany tylko do komunikacji UART, może być wyposażony do komunikacji za pomocą SPI i 12C za pomocą bitów.
Algorytm komunikacji szeregowej poprzez Bit Banging
Chociaż kod do implementacji bit-banging może się różnić w różnych mikrokontrolerach i może również różnić się dla różnych protokołów szeregowych, ale procedura / algorytm implementacji bit-banging jest taka sama na wszystkich platformach.
Na przykład do wysyłania danych używany jest poniższy pseudokod;
- Początek
- Wyślij bit startu
- Poczekaj, aż synchronizacja będzie zgodna z szybkością transmisji odbiornika
- Wyślij bit danych
- Poczekaj, aż czas ponownie będzie odpowiadał szybkości transmisji odbiornika
- Sprawdź, czy wszystkie bity danych zostały wysłane. Jeśli nie, przejdź do 4. Jeśli tak, przejdź do 7
- Wyślij bit stopu
- Zatrzymać
Odbieranie danych wydaje się być nieco bardziej złożone, zwykle stosuje się przerwanie, aby określić, czy dane są dostępne na pinie odbiornika. Dzięki temu mikrokontroler nie marnuje zbyt dużej mocy obliczeniowej. Chociaż niektóre implementacje używają dowolnego z pinów I / O mikrokontrolera, ale szanse na szum i błędy, jeśli prawdopodobnie nie są obsługiwane, są wyższe. Algorytm otrzymywania danych za pomocą przerwań został wyjaśniony poniżej.
- Początek
- Włącz przerwanie na pinie Rx
- Po wyzwoleniu przerwania uzyskaj bit startu
- Poczekaj na odliczanie czasu zgodnie z szybkością transmisji
- Przeczytaj pin Rx
- Powtarzaj od 4, aż wszystkie dane zostaną odebrane
- Poczekaj na odliczanie czasu zgodnie z szybkością transmisji
- Sprawdź bit stopu
- Zatrzymać
Bit Banging przez SPI
Jak wspomniano powyżej, bit banging dla różnych protokołów działa inaczej, dlatego ważne jest, aby przeczytać o każdym protokole, aby zrozumieć ramkowanie danych i taktowanie przed próbą wdrożenia. Biorąc na przykład tryb SPI 1, podstawową wartością zegara jest zawsze 0, a dane są zawsze wysyłane lub odbierane na rosnącym zboczu zegara. Schemat czasowy protokołu komunikacyjnego SPI Mode 1 przedstawiono poniżej.
Aby to zaimplementować, można użyć następującego algorytmu;
- Początek
- Ustaw niski pin SS, aby rozpocząć komunikację
- Ustaw pin dla Master Out Slave In (MOSI) na pierwszy bit wysyłanych danych
- Ustaw pin zegara (SCK) wysoko, aby dane były przesyłane przez master i odbierane przez slave
- Odczytaj stan Master w Slave Out (MISO), aby otrzymać pierwszy bit danych z urządzenia slave
- Ustaw SCK Low, aby dane mogły być wysyłane na następnym zboczu narastającym
- Przejdź do 2, aż wszystkie bity danych zostaną przesłane.
- Ustaw pin SS High, aby zatrzymać transmisję.
- Zatrzymać
Przykład Bit Banging: komunikacja SPI w Arduino
Jako przykład zaimplementujmy algorytm komunikacji SPI za pomocą bit-banging w Arduino, aby pokazać, jak dane mogą być przesyłane bitowo przez SPI, używając poniższego kodu.
Zaczynamy od zadeklarowania użycia pinów Arduino.
const int SSPin = 11; const int SCKPin = 10; const int MISOPin = 9; const int MOSIPin = 8; bajt sendData = 64; // Wartość do wysłania bajt slaveData = 0; // do przechowywania wartości wysłanej przez slave'a
Następnie przechodzimy do funkcji void setup (), w której deklarowany jest stan pinów. Jedynie pin Master in Slave out (MISO) jest zadeklarowany jako wejście, ponieważ jest to jedyny pin, który odbiera dane. Wszystkie inne piny są deklarowane jako wyjścia. Po zadeklarowaniu trybów pinów, pin SS jest ustawiony na WYSOKI. Powodem tego jest zapewnienie, że proces jest wolny od błędów, a komunikacja rozpoczyna się tylko wtedy, gdy jest ustawiony zbyt niski.
void setup () { pinMode (MISOPin, INPUT); pinMode (SSPin, OUTPUT); pinMode (SCKPin, OUTPUT); pinMode (MOSIPin, OUTPUT); digitalWrite (SSPin, HIGH); }
Następnie rozpoczynamy pętlę do wysyłania danych. Zauważ, że ta pętla będzie nadal wysyłać dane wielokrotnie.
Zaczynamy pętlę pisząc SS pin niski, aby inicjować początek komunikacji, a wezwanie do bitbangdata funkcji, która łamie predefiniowanych danych w bitach i wysłać. Po wykonaniu tej czynności zapisujemy pin SS HIGH, aby wskazać koniec transmisji danych.
void loop () { digitalWrite (SSPin, LOW); // SS low slaveData = bitBangData (sendData); // transmisja danych digitalWrite (SSPin, HIGH); // znowu wysokie SS }
Bitbangdata () funkcja opisana poniżej. Funkcja pobiera dane do wysłania i dzieli je na bity, a następnie przesyła dalej, przechodząc przez pętlę kodu do transmisji, jak wskazano w kroku 7 algorytmu.
byte bitBangData (byte _send) // Ta funkcja przesyła dane przez bitbanging { byte _receive = 0; for (int i = 0; i <8; i ++) // 8 bitów w bajcie { digitalWrite (MOSIPin, bitRead (_send, i)); // Ustaw MOSI digitalWrite (SCKPin, HIGH); // SCK high bitWrite (_receive, i, digitalRead (MISOPin)); // Przechwytywanie MISO digitalWrite (SCKPin, LOW); // SCK low } return _receive; // Zwróć otrzymane dane }
Wady walenia bitami
Przyjęcie bit-banging powinno być jednak dobrze przemyślaną decyzją, ponieważ ma kilka wad, które mogą sprawić, że nie będzie można go wdrożyć w niektórych rozwiązaniach. Uderzanie bitów zwiększa moc pobieraną przez mikrokontroler ze względu na dużą moc obliczeniową zużywaną przez proces. W porównaniu z dedykowanym sprzętem, więcej błędów komunikacji, takich jak zakłócenia i fluktuacje, występuje, gdy używane jest uderzanie bitów, zwłaszcza gdy transmisja danych jest wykonywana przez mikrokontroler w tym samym czasie, co inne zadania. Komunikacja poprzez bit-banging odbywa się z ułamkiem szybkości, z jaką zachodzi, gdy używany jest dedykowany sprzęt. Może to być ważne w niektórych aplikacjach i może sprawić, że rżnięcie będzie „niezbyt dobrym” wyborem.
Uderzanie bitów jest używane we wszystkich rodzajach komunikacji szeregowej, w tym; RS-232, asynchroniczna komunikacja szeregowa, UART, SPI i I2C.
UART przez Bit banging w Arduino
Jedną z popularnych implementacji bit-banging jest biblioteka Arduino Software Serial, która umożliwia komunikację Arduino przez UART bez użycia dedykowanych sprzętowych pinów UART (D0 i D1). Daje to dużą elastyczność, ponieważ użytkownicy mogą podłączyć tyle urządzeń szeregowych, ile może obsłużyć liczba pinów na płycie Arduino.