Studiamo l'interfaccia SPI e colleghiamo un registro a scorrimento all'Arduino, a cui accederemo utilizzando questo protocollo per controllare i LED.
Necessario
- -Arduino;
- - registro a scorrimento 74HC595;
- - 8 LED;
- - 8 resistenze da 220 Ohm.
Istruzioni
Passo 1
SPI - Serial Peripheral Interface o "Serial Peripheral Interface" è un protocollo di trasferimento dati sincrono per interfacciare un dispositivo master con dispositivi periferici (slave). Il master è spesso un microcontrollore. La comunicazione tra i dispositivi avviene su quattro fili, motivo per cui SPI viene talvolta definita "interfaccia a quattro fili". Questi pneumatici sono:
MOSI (Master Out Slave In) - linea di trasmissione dati dal master ai dispositivi slave;
MISO (Master In Slave Out) - linea di trasmissione dallo slave al master;
SCLK (Serial Clock) - impulsi di clock di sincronizzazione generati dal master;
SS (Slave Select) - linea di selezione del dispositivo slave; quando è sulla riga "0", lo slave "capisce" che si sta accedendo.
Esistono quattro modalità di trasferimento dati (SPI_MODE0, SPI_MODE1, SPI_MODE2, SPI_MODE3), dovute alla combinazione di polarità dell'impulso di clock (si lavora a livello ALTO o LOW), Polarità di clock, CPOL e la fase degli impulsi di clock (sincronizzazione sul fronte di salita o di discesa dell'impulso di clock), Clock Phase, CPHA.
La figura mostra due opzioni per il collegamento di dispositivi utilizzando il protocollo SPI: indipendente e in cascata. Quando è collegato in modo indipendente al bus SPI, il master comunica con ciascuno slave individualmente. Con una cascata - i dispositivi slave vengono attivati alternativamente, in cascata.
Passo 2
In Arduino, i bus SPI si trovano su porte specifiche. Ogni scheda ha la propria assegnazione dei pin. Per comodità, i pin sono duplicati e posizionati su un connettore ICSP (In Circuit Serial Programming) separato. Si prega di notare che non esiste un pin di selezione dello slave sul connettore ICSP - SS, poiché si presume che Arduino verrà utilizzato come master sulla rete. Ma se necessario, puoi assegnare qualsiasi pin digitale di Arduino come SS.
La figura mostra l'assegnazione standard dei pin ai bus SPI per Arduino UNO e Nano.
Passaggio 3
Per Arduino è stata scritta una libreria speciale che implementa il protocollo SPI. È collegato in questo modo: all'inizio del programma, aggiungi #include SPI.h
Per iniziare a lavorare con il protocollo SPI, è necessario definire le impostazioni e quindi inizializzare il protocollo utilizzando la procedura SPI.beginTransaction(). Puoi farlo con un'istruzione: SPI.beginTransaction (SPISettings (1400000, MSBFIRST, SPI_MODE0)).
Ciò significa che inizializziamo il protocollo SPI ad una frequenza di 14 MHz, il trasferimento dei dati va, partendo da MSB (bit più significativo), in modalità "0".
Dopo l'inizializzazione, selezioniamo il dispositivo slave mettendo il pin SS corrispondente nello stato LOW.
Quindi trasferiamo i dati al dispositivo slave con il comando SPI.transfer().
Dopo la trasmissione, riportiamo SS allo stato HIGH.
Il lavoro con il protocollo termina con il comando SPI.endTransaction(). È consigliabile ridurre al minimo il tempo di esecuzione del trasferimento tra le istruzioni SPI.beginTransaction() e SPI.endTransaction() in modo che non vi siano sovrapposizioni se un altro dispositivo tenta di inizializzare il trasferimento dati utilizzando impostazioni diverse.
Passaggio 4
Consideriamo l'applicazione pratica dell'interfaccia SPI. Accenderemo i LED controllando il registro a scorrimento a 8 bit tramite il bus SPI. Colleghiamo il registro a scorrimento 74HC595 ad Arduino. Ci colleghiamo a ciascuna delle 8 uscite tramite un LED (attraverso un resistore di limitazione). Il diagramma è mostrato in figura.
Passaggio 5
Scriviamo un tale schizzo.
Innanzitutto, colleghiamo la libreria SPI e inizializziamo l'interfaccia SPI. Definiamo il pin 8 come pin di selezione dello slave. Cancelliamo il registro a scorrimento inviandogli il valore "0". Inizializziamo la porta seriale.
Per accendere un LED specifico utilizzando un registro a scorrimento, è necessario applicare un numero a 8 bit al suo ingresso. Ad esempio, affinché il primo LED si accenda, alimentiamo il numero binario 00000001, per il secondo - 00000010, per il terzo - 00000100, ecc. Questi numeri binari in notazione decimale formano la seguente sequenza: 1, 2, 4, 8, 16, 32, 64, 128 e sono potenze di due da 0 a 7.
Di conseguenza, nel loop () per il numero di LED, ricalcoliamo da 0 a 7. La funzione pow (base, degree) eleva 2 alla potenza del contatore di cicli. I microcontrollori non funzionano in modo molto accurato con i numeri di tipo "doppio", quindi per convertire il risultato in un numero intero, utilizziamo la funzione round(). E trasferiamo il numero risultante al registro a scorrimento. Per chiarezza, il monitor della porta seriale visualizza i valori che si ottengono durante questa operazione: uno scorre attraverso le cifre - i LED si accendono in un'onda.
Passaggio 6
I LED si accendono a turno e osserviamo un "onda" di luci che viaggia. I LED sono controllati tramite un registro a scorrimento, a cui ci siamo collegati tramite l'interfaccia SPI. Di conseguenza, vengono utilizzati solo 3 pin Arduino per pilotare 8 LED.
Abbiamo studiato l'esempio più semplice di come funziona un Arduino con un bus SPI. Considereremo la connessione dei registri a turno in modo più dettagliato in un articolo separato.