- Ce este SPI?
- Funcționarea SPI
- Pinii SPI în Arduino UNO
- Utilizarea SPI în Arduino
- Componente necesare pentru comunicarea Arduino SPI
- Diagrama circuitului de comunicare SPI Arduino
- Cum se programează Arduino pentru comunicarea SPI:
- Explicație privind programarea Arduino SPI Master
- Explicație despre programarea Arduino SPI Slave
- Cum funcționează SPI pe Arduino? - Hai să-l testăm!
Un microcontroler utilizează multe protocoale diferite pentru a comunica cu diverși senzori și module. Există multe tipuri diferite de protocoale de comunicații pentru comunicații fără fir și prin cablu, iar cea mai frecvent utilizată tehnică de comunicare este Comunicarea în serie. Comunicarea în serie este procesul de trimitere a datelor câte un bit pe rând, secvențial, pe un canal de comunicare sau pe o magistrală. Există multe tipuri de comunicații seriale, cum ar fi comunicarea UART, CAN, USB, I2C și SPI.
În acest tutorial, aflăm despre protocolul SPI și cum să-l folosim în Arduino. Vom folosi protocolul SPI pentru comunicarea dintre doi Arduino. Aici un Arduino va acționa ca Master și un altul va acționa ca Slave, două LED-uri și butoane vor fi conectate la ambele Arduino. Pentru a demonstra comunicarea SPI, vom controla LED-ul master side prin butonul din partea slave și invers utilizând protocolul de comunicație serial SPI.
Ce este SPI?
SPI (Serial Peripheral Interface) este un protocol de comunicație serial. Interfața SPI a fost găsită de Motorola în 1970. SPI are o conexiune full-duplex, ceea ce înseamnă că datele sunt trimise și primite simultan. Adică un comandant poate trimite date unui sclav, iar un sclav poate trimite date către comandant simultan. SPI este o comunicare serială sincronă înseamnă că ceasul este necesar în scopuri de comunicare.
Comunicarea SPI este explicată anterior în alte microcontrolere:
- Comunicare SPI cu microcontroler PIC PIC16F877A
- Interfață LCD TFT cu ecran tactil de 3,5 inch cu Raspberry Pi
- Programarea microcontrolerului AVR cu pini SPI
- Interfață LCD grafic Nokia 5110 cu Arduino
Funcționarea SPI
Un SPI are o comunicare master / Slave folosind patru linii. Un SPI poate avea un singur master și poate avea mai mulți sclavi. Un master este de obicei un microcontroler și sclavii pot fi un microcontroler, senzori, ADC, DAC, LCD etc.
Mai jos este reprezentarea schemei bloc a SPI Master cu Single Slave.
SPI are următoarele patru linii MISO, MOSI, SS și CLK
- MISO (Master in Slave Out) - Linia Slave pentru trimiterea datelor către master.
- MOSI (Master Out Slave In) - Linia Master pentru trimiterea datelor către periferice.
- SCK (Serial Clock) - impulsurile de ceas care sincronizează transmiterea datelor generate de master.
- SS (Slave Select) - Maestrul poate utiliza acest pin pentru a activa și dezactiva anumite dispozitive.
SPI Master cu mai mulți sclavi
Pentru a începe comunicarea între master și slave, trebuie să setăm pinul Slave Select (SS) al dispozitivului necesar la LOW, astfel încât să poată comunica cu masterul. Când este mare, îl ignoră pe stăpân. Acest lucru vă permite să aveți mai multe dispozitive SPI care partajează aceleași linii master MISO, MOSI și CLK. După cum puteți vedea în imaginea de mai sus, există patru sclavi în care SCLK, MISO, MOSI sunt comun conectate la master și SS-ul fiecărui slave este conectat separat la pinii SS individuali (SS1, SS2, SS3) ai masterului. Prin setarea pinului SS necesar LOW, un master poate comunica cu acel slave.
Pinii SPI în Arduino UNO
Imaginea de mai jos prezintă pinii SPI prezenți Arduino UNO (în casetă roșie).
Linia SPI |
Pin în Arduino |
MOSI |
11 sau ICSP-4 |
MISO |
12 sau ICSP-1 |
SCK |
13 sau ICSP-3 |
SS |
10 |
Utilizarea SPI în Arduino
Înainte de a începe programarea comunicării SPI între doi Arduino. Trebuie să aflăm despre biblioteca Arduino SPI utilizată în Arduino IDE.
Librăria
1. SPI.begin ()
UTILIZARE: Pentru a inițializa magistrala SPI setând SCK, MOSI și SS la ieșiri, trăgând SCK și MOSI jos și SS înalt.
2. SPI.setClockDivider (divizor)
UTILIZARE: Pentru a seta divizorul de ceas SPI relativ la ceasul sistemului. Separatoarele disponibile sunt 2, 4, 8, 16, 32, 64 sau 128.
Divizoare:
- SPI_CLOCK_DIV2
- SPI_CLOCK_DIV4
- SPI_CLOCK_DIV8
- SPI_CLOCK_DIV16
- SPI_CLOCK_DIV32
- SPI_CLOCK_DIV64
- SPI_CLOCK_DIV128
3. SPI.attachInterrupt (handler)
UTILIZARE: Această funcție este apelată atunci când un dispozitiv sclav primește date de la comandant.
4. SPI.transfer (val)
UTILIZARE: Această funcție este utilizată pentru a trimite și primi simultan datele între master și slave.
Deci, acum să începem cu demonstrația practică a protocolului SPI în Arduino. În acest tutorial vom folosi două arduino unul ca master și altul ca slave. Ambele Arduino sunt atașate separat cu un LED și un buton. LED-ul master poate fi controlat prin utilizarea butonului Arduino slave și LED-ul slave Arduino poate fi controlat de butonul master Arduino utilizând protocolul de comunicație SPI prezent în arduino.
Componente necesare pentru comunicarea Arduino SPI
- Arduino UNO (2)
- LED (2)
- Buton (2)
- Rezistor 10k (2)
- Rezistor 2.2k (2)
- Breadboard
- Conectarea firelor
Diagrama circuitului de comunicare SPI Arduino
Diagrama de circuit de mai jos arată cum să utilizați SPI pe Arduino UNO, dar puteți urma aceeași procedură pentru comunicarea Arduino Mega SPI sau comunicarea Arduino nano SPI. Aproape totul va rămâne la fel, cu excepția numărului PIN. Trebuie să verificați pinout-ul Arduino nano sau mega pentru a găsi pinii Arduino nano SPI și pinii Arduino Mega, după ce ați făcut că toate celelalte vor fi la fel.
Am construit circuitul prezentat mai sus peste o placă de calcul, puteți vedea configurarea circuitului pe care am folosit-o pentru testare mai jos.
Cum se programează Arduino pentru comunicarea SPI:
Acest tutorial are două programe, unul pentru master Arduino și altul pentru Arduino slave. Programe complete pentru ambele părți sunt oferite la sfârșitul acestui proiect.
Explicație privind programarea Arduino SPI Master
1. În primul rând trebuie să includem biblioteca SPI pentru utilizarea funcțiilor de comunicare SPI.
#include
2. În configurare nulă ()
- Începem comunicarea în serie la rata Baud 115200.
Serial.begin (115200);
- Atașați LED-ul la pinul 7 și apăsați butonul pe pinul 2 și setați acei pin-uri OUTPUT și INPUT.
pinMode (ipbutton, INPUT); pinMode (LED, OUTPUT);
- Apoi începem comunicarea SPI
SPI.begin ();
- Apoi, setăm Clockdivider pentru comunicarea SPI. Aici am setat divizorul 8.
SPI.setClockDivider (SPI_CLOCK_DIV8);
- Apoi setați pinul SS HIGH deoarece nu am început niciun transfer către arduino slave.
digitalWrite (SS, HIGH);
3. În bucla nulă ():
- Am citit starea pinului butonului conectat la pin2 (Master Arduino) pentru a trimite acele valori către Arduino slave.
buttonvalue = digitalRead (ipbutton);
- Setați logica pentru setarea valorii x (Pentru a fi trimis la sclav) în funcție de intrarea de la pinul 2
if (buttonvalue == HIGH) { x = 1; } else { x = 0; }
- Înainte de a trimite valoarea, trebuie să scăzem valoarea de selectare a sclavului pentru a începe transferul către sclav de la stăpân.
digitalWrite (SS, LOW);
- Aici vine pasul important, în următoarea declarație trimitem valoarea butonului stocat în variabila Mastersend către arduino- ul slave și primim, de asemenea, valoarea de la slave, care va fi stocată în variabila Mastereceive .
Mastereceive = SPI.transfer (Mastersend);
- După aceea, în funcție de valoarea Mastereceive, vom porni sau dezactiva LED-ul Master Arduino.
if (Mastereceive == 1) { digitalWrite (LED, HIGH); // Setează pinul 7 HIGH Serial.println ("Master LED ON"); } else { digitalWrite (LED, LOW); // Setează pinul 7 LOW Serial.println ("Master LED OFF"); }
Notă: Folosim serial.println () pentru a vizualiza rezultatul în Serial Motor of Arduino IDE. Verificați videoclipul la final.
Explicație despre programarea Arduino SPI Slave
1. În primul rând trebuie să includem biblioteca SPI pentru utilizarea funcțiilor de comunicare SPI.
#include
2. În configurare nulă ()
- Începem comunicarea în serie la rata Baud 115200.
Serial.begin (115200);
- Atașați LED-ul la pinul 7 și apăsați butonul pe pin2 și setați acei pin-uri OUTPUT și INPUT.
pinMode (ipbutton, INPUT); pinMode (LED, OUTPUT);
- Pasul important aici sunt următoarele afirmații
pinMode (MISO, OUTPUT);
Afirmația de mai sus setează MISO ca OUTPUT (Trebuie să trimiteți date către Master IN). Deci, datele sunt trimise prin MISO al Slave Arduino.
- Acum porniți SPI în modul Slave folosind SPI Control Register
SPCR - = _BV (SPE);
- Apoi porniți întreruperea pentru comunicarea SPI. Dacă se primesc date de la master, rutina de întrerupere este apelată și valoarea primită este preluată de la SPDR (SPI data Register)
SPI.attachInterrupt ();
- Valoarea de la master este preluată de la SPDR și stocată în variabila Slavereceived . Acest lucru are loc în urma funcției de întrerupere a rutinei.
ISR (SPI_STC_vect) { Slavereceived = SPDR; primit = adevărat; }
3. Apoi în bucla de gol () setăm LED-ul Slave arduino pentru a porni sau opri în funcție de valoarea primită de sclav.
if (Slavereceived == 1) { digitalWrite (LEDpin, HIGH); // Setează pinul 7 ca LED HIGH ON Serial.println („LED sclav ON”); } else { digitalWrite (LEDpin, LOW); // Setează pinul 7 ca LOW LED OFF Serial.println ("LED Slave OFF"); }
- Apoi citim starea butonului Slave Arduino Push și stocăm valoarea în Slavesend pentru a trimite valoarea către Master Arduino dând valoare registrului SPDR.
buttonvalue = digitalRead (buton); if (buttonvalue == HIGH) {x = 1; } else {x = 0; } Slavesend = x; SPDR = Slavă;
Notă: Folosim serial.println () pentru a vizualiza rezultatul în Serial Motor of Arduino IDE. Verificați videoclipul la final.
Cum funcționează SPI pe Arduino? - Hai să-l testăm!
Mai jos este imaginea configurării finale pentru comunicarea SPI între două plăci Arduino.
Când este apăsat butonul din partea Master, LED-ul alb din partea slave se aprinde.
Și când butonul de apăsare din partea Slave este apăsat, LED-ul roșu din partea Master se aprinde.
Puteți viziona videoclipul de mai jos pentru a vedea demonstrația comunicării Arduino SPI. Dacă aveți întrebări, vă rugăm să le lăsați în secțiunea de comentarii, folosiți forumurile noastre.