- Što je SPI?
- Rad SPI-a
- SPI igle u Arduino UNO
- Korištenje SPI-a u Arduinu
- Komponente potrebne za Arduino SPI komunikaciju
- Dijagram komunikacije Arduino SPI
- Kako programirati Arduino za SPI komunikaciju:
- Objašnjenje Arduino SPI master programiranja
- Objašnjenje Arduino SPI slave programiranja
- Kako SPI djeluje na Arduinu? - Isprobajmo!
Mikrokontroler koristi mnogo različitih protokola za komunikaciju s različitim senzorima i modulima. Postoji mnogo različitih vrsta komunikacijskih protokola za bežičnu i žičnu komunikaciju, a najčešće korištena komunikacijska tehnika je serijska komunikacija. Serijska komunikacija postupak je slanja podataka jedan po jedan bit, uzastopno, preko komunikacijskog kanala ili sabirnice. Postoje mnoge vrste serijske komunikacije poput UART, CAN, USB, I2C i SPI komunikacije.
U ovom uputstvu saznajemo o SPI protokolu i kako ga koristiti u Arduinu. Koristit ćemo SPI protokol za komunikaciju između dva Arduinosa. Ovdje će jedan Arduino djelovati kao Master, a drugi kao Slave, dvije LED i tipke bit će povezane na oba Arduina. Da bismo demonstrirali SPI komunikaciju, upravljati ćemo glavnom LED diodom pritiskom na tipku na pomoćnoj strani i obrnuto pomoću protokola SPI serijske komunikacije.
Što je SPI?
SPI (serijsko periferno sučelje) je serijski komunikacijski protokol. SPI sučelje pronašla je Motorola 1970. SPI ima full-duplex vezu, što znači da se podaci istovremeno šalju i primaju. Odnosno master može slati podatke robovu, a slave može istovremeno slati podatke masteru. SPI je sinkrona serijska komunikacija što znači da je sat potreban za komunikaciju.
SPI komunikacija prethodno je objašnjena u drugim mikrokontrolerima:
- SPI komunikacija s PIC mikrokontrolerom PIC16F877A
- Povezivanje 3,5 inčnog TFT LCD zaslona osjetljivog na dodir s Raspberry Pi
- Programiranje AVR mikrokontrolera s SPI pinovima
- Povezivanje grafičkog LCD-a Nokia 5110 s Arduinom
Rad SPI-a
SPI ima glavnu / podređenu komunikaciju pomoću četiri linije. SPI može imati samo jednog gospodara i može imati više robova. Master je obično mikrokontroler, a robovi mogu biti mikrokontroler, senzori, ADC, DAC, LCD itd.
Ispod je prikaz blok dijagrama SPI Master-a s jednim slave-om.

SPI ima sljedeće četiri linije MISO, MOSI, SS i CLK
- MISO (Master in Slave Out) - Slave linija za slanje podataka masteru.
- MOSI (Master Out Slave In) - glavna linija za slanje podataka na periferne uređaje.
- SCK (serijski sat) - impulsi sata koji sinhroniziraju prijenos podataka generiran od strane glavnog.
- SS (odabir podređenog ) - Master pomoću ove pribadače može omogućiti i onemogućiti određene uređaje.
SPI Master s više robova

Da bismo započeli komunikaciju između glavnog i podređenog uređaja, potrebno je postaviti pribadaču za odabrani podređeni uređaj (SS) na željeni uređaj na LOW, tako da može komunicirati s glavnim uređajem. Kad je visoka, ignorira gospodara. To vam omogućuje da imate više SPI uređaja koji dijele iste MISO, MOSI i CLK glavne linije. Kao što možete vidjeti na gornjoj slici, postoje četiri pomoćna uređaja u kojima su SCLK, MISO, MOSI zajednički povezani s master-om, a SS svakog slave-a povezan je zasebno na pojedinačne SS-pinove (SS1, SS2, SS3) master-a. Postavljanjem potrebnog SS pin LOW, master može komunicirati s tim slave.
SPI igle u Arduino UNO
Na donjoj slici prikazani su SPI pinovi koji predstavljaju Arduino UNO (u crvenom okviru).

|
SPI linija |
Prikvači u Arduinu |
|
MOSI |
11 ili ICSP-4 |
|
MISO |
12 ili ICSP-1 |
|
SCK |
13 ili ICSP-3 |
|
SS |
10 |
Korištenje SPI-a u Arduinu
Prije početka programiranja za SPI komunikaciju između dva Arduinosa. Moramo naučiti o Arduino SPI knjižnici koja se koristi u Arduino IDE-u.
Knjižnica
1. SPI.begin ()
UPOTREBA: Inicijalizirati SPI sabirnicu postavljanjem SCK, MOSI i SS na izlaze, povlačeći SCK i MOSI niskim i SS visokim.
2. SPI.setClockDivider (razdjelnik)
UPOTREBA: za postavljanje SPI razdjelnika sata u odnosu na sistemski sat. Dostupni razdjelnici su 2, 4, 8, 16, 32, 64 ili 128.
Razdjelnici:
- SPI_CLOCK_DIV2
- SPI_CLOCK_DIV4
- SPI_CLOCK_DIV8
- SPI_CLOCK_DIV16
- SPI_CLOCK_DIV32
- SPI_CLOCK_DIV64
- SPI_CLOCK_DIV128
3. SPI.attachInterrupt (rukovatelj)
UPOTREBA: Ova se funkcija poziva kada pomoćni uređaj prima podatke od glavnog.
4. SPI.transfer (val)
UPOTREBA: Ova se funkcija koristi za istovremeno slanje i primanje podataka između glavnog i podređenog uređaja.
Pa krenimo sada s praktičnom demonstracijom SPI protokola u Arduinu. U ovom uputstvu koristit ćemo dva arduina, jedan kao master, a drugi kao slave. Oba Arduina posebno su pričvršćena LED-om i tipkom. Master LED-om može se upravljati pritiskom na tipku slave Arduino, a slave Arduino LED-om može se upravljati tipkom master Arduino pomoću SPI komunikacijskog protokola prisutnog u arduinu.
Komponente potrebne za Arduino SPI komunikaciju
- Arduino UNO (2)
- LED (2)
- Gumb (2)
- Otpornik 10k (2)
- Otpornik 2.2k (2)
- Breadboard
- Spajanje žica
Dijagram komunikacije Arduino SPI
Dijagram dolje prikazuje kako koristiti SPI na Arduino UNO, ali možete slijediti isti postupak za Arduino Mega SPI komunikaciju ili Arduino nano SPI komunikaciju. Gotovo sve će ostati iste, osim broja pina. Morate provjeriti pinout Arduino nano ili mega da biste pronašli Arduino nano SPI igle i Arduino Mega pinove, nakon što učinite da će sve ostalo biti isto.

Izgradio sam gore prikazan krug preko ploče, u nastavku možete vidjeti postavke sklopa koje sam koristio za testiranje.

Kako programirati Arduino za SPI komunikaciju:
Ovaj tutorial ima dva programa jedan za master Arduino i drugi za slave Arduino. Kompletni programi za obje strane dati su na kraju ovog projekta.
Objašnjenje Arduino SPI master programiranja
1. Prije svega trebamo uključiti SPI knjižnicu za korištenje SPI komunikacijskih funkcija.
#include
2. U void postavljanju ()
- Serijsku komunikaciju započinjemo brzinom prijenosa 115200.
Serial.begin (115200);
- Pričvrstite LED na pin 7, a gumb na pin 2 i postavite te igle OUTPUT i INPUT.
pinMode (ipbutton, INPUT); pinMode (LED, IZLAZ);
- Dalje započinjemo SPI komunikaciju
SPI.begin ();
- Dalje smo postavili Clockdivider za SPI komunikaciju. Ovdje smo postavili razdjelnik 8.
SPI.setClockDivider (SPI_CLOCK_DIV8);
- Zatim postavite SS pin HIGH jer nismo započeli nikakav prijenos na slave arduino.
digitalWrite (SS, HIGH);
3. U petlji void ():
- Čitamo status klina tipke spojenog na pin2 (Master Arduino) za slanje te vrijednosti u slave Arduino.
buttonvalue = digitalRead (ipbutton);
- Postavi logiku za postavljanje x vrijednosti (za slanje na slave) ovisno o unosu s pina 2
ako (buttonvalue == HIGH) { x = 1; } ostalo { x = 0; }
- Prije slanja vrijednosti trebamo NIŽE slave odabrati vrijednost da započnemo prijenos na slave od master-a.
digitalWrite (SS, LOW);
- Ovdje dolazi važan korak, u slijedećoj izjavi šaljemo vrijednost tipke pohranjenu u varijablu Mastersend u slave arduino i također primamo vrijednost od slave koja će se pohraniti u varijantu Mastereceive .
Mastereceive = SPI.transfer (Mastersend);
- Nakon toga, ovisno o Mastereceive vrijednosti, uključit ćemo ili isključiti Master Arduino LED.
if (Mastereceive == 1) { digitalWrite (LED, VISOKO); // postavlja pin 7 HIGH Serial.println ("Master LED ON"); } else { digitalWrite (LED, LOW); // postavlja pin 7 LOW Serial.println ("Master LED OFF"); }
Napomena: Koristimo serial.println () za pregled rezultata u Serial Motoru Arduino IDE-a. Provjerite Video na kraju.
Objašnjenje Arduino SPI slave programiranja
1. Prije svega trebamo uključiti SPI knjižnicu za korištenje SPI komunikacijskih funkcija.
#include
2. U void postavljanju ()
- Serijsku komunikaciju započinjemo brzinom prijenosa 115200.
Serial.begin (115200);
- Pričvrstite LED na pin 7, a gumb na pin2 i postavite te igle OUTPUT i INPUT.
pinMode (ipbutton, INPUT); pinMode (LED, IZLAZ);
- Ovdje su važan korak sljedeće izjave
pinMode (MISO, IZLAZ);
Gornja izjava postavlja MISO kao IZLAZ (treba poslati podatke Master IN-u). Dakle, podaci se šalju putem MISO-a Slave Arduina.
- Sada uključite SPI u podređenom načinu pomoću SPI kontrolnog registra
SPCR - = _BV (SPE);
- Zatim Uključite prekid za SPI komunikaciju. Ako se podaci primaju od glavnog pretpostavka, poziva se prekidna rutina i prima se vrijednost iz SPDR-a (SPI registar podataka)
SPI.attachInterrupt ();
- Vrijednost iz master preuzima se iz SPDR-a i pohranjuje u Slavereceived varijablu. To se događa u sljedećoj funkciji Prekidna rutina.
ISR (SPI_STC_vect) { Slavereceived = SPDR; primljeno = točno; }
3. Sljedeće u void loop () postavljamo Slave arduino LED da se UKLJUČI ili ISKLJUČUJE ovisno o Slavereceived vrijednosti.
if (Slavereceived == 1) { digitalWrite (LEDpin, HIGH); // Postavlja pin 7 kao HIGH LED ON Serial.println ("Slave LED ON"); } else { digitalWrite (LEDpin, LOW); // Postavlja pin 7 kao LOW LED OFF Serial.println ("Slave LED OFF"); }
- Dalje čitamo status Slave Arduino gumba i pohranjujemo vrijednost u Slavesend da bismo poslali vrijednost Master Arduinu davanjem vrijednosti SPDR registru.
buttonvalue = digitalRead (gumb); ako (buttonvalue == HIGH) {x = 1; } ostalo {x = 0; } Slavesend = x; SPDR = Slavesend;
Napomena: Koristimo serial.println () za pregled rezultata u Serial Motoru Arduino IDE-a. Provjerite Video na kraju.
Kako SPI djeluje na Arduinu? - Isprobajmo!
Ispod je slika konačnog postavljanja za SPI komunikaciju između dvije Arduino ploče.
Kad se pritisne gumb na glavnoj strani, bijela LED na pomoćnoj strani se UKLJUČUJE.

A kad se pritisne gumb na podređenoj strani, crvena LED na glavnoj strani se UKLJUČUJE.

Možete pogledati video u nastavku kako biste vidjeli demonstraciju Arduino SPI komunikacije. Ako imate pitanja, ostavite ih u odjeljku za komentare, a mi se služimo našim forumima.
