- Cos'è il protocollo di comunicazione SPI?
- Come funziona il protocollo SPI?
- Differenza tra comunicazione I2C e SPI
- SPI con PIC16F877A utilizzando il compilatore XC8:
- Spiegazione del file di intestazione SPI:
- Programma principale Spiegazione:
- Simulazione di PIC con debugger SPI:
I microcontrollori PIC sono una potente piattaforma fornita da microchip per progetti embedded; la sua natura versatile gli ha permesso di trovare la strada in molte applicazioni e deve ancora crescere molto. Se hai seguito i nostri tutorial PIC, avresti notato che abbiamo già coperto una vasta gamma di tutorial sul microcontrollore PIC partendo dalle basi. Nello stesso flusso stiamo procedendo all'apprendimento dei protocolli di comunicazione disponibili con PIC e come utilizzarli. Abbiamo già coperto I2C con PIC Microcontroller.
Nel vasto sistema di applicazioni embedded, nessun microcontrollore può eseguire da solo tutte le attività. Ad un certo punto del tempo deve comunicare con altri dispositivi per condividere informazioni, ci sono molti diversi tipi di protocolli di comunicazione per condividere queste informazioni, ma i più utilizzati sono USART, IIC, SPI e CAN. Ogni protocollo di comunicazione ha i suoi vantaggi e svantaggi. Concentriamoci sul protocollo SPI per ora poiché è quello che impareremo in questo tutorial.
Cos'è il protocollo di comunicazione SPI?
Il termine SPI sta per " Serial Peripheral Interface ". È un protocollo di comunicazione comune utilizzato per inviare dati tra due microcontrollori o per leggere / scrivere dati da un sensore a un microcontrollore. Viene anche utilizzato per comunicare con schede SD, registri a scorrimento, controller del display e molto altro.
Come funziona il protocollo SPI?
La comunicazione SPI è una comunicazione sincrona, il che significa che funziona con l'aiuto di un segnale di clock condiviso tra i due dispositivi che stanno scambiando i dati. Inoltre è una comunicazione full-duplex perché può inviare e ricevere dati utilizzando un bus separato. La comunicazione SPI richiede 5 fili per funzionare. Di seguito è mostrato un semplice circuito di comunicazione SPI tra un master e uno slave
I cinque fili necessari per la comunicazione sono SCK (Serial Clock), MOSI (Master Out Slave In), MISO (Master In Slave Out) e SS (Slave Select). La comunicazione SPI avviene sempre solo tra un master e uno slave. Un master può avere più slave collegati ad esso. Il master è responsabile della generazione dell'impulso di clock e lo stesso è condiviso con tutti gli slave. Inoltre tutte le comunicazioni possono essere avviate solo dal master.
Il pin SCK (noto anche come orologio seriale SCL) condivide il segnale di clock generato dal master con gli slave. Il pin MOSI (noto anche come SDA –Serial Data Out) viene utilizzato per inviare i dati dal master al salve. Il pin MISO (noto anche come SDI - Serial Data In) viene utilizzato per ottenere i dati dalla salvezza al master. È inoltre possibile seguire la freccia nella figura sopra per comprendere il movimento di dati / segnali. Infine, il pin SS (noto anche come CS –Chip select) viene utilizzato quando al master sono collegati più moduli slave. Può essere utilizzato per selezionare lo slave richiesto. Un circuito di esempio in cui più di uno slave è collegato al master per la comunicazione SPI è mostrato nel circuito sottostante.
Differenza tra comunicazione I2C e SPI
Abbiamo già imparato la comunicazione I2C con PIC e quindi dobbiamo avere familiarità con come funziona I2C e dove possiamo usarli come I2C può essere usato per interfacciare il modulo RTC. Ma ora, perché abbiamo bisogno del protocollo SPI quando abbiamo già I2C. Il motivo è che sia le comunicazioni I2C che SPI sono vantaggi a modo loro e quindi sono specifiche dell'applicazione.
In una certa misura si può considerare che la comunicazione I2C presenti alcuni vantaggi rispetto alla comunicazione SPI perché I2C utilizza un numero inferiore di pin ed è molto utile quando c'è un gran numero di slave collegati al bus. Ma lo svantaggio di I2C è che ha lo stesso bus per inviare e ricevere dati e quindi è relativamente lento. Quindi è puramente basato sull'applicazione per decidere tra il protocollo SPI e I2C per il tuo progetto.
SPI con PIC16F877A utilizzando il compilatore XC8:
Basta con le basi, ora impariamo come possiamo usare la comunicazione SPI sul microcontrollore PIC16F877A usando l'IDE MPLABX e il compilatore XC8. Prima di iniziare chiarire che questo tutorial parla solo di SPI in PIC16F877a utilizzando il compilatore XC8, il processo sarà lo stesso per altri microcontrollori ma potrebbero essere necessarie lievi modifiche. Ricorda anche che per microcontrollori avanzati come la serie PIC18F il compilatore stesso potrebbe avere alcune librerie integrate per utilizzare le funzionalità SPI, ma per PIC16F877A non esiste nulla del genere, quindi costruiamone una da soli. La libreria spiegata qui verrà fornita come file di intestazione per il download in basso che può essere utilizzato per PIC16F877A per comunicare con altri dispositivi SPI.
In questo tutorial scriveremo un piccolo programma che utilizza la comunicazione SPI per scrivere e leggere i dati dal bus SPI. Verificheremo quindi lo stesso utilizzando la simulazione Proteus. Tutto il codice relativo ai registri SPI verrà realizzato all'interno del file header denominato PIC16f877a_SPI.h. In questo modo possiamo utilizzare questo file di intestazione in tutti i nostri prossimi progetti in cui è richiesta la comunicazione SPI. E all'interno del programma principale useremo solo le funzioni dal file di intestazione. Il codice completo insieme al file di intestazione può essere scaricato da qui.
Spiegazione del file di intestazione SPI:
All'interno del file di intestazione dobbiamo inizializzare la comunicazione SPI per PIC16F877a. Come sempre il miglior punto di partenza è il datasheet PIC16F877A. I registri che controllano la comunicazione SPI per PIC16F8777a sono SSPSTAT e SSPCON Register. Puoi parlarne a pagina 74 e 75 della scheda tecnica.
Ci sono molte opzioni di parametri che devono essere scelte durante l'inizializzazione della comunicazione SPI. L'opzione più comunemente utilizzata è che la frequenza di clock sarà impostata su Fosc / 4 e verrà eseguita a metà e l'orologio sarà impostato come basso allo stato ideale. Quindi stiamo usando la stessa configurazione anche per il nostro file di intestazione, puoi cambiarli facilmente cambiando i rispettivi bit.
SPI_Initialize_Master ()
La funzione di inizializzazione master SPI viene utilizzata per avviare la comunicazione SPI come master. All'interno di questa funzione impostiamo i rispettivi pin RC5 e RC3 come pin di uscita. Quindi configuriamo SSPTAT e il registro SSPCON per attivare le comunicazioni SPI
void SPI_Initialize_Master () { TRISC5 = 0; // SSPSTAT = 0b00000000; // pg 74/234 SSPCON = 0b00100000; // pg 75/234 TRISC3 = 0; // Imposta come uscita per modalità slave }
SPI_Initialize_Slave ()
Questa funzione viene utilizzata per impostare il microcontrollore in modo che funzioni in modalità slave per la comunicazione SPI. Durante la modalità slave il pin RC5 dovrebbe essere impostato come output e il pin RC3 dovrebbe essere impostato come input. SSPSTAT e SSPCON sono impostati allo stesso modo sia per lo slave che per il master.
void SPI_Initialize_Slave () { TRISC5 = 0; // Il pin SDO deve essere dichiarato come output SSPSTAT = 0b00000000; // pg 74/234 SSPCON = 0b00100000; // pg 75/234 TRISC3 = 1; // Imposta come in out per la modalità master }
SPI_Write (caratteri in arrivo)
La funzione SPI Write viene utilizzata per scrivere dati nel bus SPI. Ottiene le informazioni dall'utente tramite la variabile in entrata e quindi le utilizza per passare al registro Buffer. L'SSPBUF verrà cancellato nell'impulso di clock consecutivo ei dati verranno inviati nel bus bit per bit.
void SPI_Write (char in arrivo) { SSPBUF = in arrivo; // Scrive i dati forniti dall'utente nel buffer }
SPI_Ready2Read ()
La funzione SPI ready to Read viene utilizzata per verificare se i dati nel bus SPI vengono ricevuti completamente e se possono essere letti. Il registro SSPSTAT ha un bit chiamato BF che verrà impostato una volta che i dati sono stati ricevuti completamente, quindi controlliamo se questo bit è impostato se non è impostato, dobbiamo aspettare che venga impostato per leggere qualcosa dal bus SPI.
SPI_Ready2Read () { if (SSPSTAT & 0b00000001) restituisce 1; altrimenti restituisce 0; }
SPI_Read ()
SPI Read viene utilizzato per leggere i dati dal bus SPI al microcontrollore. I dati presenti nel bus SPI verranno memorizzati nel SSPBUF, dobbiamo aspettare che i dati completi vengano memorizzati nel Buffer e poi possiamo leggerli in una variabile. Controlliamo il bit BF del registro SSPSTAT prima di leggere il buffer per assicurarci che la ricezione dei dati sia completa.
char SPI_Read () // Legge i dati ricevuti { while (! SSPSTATbits.BF); // Tenere premuto fino a quando il bit BF è impostato, per assicurarsi che i dati completi vengano letti di ritorno (SSPBUF); // restituisce i dati letti }
Programma principale Spiegazione:
Le funzioni spiegate nella sezione precedente saranno nel file di intestazione e possono essere chiamate nel file c principale. Quindi scriviamo un piccolo programma per verificare se la comunicazione SPI funziona. Scriveremo solo pochi dati nel bus SPI e utilizzeremo la simulazione di proteus per verificare se gli stessi dati vengono ricevuti nel debugger SPI.
Come sempre inizia il programma impostando i bit di configurazione e poièmolto importante aggiungere il file di intestazione che abbiamo appena spiegato nel programma come mostrato di seguito
#includere
Se hai aperto il programma dal file zip scaricato sopra, per impostazione predefinita il file di intestazione sarà presente nella directory del file di intestazione del file di progetto. Altrimenti devi aggiungere manualmente il file di intestazione all'interno del tuo progetto, una volta aggiunti i tuoi file di progetto appariranno come questo di seguito
All'interno del file principale dobbiamo inizializzare il PIC come Master per la comunicazione SPI e quindi all'interno di un ciclo while infinito scriveremo tre valori esadecimali casuali nel bus SPI per verificare se riceviamo lo stesso durante la simulazione.
void main () { SPI_Initialize_Master (); while (1) { SPI_Write (0X0A); __delay_ms (100); SPI_Write (0X0F); __delay_ms (100); SPI_Write (0X15); __delay_ms (100); } }
Si noti che i valori casuali utilizzati nel programma sono 0A, 0F e 15 e sono valori esadecimali, quindi dovremmo vedere lo stesso durante la simulazione. Cioè, il codice è tutto fatto, questo è solo un esempio ma possiamo usare la stessa metodologia per comunicare con altri MCU o con altri moduli sensori che operano su protocollo SPI.
Simulazione di PIC con debugger SPI:
Ora che il nostro programma è pronto possiamo compilarlo e poi procedere con la simulazione. Proteus ha una caratteristica utile chiamata debugger SPI , che può essere utilizzata per monitorare i dati su un bus SPI. Quindi usiamo lo stesso e costruiamo un circuito come mostrato di seguito.
Poiché nella simulazione è presente un solo dispositivo SPI, non stiamo utilizzando il pin SS e quando non viene utilizzato dovrebbe essere collegato a terra come mostrato sopra. Basta caricare il file esadecimale nel microcontrollore PIC16F877A e fare clic sul pulsante di riproduzione per simulare il nostro programma. Una volta avviata la simulazione, apparirà una finestra pop-up che mostra i dati nel bus SPI come mostrato di seguito
Diamo un'occhiata più da vicino ai dati in arrivo e controlliamo se è uguale a quello che abbiamo scritto nel nostro programma.
I dati vengono ricevuti nello stesso ordine che abbiamo scritto nel nostro programma e lo stesso viene evidenziato per te. Puoi anche provare a simulare un programma per comunicare con due microcontrollori PIC utilizzando il protocollo SPI. Devi programmare un PIC come master e l'altro come slave. Tutti i file di intestazione richiesti per questo scopo sono già presenti nel file di intestazione.
Questo è solo un assaggio di ciò che può fare SPI, può anche leggere e scrivere dati su più dispositivi. Tratteremo di più su SPI nei nostri prossimi tutorial interfacciando vari moduli che funzionano con il protocollo SPI.
Spero che tu abbia capito il progetto e imparato qualcosa di utile da esso. Se hai dei dubbi, pubblicali nella sezione commenti qui sotto o usa i forum per assistenza tecnica.
Il codice principale completo è stato fornito di seguito; puoi scaricare i file di intestazione con tutto il codice da qui