- Kaj je SPI?
- Delovanje SPI
- Zatiči SPI v Arduino UNO
- Uporaba SPI v Arduinu
- Komponente, potrebne za komunikacijo Arduino SPI
- Diagram komunikacijskega vezja Arduino SPI
- Kako programirati Arduino za komunikacijo SPI:
- Pojasnilo glavnega programiranja Arduino SPI
- Pojasnilo za programiranje podrejenega sistema Arduino SPI
- Kako deluje SPI na Arduino? - Preizkusimo!
Mikrokrmilnik uporablja veliko različnih protokolov za komunikacijo z različnimi senzorji in moduli. Obstaja veliko različnih vrst komunikacijskih protokolov za brezžično in žično komunikacijo, najpogosteje uporabljena komunikacijska tehnika pa je serijska komunikacija. Zaporedna komunikacija je postopek zaporednega pošiljanja podatkov zaporedoma po komunikacijskem kanalu ali vodilu. Obstaja veliko vrst serijske komunikacije, kot so UART, CAN, USB, I2C in SPI.
V tej vadnici spoznavamo protokol SPI in kako ga uporabljati v Arduinu. Za komunikacijo med dvema Arduinosoma bomo uporabili protokol SPI. Tu bo en Arduino deloval kot Master, drugi pa kot Slave, dve LED in potisni gumbi bodo povezani na oba Arduino. Za prikaz komunikacije SPI bomo s tipko na pomožni strani upravljali glavno stran LED s pomočjo protokola SPI serijske komunikacije.
Kaj je SPI?
SPI (serijski periferni vmesnik) je serijski komunikacijski protokol. Vmesnik SPI je Motorola našla leta 1970. SPI ima polno dupleksno povezavo, kar pomeni, da se podatki hkrati pošiljajo in prejemajo. To pomeni, da lahko poveljnik podatke pošlje podrejenemu, podrejeni pa jih lahko hkrati pošlje. SPI je sinhrona serijska komunikacija, kar pomeni, da je ura potrebna za komunikacijo.
Komunikacija SPI je prej pojasnjena v drugih mikrokrmilnikih:
- Komunikacija SPI z mikrokrmilnikom PIC PIC16F877A
- Povezava 3,5-palčnega TFT LCD zaslona na dotik z Raspberry Pi
- Programiranje mikrokrmilnika AVR z zatiči SPI
- Povezava grafičnega LCD-ja Nokia 5110 z Arduinom
Delovanje SPI
SPI ima glavno / podrejeno komunikacijo s pomočjo štirih vrstic. SPI ima lahko samo enega glavnega in ima lahko več sužnjev. Mojster je običajno mikrokrmilnik, sužnji pa so lahko mikrokrmilnik, senzorji, ADC, DAC, LCD itd.
Spodaj je predstavitev blokovnega diagrama SPI Master z enim podrejenim.
SPI ima naslednje štiri vrstice MISO, MOSI, SS in CLK
- MISO (Master in Slave Out) - podrejena linija za pošiljanje podatkov glavni enoti.
- MOSI (Master Out Slave In) - glavna linija za pošiljanje podatkov na zunanje naprave.
- SCK (serijska ura) - impulzi ure, ki sinhronizirajo prenos podatkov, ki ga generira glavna enota.
- SS (Slave Select) - Master lahko s tem zatičem omogoči in onemogoči določene naprave.
SPI Master z več sužnji
Če želite začeti komunikacijo med glavnim in podrejenim omrežjem, moramo nastaviti zatič (Slave Select - SS) potrebne naprave na LOW, da lahko komunicira z glavnim. Ko je visoka, ignorira poveljnika. To vam omogoča, da imate več naprav SPI, ki si delijo iste glavne linije MISO, MOSI in CLK. Kot lahko vidite na zgornji sliki, obstajajo štirje sužnji, pri katerih so SCLK, MISO, MOSI skupni, povezani z glavno enoto, SS vsakega podrejenega pa ločeno na posamezne SS nožice (SS1, SS2, SS3) glavne enote. Z nastavitvijo zahtevanega SS-zatiča LOW lahko poveljnik komunicira s tem podrejenim.
Zatiči SPI v Arduino UNO
Spodnja slika prikazuje zatiči SPI, ki so prisotni Arduino UNO (v rdečem polju).
SPI linija |
Pripnite v Arduino |
MOSI |
11 ali ICSP-4 |
MISO |
12 ali ICSP-1 |
SCK |
13 ali ICSP-3 |
SS |
10. |
Uporaba SPI v Arduinu
Pred začetkom programiranja za komunikacijo SPI med dvema Arduinosoma. Spoznati moramo knjižnico Arduino SPI, ki se uporablja v Arduino IDE.
Knjižnica
1. SPI.begin ()
UPORABA: Za inicializacijo vodila SPI nastavite SCK, MOSI in SS na izhode, povlecite SCK in MOSI nizko in SS visoko.
2. SPI.setClockDivider (delilnik)
UPORABA: za nastavitev delilnika ure SPI glede na sistemsko uro. Na voljo so delilniki 2, 4, 8, 16, 32, 64 ali 128.
Delilniki:
- SPI_CLOCK_DIV2
- SPI_CLOCK_DIV4
- SPI_CLOCK_DIV8
- SPI_CLOCK_DIV16
- SPI_CLOCK_DIV32
- SPI_CLOCK_DIV64
- SPI_CLOCK_DIV128
3. SPI.attachInterrupt (vodnik)
UPORABA: Ta funkcija se prikliče, ko pomožna naprava prejme podatke od glavne enote.
4. SPI.transfer (val)
UPORABA: Ta funkcija se uporablja za hkratno pošiljanje in prejemanje podatkov med glavno in pomožno enoto.
Zdaj pa začnimo s praktično predstavitvijo protokola SPI v Arduinu. V tej vadnici bomo uporabili dva arduina, enega kot glavnega in drugega kot sužnja. Oba Arduina sta ločeno pritrjena z LED in tipko. Glavni LED lahko nadzorujete s pomočjo potisnega gumba podrejenega Arduina, LED podrejenega Arduina pa lahko nadzorujete s pritiskalnim gumbom glavnega Arduina s pomočjo komunikacijskega protokola SPI, ki je prisoten v arduinu.
Komponente, potrebne za komunikacijo Arduino SPI
- Arduino UNO (2)
- LED (2)
- Potisni gumb (2)
- Upor 10k (2)
- Upor 2.2k (2)
- Breadboard
- Povezovanje žic
Diagram komunikacijskega vezja Arduino SPI
Spodnji diagram vezja prikazuje, kako uporabljati SPI na Arduino UNO, lahko pa sledite enakemu postopku za komunikacijo Arduino Mega SPI ali Arduino nano SPI. Skoraj vse bo ostalo enako, razen številke zatiča. Ko preverite, ali so Arduino nano ali mega našli Arduino nano SPI nožice in Arduino Mega nožice, potem ko bo vse ostalo enako.
Zgoraj prikazano vezje sem zgradil preko plošče, spodaj si lahko ogledate nastavitev vezja, ki sem ga uporabil za testiranje.
Kako programirati Arduino za komunikacijo SPI:
Ta vadnica ima dva programa, enega za master Arduino in drugega za slave Arduino. Na koncu tega projekta so podani celotni programi za obe strani.
Pojasnilo glavnega programiranja Arduino SPI
1. Najprej moramo vključiti knjižnico SPI za uporabo komunikacijskih funkcij SPI.
#include
2. V void setup ()
- Začnemo serijsko komunikacijo s hitrostjo prenosa 115200.
Serial.begin (115200);
- LED pritrdite na nožico 7 in gumb na nožico 2 ter nastavite ti nožici IZHOD in VHOD.
pinMode (ipbutton, INPUT); pinMode (LED, IZHOD);
- Nato začnemo komunikacijo SPI
SPI.begin ();
- Nato nastavimo Clockdivider za komunikacijo SPI. Tu smo nastavili delilnik 8.
SPI.setClockDivider (SPI_CLOCK_DIV8);
- Nato nastavite SS pin HIGH, saj nismo začeli nobenega prenosa na slave arduino.
digitalWrite (SS, HIGH);
3. V void zanki ():
- Preberemo stanje zatiča gumba, priključenega na pin2 (Master Arduino) za pošiljanje te vrednosti v podrejeni Arduino.
buttonvalue = digitalRead (ipbutton);
- Nastavite logiko za nastavitev vrednosti x (se pošlje pomožni enoti), odvisno od vhoda z nožice 2
če (buttonvalue == HIGH) { x = 1; } sicer { x = 0; }
- Pred pošiljanjem vrednosti moramo NIZKO podrejeno vrednost izbrati, da začnemo prenos na podrejeni od glavnega.
digitalWrite (SS, LOW);
- Tu sledi pomemben korak, v naslednjem stavku pošljemo vrednost potisnega gumba, shranjeno v spremenljivki Mastersend, podrejenemu arduinu in od podrejenega sprejemnika prejmemo tudi vrednost, ki bo shranjena v spremenljivki Mastereceive .
Mastereceive = SPI.transfer (Mastersend);
- Po tem bomo glede na vrednost Mastereceive vklopili ali izklopili glavno LED Arduino.
if (Mastereceive == 1) { digitalWrite (LED, HIGH); // nastavi pin 7 HIGH Serial.println ("Master LED ON"); } else { digitalWrite (LED, LOW); // nastavi pin 7 LOW Serial.println ("Master LED OFF"); }
Opomba: Za ogled rezultata v Serial Motor of Arduino IDE uporabljamo serial.println () . Preverite video na koncu.
Pojasnilo za programiranje podrejenega sistema Arduino SPI
1. Najprej moramo vključiti knjižnico SPI za uporabo komunikacijskih funkcij SPI.
#include
2. V void setup ()
- Začnemo serijsko komunikacijo s hitrostjo prenosa 115200.
Serial.begin (115200);
- LED pritrdite na nožico 7 in gumb na nožico 2 ter nastavite ti nožici IZHOD in VHOD.
pinMode (ipbutton, INPUT); pinMode (LED, IZHOD);
- Pomemben korak tukaj so naslednje izjave
pinMode (MISO, IZHOD);
Zgornja izjava nastavi MISO kot IZHOD (podatke je treba poslati Master IN). Tako se podatki pošiljajo prek MISO podjetja Slave Arduino.
- Zdaj vklopite SPI v podrejenem načinu z uporabo nadzornega registra SPI
SPCR - = _BV (SPE);
- Nato vklopite prekinitev za komunikacijo SPI. Če so podatki prejeti od glavne enote, se pokliče prekinitvena rutina in prejeta vrednost se vzame iz SPDR (SPI podatkovni register)
SPI.attachInterrupt ();
- Vrednost iz masterja je vzeta iz SPDR in shranjena v spremenljivki Slavereceived . To se zgodi v naslednji prekinitveni rutinski funkciji.
ISR (SPI_STC_vect) { Slavereceived = SPDR; prejeto = resnično; }
3. Naslednja void zanka () nastavimo, da se Slave arduino LED vklopi ali izklopi, odvisno od vrednosti slave.
if (Slavereceived == 1) { digitalWrite (LEDpin, HIGH); // Nastavi pin 7 kot HIGH LED ON Serial.println ("Slave LED ON"); } else { digitalWrite (LEDpin, LOW); // Nastavi pin 7 kot LOW LED OFF Serial.println ("Slave LED OFF"); }
- Nato preberemo stanje potisnega gumba Slave Arduino in shranimo vrednost v Slavesend, da vrednost pošljemo Master Arduino, tako da damo vrednost registru SPDR.
buttonvalue = digitalRead (gumb); če (buttonvalue == HIGH) {x = 1; } sicer {x = 0; } Slavesend = x; SPDR = Slavesend;
Opomba: Za ogled rezultata v Serial Motor of Arduino IDE uporabljamo serial.println () . Preverite video na koncu.
Kako deluje SPI na Arduino? - Preizkusimo!
Spodaj je slika končne nastavitve za komunikacijo SPI med dvema ploščama Arduino.
Ko pritisnete gumb na glavni strani, se prižge bela LED na pomožni strani.
In ko pritisnete gumb na podrejeni strani, se na glavni strani vklopi rdeča LED.
V spodnjem videoposnetku si lahko ogledate predstavitev komunikacije Arduino SPI. Če imate kakršna koli vprašanja, jih pustite v oddelku za komentarje, uporabite naše forume.