- Què és el protocol de comunicació SPI?
- Com funciona el protocol SPI?
- Diferència entre la comunicació I2C i SPI
- SPI amb PIC16F877A mitjançant el compilador XC8:
- Fitxer de capçalera SPI Explicació:
- Programa principal Explicació:
- Simulació de PIC amb el depurador SPI:
Els microcontroladors PIC són una potent plataforma proporcionada pel microxip per a projectes incrustats; la seva versatilitat li ha permès trobar vies per a moltes aplicacions i encara ha de créixer molt. Si heu seguit els nostres tutorials PIC, hauríeu notat que ja hem cobert una àmplia gamma de tutorials sobre el microcontrolador PIC a partir dels fonaments bàsics. En el mateix flux estem procedint a aprendre els protocols de comunicació disponibles amb PIC i com utilitzar-los. Ja hem cobert I2C amb microcontrolador PIC.
En el vast sistema d'aplicacions incrustades, cap microcontrolador pot realitzar totes les activitats per si mateix. En algun moment del temps ha de comunicar-se amb altres dispositius per compartir informació, hi ha molts tipus diferents de protocols de comunicació per compartir aquesta informació, però els més utilitzats són USART, IIC, SPI i CAN. Cada protocol de comunicació té el seu propi avantatge i desavantatge. Centrem-nos en el protocol SPI per ara, ja que això és el que aprendrem en aquest tutorial.
Què és el protocol de comunicació SPI?
El terme SPI significa " Interfície perifèrica en sèrie ". És un protocol de comunicació comú que s’utilitza per enviar dades entre dos microcontroladors o per llegir / escriure dades d’un sensor a un microcontrolador. També s’utilitza per comunicar-se amb targetes SD, registres de desplaçament, controladors de pantalla i molt més.
Com funciona el protocol SPI?
La comunicació SPI és una comunicació síncrona, és a dir, funciona amb l'ajut d'un senyal de rellotge que es comparteix entre els dos dispositius que intercanvien les dades. També és una comunicació full-duplex perquè pot enviar i rebre dades mitjançant un bus independent. La comunicació SPI requereix 5 cables per funcionar. A continuació es mostra un circuit de comunicació SPI simple entre un mestre i un esclau

Els cinc cables necessaris per a la comunicació són SCK (Serial Clock), MOSI (Master Out Slave In), MISO (Master In Slave Out) i SS (Slave Select). La comunicació SPI sempre té lloc només entre un mestre i un esclau. Un mestre pot tenir-hi diversos esclaus connectats. El mestre és responsable de generar el pols del rellotge i el mateix es comparteix amb tots els esclaus. També totes les comunicacions només les pot iniciar el mestre.
El pin SCK (també conegut com a rellotge de sèrie SCL) comparteix el senyal de rellotge que genera el mestre amb els esclaus. El pin MOSI (també conegut com SDA –Serial Data Out) s’utilitza per enviar les dades del mestre al salve. El pin MISO (també conegut com SDI - Serial Data In) s’utilitza per obtenir les dades de la bola al mestre. També podeu seguir la marca de fletxa de la figura anterior per entendre el moviment de les dades / senyal. Finalment, s'utilitza el pin SS (també conegut com CS –Chip select) quan hi ha més d'un mòdul esclau connectat al mestre. Es pot utilitzar per seleccionar l'esclau requerit. Al circuit següent es mostra un circuit de mostra on hi ha més d’un esclau connectat amb el mestre per a la comunicació SPI.

Diferència entre la comunicació I2C i SPI
Ja hem après la comunicació I2C amb PIC i, per tant, hem d’estar familiaritzats amb el funcionament de I2C i on podem utilitzar-los com si es pogués utilitzar I2C per a la interfície del mòdul RTC. Però ara, per què necessitem el protocol SPI quan ja tenim I2C? La raó és que les comunicacions I2C i SPI són avantatges a la seva manera i, per tant, són específiques de l’aplicació.
En certa mesura, es pot considerar que la comunicació I2C té alguns avantatges respecte a la comunicació SPI perquè I2C utilitza menys nombre de pins i és molt útil quan hi ha un gran nombre d’esclaus connectats al bus. Però l’inconvenient d’I2C és que té el mateix bus per enviar i rebre dades i, per tant, és relativament lent. Per tant, es basa exclusivament en l’aplicació per decidir entre el protocol SPI i I2C del vostre projecte.
SPI amb PIC16F877A mitjançant el compilador XC8:
Prou de conceptes bàsics, ara anem a conèixer com podem utilitzar la comunicació SPI al microcontrolador PIC16F877A mitjançant el compilador MPLABX IDE i XC8. Abans de començar, deixeu clar que aquest tutorial només parla d' SPI a PIC16F877a mitjançant el compilador XC8, el procés serà el mateix per a altres microcontroladors, però és possible que siguin necessaris canvis lleus. Recordeu també que per a microcontroladors avançats com la sèrie PIC18F, el propi compilador pot tenir alguna biblioteca incorporada per utilitzar les funcions SPI, però per a PIC16F877A no existeix res semblant, així que construïm-ne un pel nostre compte. La biblioteca que s’explica aquí es donarà com a fitxer de capçalera per descarregar a la part inferior, que es pot utilitzar per a PIC16F877A per comunicar-se amb altres dispositius SPI.
En aquest tutorial escriurem un petit programa que utilitza la comunicació SPI per escriure i llegir dades del bus SPI. A continuació, verificarem el mateix mitjançant la simulació Proteus. Tot el codi relacionat amb els registres SPI es farà dins del fitxer de capçalera anomenat PIC16f877a_SPI.h. D'aquesta manera, podem utilitzar aquest fitxer de capçalera en tots els nostres propers projectes en què es requereixi una comunicació SPI. I dins del programa principal, només farem servir les funcions del fitxer de capçalera. El codi complet junt amb el fitxer de capçalera es pot descarregar des d’aquí.
Fitxer de capçalera SPI Explicació:
Dins del fitxer de capçalera hem d'inicialitzar la comunicació SPI per a PIC16F877a. Com sempre, el millor lloc per començar és el full de dades PIC16F877A. Els registres que controlen la comunicació SPI per al PIC16F8777a són el SSPSTAT i el registre SSPCON. Podeu consultar-los a les pàgines 74 i 75 del full de dades.
Hi ha moltes opcions de paràmetres que cal triar durant la inicialització de la comunicació SPI. L'opció més utilitzada és que la freqüència del rellotge s'estableixi en Fosc / 4 i es faci al mig i el rellotge es definirà com a baix en l'estat ideal. Per tant, també estem utilitzant la mateixa configuració per al fitxer de capçalera; podeu canviar-los fàcilment canviant els bits respectius.
SPI_Initialize_Master ()
La funció Master SPI initialize s’utilitza per iniciar la comunicació SPI com a master. Dins d’aquesta funció configurem els respectius pins RC5 i RC3 com a pins de sortida. A continuació, configurem el registre SSPTAT i SSPCON per activar les comunicacions SPI
void SPI_Initialize_Master () { TRISC5 = 0; // SSPSTAT = 0b00000000; // pàg 74/234 SSPCON = 0b00100000; // pàg 75/234 TRISC3 = 0; // Establir com a sortida per a la manera esclau }
SPI_Initialize_Slave ()
Aquesta funció s'utilitza per configurar el microcontrolador perquè funcioni en mode esclau per a la comunicació SPI. Durant el mode esclau, el pin RC5 s'ha de configurar com a sortida i el pin RC3 com a entrada. SSPSTAT i SSPCON es configuren de la mateixa manera tant per a l'esclau com per al mestre.
void SPI_Initialize_Slave () { TRISC5 = 0; // El PIN SDO s'ha de declarar com a sortida SSPSTAT = 0b00000000; // pàg 74/234 SSPCON = 0b00100000; // pàg 75/234 TRISC3 = 1; // Estableix com a sortida per al mode mestre }
SPI_Write (caràcters entrants)
La funció SPI Write s’utilitza per escriure dades al bus SPI. Obté la informació de l'usuari a través de la variable entrant i després la fa servir per passar al registre de memòria intermèdia. El SSPBUF s'esborrarà en el pols de rellotge consecutiu i les dades s'enviaran al bus bit a bit.
void SPI_Write (char entrant) { SSPBUF = entrant; // Escriviu les dades donades per l'usuari al buffer }
SPI_Ready2Read ()
La funció SPI ready to Read s’utilitza per comprovar si les dades del bus SPI es reben completament i si es poden llegir. El registre SSPSTAT té un bit anomenat BF que s’establirà una vegada que les dades s’han rebut completament, de manera que comprovem si aquest bit està definit si no està configurat, hem d’esperar fins que es posi a llegir qualsevol cosa del bus SPI.
unsigned SPI_Ready2Read () { if (SSPSTAT & 0b00000001) retorna 1; en cas contrari, retorna 0; }
SPI_Read ()
La lectura SPI s’utilitza per llegir les dades del bus SPI al microcontrolador. Les dades presents al bus SPI s’emmagatzemaran al SSPBUF, hem d’esperar fins que les dades completes s’emmagatzemin al buffer i després podem llegir-les en una variable. Comprovem el bit BF del registre SSPSTAT abans de llegir la memòria intermèdia per assegurar-nos que la recepció de dades estigui completa.
char SPI_Read () // Llegiu les dades rebudes { while (! SSPSTATbits.BF); // Mantenir fins que el bit BF estigui configurat, per assegurar-se que es llegeixen les dades completes (SSPBUF); // torna les dades llegides }
Programa principal Explicació:
Les funcions explicades a la secció anterior es trobaran al fitxer de capçalera i es poden cridar al fitxer c principal. Escrivim, doncs, un petit programa per comprovar si la comunicació SPI funciona. Simplement escriurem poques dades al bus SPI i utilitzarem la simulació proteus per comprovar si s’estan rebent les mateixes dades al depurador SPI.
Com sempre, comenceu el programa configurant els bits de configuració i, a continuació, és molt important afegir el fitxer de capçalera que acabem d’explicar al programa com es mostra a continuació.
#incloure
Si heu obert el programa des del fitxer zip descarregat anteriorment, per defecte el fitxer de capçalera estarà present al directori del fitxer de capçalera del fitxer del projecte. Altrament, haureu d'afegir el fitxer de capçalera manualment dins del vostre projecte; un cop afegits, els fitxers del projecte tindran l'aspecte següent

Dins del fitxer principal hem d’ inicialitzar el PIC com a Mestre per a la comunicació SPI i, a continuació, dins d’un bucle infinit mentre escrivim tres valors aleatoris hexadecimals al bus SPI per comprovar si rebem el mateix durant la simulació.
void main () { SPI_Initialize_Master (); mentre que (1) { SPI_Write (0X0A); __delay_ms (100); SPI_Write (0X0F); __delay_ms (100); SPI_Write (0X15); __delay_ms (100); } }
Fixeu-vos que els valors aleatoris que s’utilitzen al programa són 0A, 0F i 15 i que són valors hexadecimals, de manera que hauríem de veure el mateix durant la simulació. És a dir, el codi està fet, això és només una mostra, però podem utilitzar la mateixa metodologia per comunicar-nos amb altres MCU o amb altres mòduls de sensors que funcionen amb protocol SPI.
Simulació de PIC amb el depurador SPI:
Ara que el nostre programa està a punt, podem compilar-lo i procedir a la simulació. Proteus té una funció molt útil i útil anomenada depurador SPI , que es pot utilitzar per controlar les dades a través d’un bus SPI. Per tant, fem servir el mateix i construïm un circuit com es mostra a continuació.

Com que només hi ha un dispositiu SPI a la simulació , no estem utilitzant el pin SS i, quan no s’utilitzi, s’hauria de connectar a terra tal com es mostra més amunt. Simplement carregueu el fitxer hexadecimal al microcontrolador PIC16F877A i feu clic al botó de reproducció per simular el nostre programa. Un cop comenci la simulació, obtindreu una finestra emergent que mostrarà les dades al bus SPI tal com es mostra a continuació

Vegem de més a prop les dades que arriben i comprovem si són les mateixes que les que vam escriure al nostre programa.

Les dades es reben en el mateix ordre que vam escriure al nostre programa i es ressalta el mateix. També podeu provar de simular un programa per comunicar-vos amb dos microcontroladors PIC mitjançant el protocol SPI. Heu de programar un PIC com a mestre i l’altre com a esclau. Tots els fitxers de capçalera necessaris per a aquest propòsit ja es donen al fitxer de capçalera.
Això és només una idea del que pot fer SPI, també pot llegir i escriure dades en diversos dispositius. Trobarem més informació sobre SPI als nostres propers tutorials mitjançant la interfície de diversos mòduls que funcionen amb el protocol SPI.
Espero que hagueu entès el projecte i n’heu après alguna cosa útil. Si teniu cap dubte, publiqueu-los a la secció de comentaris de sota o utilitzeu els fòrums per obtenir ajuda tècnica.
A continuació es dóna el codi principal complet; aquí podeu descarregar fitxers de capçalera amb tot el codi
