- Wat is Bit Banging?
- Wanneer Bit Banging gebruiken
- Algoritme voor seriële communicatie via Bit Banging
- Beetje bonzen over SPI
- Voorbeeld van Bit Banging: SPI-communicatie in Arduino
- Nadelen van Bit Banging
- UART via Bit-bonzen in Arduino
Communicatie-interfaces zijn een van de factoren waarmee rekening wordt gehouden bij het selecteren van een microcontroller die voor een project moet worden gebruikt. De ontwerper zorgt ervoor dat de geselecteerde microcontroller alle interfaces heeft die nodig zijn om te communiceren met alle andere componenten die voor het product worden gebruikt. Het bestaan van sommige van deze interfaces, zoals SPI en I2C op microcontrollers, verhoogt steevast de kosten van dergelijke microcontrollers, en afhankelijk van het BOM-budget kan het een gewenste microcontroller niet betaalbaar maken. In situaties als deze komen de technieken zoals Bit Banging om de hoek kijken.
Wat is Bit Banging?
Bitbanging is een techniek voor seriële communicatie waarbij het hele communicatieproces via software wordt afgehandeld in plaats van via speciale hardware. Om gegevens te verzenden, omvat de techniek het gebruik van software om de gegevens te coderen in signalen en pulsen die worden gebruikt om de toestand van een I / O-pin van een microcontroller te manipuleren die dient als de Tx-pin om gegevens naar het doelapparaat te verzenden. Om gegevens te ontvangen, omvat de techniek het bemonsteren van de toestand van de Rx-pin na bepaalde intervallen die worden bepaald door de communicatie-baudrate. De software stelt alle parameters in die nodig zijn om deze communicatie tot stand te brengen, inclusief synchronisatie, timing, niveaus enz., Die meestal worden bepaald door speciale hardware wanneer bit-banging niet wordt gebruikt.
Wanneer Bit Banging gebruiken
Bit-Banging wordt meestal gebruikt in situaties waarin een microcontroller met de vereiste interface niet beschikbaar is of wanneer het overschakelen naar een microcontroller met de vereiste interface te duur kan zijn. Het biedt dus een goedkope manier om hetzelfde apparaat via verschillende protocollen te laten communiceren. Een microcontroller die voorheen alleen was ingeschakeld voor UART-communicatie, kan worden uitgerust om te communiceren met SPI en 12C via bit-banging.
Algoritme voor seriële communicatie via Bit Banging
Hoewel de code om bit-banging te implementeren kan verschillen tussen verschillende microcontrollers en ook kan variëren voor verschillende seriële protocollen, is de procedure / het algoritme voor het implementeren van bit-banging op alle platforms hetzelfde.
Om gegevens te verzenden wordt bijvoorbeeld de onderstaande pseudo-code gebruikt;
- Begin
- Stuur startbit
- Wacht tot de timing overeenkomt met de baudrate van de ontvanger
- Stuur databit
- Wacht tot de duur opnieuw overeenkomt met de baudrate van de ontvanger
- Controleer of alle databits zijn verzonden. Zo nee, ga naar 4. Zo ja, ga naar 7
- Stuur een stopbit
- Hou op
Het ontvangen van gegevens is meestal iets ingewikkelder, meestal wordt een interrupt gebruikt om te bepalen wanneer gegevens beschikbaar zijn op de ontvangerpin. Dit helpt ervoor te zorgen dat de microcontroller niet te veel verwerkingskracht verspilt. Hoewel bepaalde implementaties een van de I / O-pinnen van de microcontrollers gebruiken, is de kans op ruis en fouten, zo niet waarschijnlijk behandeld, groter. Het algoritme om gegevens te ontvangen met behulp van interrupts wordt hieronder uitgelegd.
- Begin
- Schakel onderbreken op Rx-pin in
- Als de interrupt wordt geactiveerd, verkrijg dan de startbit
- Wacht op timing volgens de baudrate
- Lees de Rx-pin
- Herhaal vanaf 4 totdat alle gegevens zijn ontvangen
- Wacht op timing volgens de baudrate
- Controleer op stopbit
- Hou op
Beetje bonzen over SPI
Zoals hierboven vermeld, werken bit-banging voor verschillende protocollen anders en daarom is het belangrijk om over elk protocol te lezen, om dataframing en klokken te begrijpen voordat u probeert het te implementeren. Als we de SPI-modus 1 als voorbeeld nemen, is de basiswaarde van de klok altijd 0 en worden gegevens altijd verzonden of ontvangen op de stijgende flank van de klok. Het timingdiagram voor het SPI Mode 1-communicatieprotocol wordt hieronder weergegeven.
Om dit te implementeren, kan het volgende algoritme worden gebruikt;
- Begin
- Zet de SS-pin laag om de communicatie te starten
- Stel de pin voor Master Out Slave In (MOSI) in op het eerste bit van de te verzenden gegevens
- Stel de klokpen (SCK) hoog in, zodat gegevens worden verzonden door de master en ontvangen door de slaaf
- Lees de status van de Master in Slave Out (MISO) om de eerste bit gegevens van de slave te ontvangen
- Stel SCK Low in, zodat gegevens kunnen worden verzonden bij de volgende stijgende flank
- Ga naar 2 totdat alle databits zijn verzonden.
- Stel de SS-pin hoog in om de verzending te stoppen.
- Hou op
Voorbeeld van Bit Banging: SPI-communicatie in Arduino
Laten we als voorbeeld het algoritme voor SPI-communicatie implementeren via bit-banging in Arduino om te laten zien hoe gegevens bit- bang kunnen worden over SPI met behulp van de onderstaande code.
We beginnen met het declareren van de pinnen van de Arduino voor gebruik.
const int SSPin = 11; const int SCKPin = 10; const int MISOPin = 9; const int MOSIPin = 8; byte sendData = 64; // Te verzenden waarde byte slaveData = 0; // voor het opslaan van de waarde die door de slaaf is verzonden
Vervolgens gaan we naar de void setup () -functie waar de status van de pinnen wordt aangegeven. Alleen de Master in Slave out (MISO) -pin wordt als invoer gedeclareerd, aangezien dit de enige pin is die gegevens ontvangt. Alle andere pinnen worden gedeclareerd als uitvoer. Na het declareren van de pin-modi, wordt de SS-pin ingesteld op HIGH. De reden hiervoor is om ervoor te zorgen dat het proces foutloos verloopt en dat de communicatie pas begint als deze te laag is ingesteld.
void setup () { pinMode (MISOPin, INPUT); pinMode (SSPin, OUTPUT); pinMode (SCKPin, OUTPUT); pinMode (MOSIPin, OUTPUT); digitalWrite (SSPin, HIGH); }
Vervolgens starten we de lus om gegevens te verzenden. Merk op dat deze lus de data herhaaldelijk zal blijven verzenden.
We starten de lus door de SS-pin laag te schrijven, om het begin van de communicatie te starten, en doen een beroep op de bitbangdata- functie die de vooraf gedefinieerde gegevens in bits opsplitst en verzendt. Als dit klaar is, schrijven we vervolgens de SS-pin HIGH om het einde van de gegevensoverdracht aan te geven.
void loop () { digitalWrite (SSPin, LOW); // SS laag slaveData = bitBangData (sendData); // gegevensoverdracht digitalWrite (SSPin, HIGH); // SS weer hoog }
De bitbangdata () functie hieronder wordt geschreven. De functie neemt de te verzenden gegevens op en splitst deze op in bits en verzendt deze door de code voor de verzending door te lussen, zoals aangegeven in stap 7 van het algoritme.
byte bitBangData (byte _send) // Deze functie verzendt de gegevens via bitbanging { byte _receive = 0; for (int i = 0; i <8; i ++) // 8 bits in een byte { digitalWrite (MOSIPin, bitRead (_send, i)); // MOSI digitalWrite instellen (SCKPin, HIGH); // SCK high bitWrite (_receive, i, digitalRead (MISOPin)); // Capture MISO digitalWrite (SCKPin, LOW); // SCK low } return _receive; // Retourneer de ontvangen gegevens }
Nadelen van Bit Banging
Het adopteren van bit-banging zou echter een goed doordachte beslissing moeten zijn, aangezien er verschillende nadelen aan bit-banging zijn die het niet betrouwbaar maken voor implementatie in bepaalde oplossingen. Bitbanging verhoogt het stroomverbruik van de microcontroller vanwege het hoge verwerkingsvermogen dat door het proces wordt verbruikt. In vergelijking met speciale hardware treden meer communicatiefouten op, zoals glitches en jitters, wanneer bit-banging wordt gebruikt, vooral wanneer datacommunicatie wordt uitgevoerd door de microcontroller op hetzelfde moment als andere taken. Communicatie via bit-banging gebeurt met een fractie van de snelheid waarmee het gebeurt wanneer speciale hardware wordt gebruikt. Dit kan belangrijk zijn in bepaalde toepassingen en kan bitbangen een "niet zo goede" keuze maken.
Bitbanging wordt gebruikt voor alle soorten seriële communicatie, waaronder; RS-232, asynchrone seriële communicatie, UART, SPI en I2C.
UART via Bit-bonzen in Arduino
Een van de populaire implementaties van bit-banging is de Arduino Software Serial-bibliotheek waarmee de Arduino via UART kan communiceren zonder de speciale hardware UART-pinnen (D0 en D1) te gebruiken. Dit geeft veel flexibiliteit omdat gebruikers zoveel seriële apparaten kunnen aansluiten als het aantal pinnen op het Arduino-bord ondersteunt.