- Què és SPI?
- Funcionament de SPI
- Pins SPI a Arduino UNO
- Ús de SPI a Arduino
- Components necessaris per a la comunicació SPI Arduino
- Diagrama del circuit de comunicació Arduino SPI
- Com programar Arduino per a la comunicació SPI:
- Explicació de la programació mestra Arduino SPI
- Explicació de la programació de l’esclau SPI Arduino
- Com funciona SPI a Arduino? - Provem-ho!
Un microcontrolador utilitza molts protocols diferents per comunicar-se amb diversos sensors i mòduls. Hi ha molts tipus diferents de protocols de comunicació per a comunicacions sense fils i per cable, i la tècnica de comunicació més utilitzada és la comunicació en sèrie. La comunicació en sèrie és el procés d’enviament de dades d’un bit a la vegada, seqüencialment, a través d’un canal de comunicació o bus. Hi ha molts tipus de comunicació en sèrie, com ara la comunicació UART, CAN, USB, I2C i SPI.
En aquest tutorial, coneixem el protocol SPI i com utilitzar-lo a Arduino. Utilitzarem el protocol SPI per a la comunicació entre dos Arduinos. Aquí un Arduino actuarà com a mestre i un altre actuarà com a esclau, es connectaran dos LED i botons polsadors a l'Arduino. Per demostrar la comunicació SPI, controlarem el LED del costat mestre mitjançant el botó del costat esclau i viceversa mitjançant el protocol de comunicació sèrie SPI.
Què és SPI?
SPI (Serial Peripheral Interface) és un protocol de comunicació en sèrie. Motorola va trobar la interfície SPI el 1970. SPI té una connexió full-duplex, el que significa que les dades s’envien i es reben simultàniament. És a dir, un mestre pot enviar dades a un esclau i un esclau pot enviar dades al mestre simultàniament. SPI és una comunicació serial síncrona que significa que el rellotge és necessari per a la comunicació.
La comunicació SPI s’explica prèviament en altres microcontroladors:
- Comunicació SPI amb microcontrolador PIC PIC16F877A
- Interfície de pantalla TFT LCD de 3,5 polzades amb Raspberry Pi
- Programació de microcontrolador AVR amb pins SPI
- Interfície LCD gràfica Nokia 5110 amb Arduino
Funcionament de SPI
Un SPI té una comunicació mestre / esclau mitjançant quatre línies. Un SPI només pot tenir un mestre i pot tenir diversos esclaus. Un mestre sol ser un microcontrolador i els esclaus poden ser un microcontrolador, sensors, ADC, DAC, LCD, etc.
A continuació es mostra la representació del diagrama de blocs del mestre SPI amb esclau únic.

SPI té quatre línies següents: MISO, MOSI, SS i CLK
- MISO (Master in Slave Out): la línia Slave per enviar dades al mestre.
- MOSI (Master Out Slave In): la línia principal per enviar dades als perifèrics.
- SCK (Serial Clock): els polsos de rellotge que sincronitzen la transmissió de dades generada pel mestre.
- SS (Selecció esclau): el mestre pot utilitzar aquest pin per habilitar i desactivar dispositius específics.
Mestre SPI amb múltiples esclaus

Per iniciar la comunicació entre mestre i esclau, hem d’establir el pin Slave Select (SS) del dispositiu requerit a BAIX, de manera que pugui comunicar-se amb el mestre. Quan és alt, ignora el mestre. Això us permet tenir diversos dispositius SPI que comparteixen les mateixes línies mestres MISO, MOSI i CLK. Com podeu veure a la imatge anterior, hi ha quatre esclaus en els quals el SCLK, MISO, MOSI està connectat al mestre i el SS de cada esclau es connecta per separat a pins SS individuals (SS1, SS2, SS3) del mestre. En establir el pin SS requerit BAIX, un mestre pot comunicar-se amb aquest esclau.
Pins SPI a Arduino UNO
La imatge següent mostra els pins SPI presents a Arduino UNO (en caixa vermella).

|
Línia SPI |
Pin a Arduino |
|
MOSI |
11 o ICSP-4 |
|
MISO |
12 o ICSP-1 |
|
SCK |
13 o ICSP-3 |
|
SS |
10 |
Ús de SPI a Arduino
Abans de començar a programar la comunicació SPI entre dos Arduinos. Hem de conèixer la biblioteca Arduino SPI que s’utilitza a Arduino IDE.
La biblioteca
1. SPI.begin ()
ÚS: per inicialitzar el bus SPI configurant SCK, MOSI i SS a les sortides, tirant SCK i MOSI baix i SS alt.
2. SPI.setClockDivider (divisor)
ÚS: per establir el divisor de rellotge SPI en relació amb el rellotge del sistema. Els divisors disponibles són 2, 4, 8, 16, 32, 64 o 128.
Divisors:
- SPI_CLOCK_DIV2
- SPI_CLOCK_DIV4
- SPI_CLOCK_DIV8
- SPI_CLOCK_DIV16
- SPI_CLOCK_DIV32
- SPI_CLOCK_DIV64
- SPI_CLOCK_DIV128
3. SPI.attachInterrupt (controlador)
ÚS: es diu aquesta funció quan un dispositiu esclau rep dades del mestre.
4. Transferència SPI (val)
ÚS: aquesta funció s’utilitza per enviar i rebre simultàniament les dades entre el mestre i l’esclau.
Comencem ara amb una demostració pràctica del protocol SPI a Arduino. En aquest tutorial utilitzarem dos arduino, un com a mestre i l’altre com a esclau. Tots dos Arduino es connecten amb un LED i un polsador per separat. El LED mestre es pot controlar mitjançant el polsador slave Arduino i el LED slave Arduino es pot controlar mitjançant el pulsador master Arduino mitjançant el protocol de comunicació SPI present a arduino.
Components necessaris per a la comunicació SPI Arduino
- Arduino UNO (2)
- LED (2)
- Polsador (2)
- Resistència 10k (2)
- Resistència 2,2 k (2)
- Taula de pa
- Connexió de cables
Diagrama del circuit de comunicació Arduino SPI
El diagrama de circuits següent mostra com utilitzar SPI a Arduino UNO, però podeu seguir el mateix procediment per a la comunicació Arduino Mega SPI o la comunicació Arduino nano SPI. Gairebé tot seguirà igual, excepte el número de pin. Heu de comprovar el pinout d’Arduino nano o mega per trobar els pins SPI Arduino nano i els pins Arduino Mega, un cop hàgiu fet que tota la resta sigui igual.

He construït el circuit mostrat anteriorment sobre una placa de configuració, a continuació podeu veure la configuració del circuit que he utilitzat per provar-la.

Com programar Arduino per a la comunicació SPI:
Aquest tutorial té dos programes, un per al mestre Arduino i un altre per al Arduino esclau. Al final d’aquest projecte es donen programes complets per a ambdues parts.
Explicació de la programació mestra Arduino SPI
1. Primer de tot, hem d’incloure la biblioteca SPI per utilitzar les funcions de comunicació SPI.
#incloure
2. Configuració nul·la ()
- Comencem la comunicació en sèrie a Baud Rate 115200.
Serial.begin (115200);
- Connecteu el LED al pin 7 i el polsador al pin 2 i configureu els pins OUTPUT i INPUT respectivament.
pinMode (ipbutton, INPUT); pinMode (LED, OUTPUT);
- A continuació, comencem la comunicació SPI
SPI.begin ();
- A continuació, configurem el Clockdivider per a la comunicació SPI. Aquí hem establert el divisor 8.
SPI.setClockDivider (SPI_CLOCK_DIV8);
- A continuació, configureu el pin SS HIGH ja que no vam iniciar cap transferència a arduino slave.
digitalWrite (SS, HIGH);
3. En bucle buit ():
- Llegim l’estat del pin del polsador connectat al pin2 (Master Arduino) per enviar aquests valors a Arduino esclau.
buttonvalue = DigitalRead (ipbutton);
- Establiu la lògica per establir el valor x (que s'enviarà a l'esclau) en funció de l'entrada del pin 2
if (buttonvalue == HIGH) { x = 1; } else { x = 0; }
- Abans d’enviar el valor, hem de BAIXAR el valor de selecció esclau per començar la transferència a l’esclau des del mestre.
digitalWrite (SS, BAIX);
- Aquí ve el pas important: a la següent declaració, enviem el valor del botó emmagatzemat a la variable Mastersend a l’arduino esclau i també rebem el valor de l’esclau que s’emmagatzemarà a la variable Mastereceive .
Mastereceive = SPI.transfer (Mastersend);
- Després, depenent del valor Mastereceive, engegarem o apagem el LED Master Arduino.
if (Mastereceive == 1) { digitalWrite (LED, HIGH); // Estableix el pin 7 HIGH Serial.println ("LED mestre activat"); } else { digitalWrite (LED, BAIX); // Estableix el pin 7 LOW Serial.println ("LED mestre apagat"); }
Nota: Utilitzem serial.println () per veure el resultat a Serial Motor of Arduino IDE. Consulteu el vídeo al final.
Explicació de la programació de l’esclau SPI Arduino
1. Primer de tot, hem d’incloure la biblioteca SPI per utilitzar les funcions de comunicació SPI.
#incloure
2. Configuració nul·la ()
- Comencem la comunicació en sèrie a Baud Rate 115200.
Serial.begin (115200);
- Connecteu el LED al pin 7 i el polsador al pin2 i configureu els pins OUTPUT i INPUT respectivament.
pinMode (ipbutton, INPUT); pinMode (LED, OUTPUT);
- El pas important aquí són les següents afirmacions
pinMode (MISO, OUTPUT);
L'afirmació anterior estableix MISO com a SORTIDA (heu d'enviar dades a Master IN). Per tant, les dades s’envien mitjançant MISO de Slave Arduino.
- Ara activeu SPI en mode esclau mitjançant el registre de control SPI
SPCR - = _BV (SPE);
- A continuació, activeu la interrupció per a la comunicació SPI. Si es reben dades del mestre, es crida a la rutina d’interrupció i el valor rebut es pren de SPDR (registre de dades SPI)
SPI.attachInterrupt ();
- El valor del mestre es pren de SPDR i s’emmagatzema a la variable Slavereceived . Això té lloc a la funció de la rutina d'interrupció.
ISR (SPI_STC_vect) { Slavereceived = SPDR; rebut = cert; }
3. A continuació, en bucle buit (), configurem el LED d'arduino esclau perquè s'encengui o s'apagui en funció del valor rebut de l'esclau.
if (Slavereceived == 1) { digitalWrite (LEDpin, HIGH); // Estableix el pin 7 com a LED ALT activat Serial.println ("LED esclau activat"); } else { digitalWrite (LEDpin, LOW); // Estableix el pin 7 com a LED BAIX APAGAT Serial.println ("LED esclau apagat"); }
- A continuació, llegim l’estat del botó de pulsació Slave Arduino i emmagatzemem el valor a Slavesend per enviar el valor a Master Arduino donant valor al registre SPDR.
buttonvalue = DigitalRead (botó); if (buttonvalue == HIGH) {x = 1; } else {x = 0; } Enviament esclau = x; SPDR = enviació d'esclaus;
Nota: Utilitzem serial.println () per veure el resultat a Serial Motor of Arduino IDE. Consulteu el vídeo al final.
Com funciona SPI a Arduino? - Provem-ho!
A continuació es mostra la imatge de la configuració final per a la comunicació SPI entre dues plaques Arduino.
Quan es prem el botó del costat principal, el LED blanc del costat esclau s'encén.

I quan es prem el polsador del costat esclau, el LED vermell del costat principal s’encén.

Podeu veure el vídeo següent per veure la demostració de la comunicació Arduino SPI. Si teniu alguna pregunta, si us plau, deixeu-les a la secció de comentaris per utilitzar els nostres fòrums.
