- Cos'è Bit Banging?
- Quando usare Bit Banging
- Algoritmo per la comunicazione seriale tramite Bit Banging
- Bit sbattendo su SPI
- Esempio di Bit Banging: comunicazione SPI in Arduino
- Svantaggi di Bit Banging
- UART tramite Bit che batte in Arduino
Le interfacce di comunicazione sono uno dei fattori da considerare quando si seleziona un microcontrollore da utilizzare per un progetto. Il progettista assicura che il microcontrollore selezionato abbia tutte le interfacce necessarie per comunicare con tutti gli altri componenti da utilizzare per il prodotto. L'esistenza di alcune di queste interfacce come SPI e I2C sul microcontrollore aumenta invariabilmente il costo di tali microcontrollori e, a seconda del budget BOM, potrebbe rendere un microcontrollore desiderato non conveniente. In situazioni come queste entrano in gioco tecniche come Bit Banging.
Cos'è Bit Banging?
Il bit banging è una tecnica per la comunicazione seriale in cui l'intero processo di comunicazione viene gestito tramite software anziché hardware dedicato. Per trasmettere i dati, la tecnica prevede l'uso di un software per codificare i dati in segnali e impulsi che vengono utilizzati per manipolare lo stato di un pin I / O di un microcontrollore che funge da pin Tx per inviare dati al dispositivo di destinazione. Per ricevere i dati, la tecnica prevede il campionamento dello stato del pin Rx dopo determinati intervalli che sono determinati dalla velocità di trasmissione della comunicazione. Il software imposta tutti i parametri necessari per ottenere questa comunicazione inclusi sincronizzazione, temporizzazione, livelli ecc., Che di solito vengono decisi da hardware dedicato quando non si utilizza il bit banging.
Quando usare Bit Banging
Bit-Banging viene solitamente utilizzato in situazioni in cui un microcontrollore con l'interfaccia richiesta non è disponibile o quando il passaggio a un microcontrollore con l'interfaccia richiesta potrebbe essere troppo costoso. Fornisce quindi un modo economico per consentire allo stesso dispositivo di comunicare utilizzando diversi protocolli. Un microcontrollore che è stato precedentemente abilitato solo per la comunicazione UART, può essere equipaggiato per comunicare usando SPI e 12C tramite bit banging.
Algoritmo per la comunicazione seriale tramite Bit Banging
Sebbene il codice per implementare il bit banging possa differire tra diversi microcontrollori e può anche variare per diversi protocolli seriali, la procedura / algoritmo per l'implementazione del bit banging è lo stesso su tutte le piattaforme.
Per inviare dati, ad esempio, viene utilizzato lo pseudo-codice di seguito;
- Inizio
- Invia bit di inizio
- Attendere che la temporizzazione corrisponda alla velocità di trasmissione del ricevitore
- Invia bit di dati
- Attendere che la durata corrisponda nuovamente alla velocità di trasmissione del ricevitore
- Verificare che tutti i bit di dati siano stati inviati. Se no, vai a 4. Se sì, vai a 7
- Invia bit di stop
- Fermare
La ricezione dei dati tende ad essere un po 'più complessa, di solito viene utilizzato un interrupt per determinare quando i dati sono disponibili sul pin del ricevitore. Questo aiuta a garantire che il microcontrollore non sprechi troppa potenza di elaborazione. Sebbene alcune implementazioni utilizzino uno qualsiasi dei pin I / O dei microcontrollori, le possibilità di rumore ed errori, se non probabilmente gestite, sono maggiori. L'algoritmo per ricevere i dati utilizzando gli interrupt è spiegato di seguito.
- Inizio
- Abilita interrupt sul pin Rx
- Quando viene attivato l'interrupt, ottenere il bit di avvio
- Attendere la temporizzazione in base alla velocità di trasmissione
- Leggi il pin Rx
- Ripeti da 4 fino a quando tutti i dati sono stati ricevuti
- Attendere la temporizzazione in base alla velocità di trasmissione
- Controlla il bit di stop
- Fermare
Bit sbattendo su SPI
Come accennato in precedenza, il bit banging per diversi protocolli funziona in modo diverso ed è quindi importante leggere informazioni su ciascun protocollo, per comprendere il data framing e il clock prima di tentare di implementarlo. Prendendo come esempio la modalità SPI 1, il valore di base dell'orologio è sempre 0 e i dati vengono sempre inviati o ricevuti sul fronte di salita dell'orologio. Di seguito è mostrato il diagramma temporale per il protocollo di comunicazione SPI Mode 1.
Per implementare ciò, è possibile utilizzare il seguente algoritmo;
- Inizio
- Impostare il pin SS basso per iniziare la comunicazione
- Impostare il pin per Master Out Slave In (MOSI) sul primo bit dei dati da inviare
- Impostare il pin del clock (SCK) alto in modo che i dati vengano trasmessi dal master e ricevuti dallo slave
- Leggere lo stato del Master in Slave Out (MISO) per ricevere il primo bit di dati dallo slave
- Impostare SCK basso, in modo che i dati possano essere inviati sul successivo fronte di salita
- Vai a 2 finché tutti i bit di dati non sono stati trasmessi.
- Impostare il pin SS alto per interrompere la trasmissione.
- Fermare
Esempio di Bit Banging: comunicazione SPI in Arduino
Ad esempio, implementiamo l'algoritmo per la comunicazione SPI tramite bit bang in Arduino per mostrare come i dati possono essere bit-bang su SPI utilizzando il codice seguente.
Iniziamo dichiarando i pin di Arduino da utilizzare.
const int SSPin = 11; const int SCKPin = 10; const int MISOPin = 9; const int MOSIPin = 8; byte sendData = 64; // Valore da inviare byte slaveData = 0; // per memorizzare il valore inviato dallo slave
Successivamente, passiamo alla funzione void setup () in cui viene dichiarato lo stato dei pin. Solo il pin Master in Slave out (MISO) viene dichiarato come ingresso poiché è l'unico pin che riceve i dati. Tutti gli altri pin vengono dichiarati come output. Dopo aver dichiarato le modalità pin, il pin SS è impostato su HIGH. Il motivo è garantire che il processo sia privo di errori e che la comunicazione inizi solo quando è impostato su basso.
void setup () { pinMode (MISOPin, INPUT); pinMode (SSPin, OUTPUT); pinMode (SCKPin, OUTPUT); pinMode (MOSIPin, OUTPUT); digitalWrite (SSPin, HIGH); }
Successivamente, iniziamo il ciclo per inviare i dati. Notare che questo ciclo continuerà a inviare i dati ripetutamente.
Iniziamo il ciclo scrivendo il pin SS basso, per iniziare l'inizio della comunicazione, e chiamiamo la funzione bitbangdata che spezza i dati predefiniti in bit e li invia. Fatto ciò, scriviamo il pin SS HIGH per indicare la fine della trasmissione dei dati.
void loop () { digitalWrite (SSPin, LOW); // SS slaveData basso = bitBangData (sendData); // trasmissione dati digitalWrite (SSPin, HIGH); // SS di nuovo in alto }
Il bitbangdata () la funzione è scritto di seguito. La funzione prende i dati da inviare e li scompone in bit e li invia ripetendo il codice per la trasmissione come indicato nella fase 7 dell'algoritmo.
byte bitBangData (byte _send) // Questa funzione trasmette i dati tramite bitbanging { byte _receive = 0; for (int i = 0; i <8; i ++) // 8 bit in un byte { digitalWrite (MOSIPin, bitRead (_send, i)); // Imposta MOSI digitalWrite (SCKPin, HIGH); // SCK bitWrite alto (_receive, i, digitalRead (MISOPin)); // Cattura MISO digitalWrite (SCKPin, LOW); // SCK basso } return _receive; // Restituisce i dati ricevuti }
Svantaggi di Bit Banging
Adottare il bit bang dovrebbe tuttavia essere una decisione ben ponderata poiché ci sono diversi aspetti negativi nel bit banging che potrebbero renderlo non affidabile per l'implementazione in determinate soluzioni. Il bit bang aumenta la potenza consumata dal microcontrollore a causa dell'elevata potenza di elaborazione consumata dal processo. Rispetto all'hardware dedicato, si verificano più errori di comunicazione come glitch e jitters quando viene utilizzato il bit bang, specialmente quando la comunicazione dei dati viene eseguita dal microcontrollore contemporaneamente ad altre attività. La comunicazione tramite bit banging avviene a una frazione della velocità con cui si verifica quando si utilizza hardware dedicato. Questo può essere importante in alcune applicazioni e può rendere il bit bang una scelta "non così buona".
Il bit banging viene utilizzato per tutti i tipi di comunicazioni seriali inclusi; RS-232, comunicazione seriale asincrona, UART, SPI e I2C.
UART tramite Bit che batte in Arduino
Una delle implementazioni più diffuse del bit banging è la libreria seriale software Arduino che consente ad Arduino di comunicare tramite UART senza utilizzare i pin UART hardware dedicati (D0 e D1). Ciò offre molta flessibilità in quanto gli utenti possono collegare tutti i dispositivi seriali che il numero di pin sulla scheda Arduino può supportare.