- Kas ir SPI?
- SPI darbība
- SPI tapas Arduino UNO
- Izmantojot SPI Arduino
- Komponenti, kas nepieciešami Arduino SPI saziņai
- Arduino SPI sakaru shēmas diagramma
- Kā programmēt Arduino SPI komunikācijai:
- Arduino SPI maģistra programmēšanas skaidrojums
- Arduino SPI vergu programmēšanas skaidrojums
- Kā SPI darbojas ar Arduino? - Pārbaudīsim!
Mikrokontrolleris izmanto daudz dažādu protokolu, lai sazinātos ar dažādiem sensoriem un moduļiem. Bezvadu un vadu sakariem ir daudz dažādu veidu sakaru protokolu, un visbiežāk izmantotā komunikācijas tehnika ir sērijveida komunikācija. Seriālā komunikācija ir datu sūtīšanas process pa vienam bitam, secīgi pa sakaru kanālu vai kopni. Ir daudz sērijveida sakaru veidu, piemēram, UART, CAN, USB, I2C un SPI sakari.
Šajā apmācībā mēs uzzinām par SPI protokolu un kā to izmantot Arduino. Mēs izmantosim SPI protokolu saziņai starp diviem Arduinos. Šeit viens Arduino darbosies kā kapteinis, bet otrs - kā vergs, divi LED un spiedpogas tiks savienotas ar abiem Arduino. Lai parādītu SPI komunikāciju, mēs kontrolēsim galvenās puses LED ar spiedpogu vergu pusē un otrādi, izmantojot SPI sērijas sakaru protokolu.
Kas ir SPI?
SPI (Serial Peripheral Interface) ir sērijveida sakaru protokols. SPI saskarni Motorola atrada 1970. gadā. SPI ir pilna dupleksa savienojums, kas nozīmē, ka dati tiek sūtīti un saņemti vienlaikus. Tas ir, kapteinis var nosūtīt datus vergam un vergs var nosūtīt datus kapteinim vienlaicīgi. SPI ir sinhrona sērijveida saziņa, kas nozīmē, ka pulkstenis ir nepieciešams sakaru vajadzībām.
SPI komunikācija iepriekš ir izskaidrota citos mikrokontrolleros:
- SPI komunikācija ar PIC mikrokontrolleru PIC16F877A
- Saskarne ar 3,5 collu skārienekrāna TFT LCD ar Raspberry Pi
- AVR mikrokontrollera programmēšana ar SPI tapām
- Nokia 5110 grafiskā LCD saskarne ar Arduino
SPI darbība
SPI ir galvenais / vergu sakars, izmantojot četras līnijas. SPI var būt tikai viens kapteinis un tam var būt vairāki vergi. Kapteinis parasti ir mikrokontrolleris, un vergi var būt mikrokontrolleris, sensori, ADC, DAC, LCD utt.
Zemāk ir blokshēmas attēlojums SPI Master ar Single Slave.
SPI seko četrām rindām MISO, MOSI, SS un CLK
- MISO (Master in Slave Out) - Slave līnija datu nosūtīšanai galvenajam.
- MOSI (Master Out Slave In) - galvenā līnija datu nosūtīšanai perifērijas ierīcēm.
- SCK (sērijveida pulkstenis) - pulksteņa impulsi, kas sinhronizē galvenā ģenerētā datu pārraidi.
- SS (Slave Select) - kapteinis var izmantot šo piespraudi, lai iespējotu un atspējotu noteiktas ierīces.
SPI Master ar vairākiem vergiem
Lai sāktu komunikāciju starp galveno un vergu, mums jāiestata nepieciešamās ierīces Slave Select (SS) piespraude uz LOW, lai tā varētu sazināties ar galveno. Kad tas ir augsts, tas meistaru neņem vērā. Tas ļauj vairākām SPI ierīcēm koplietot tās pašas MISO, MOSI un CLK galvenās līnijas. Kā redzat iepriekš redzamajā attēlā, ir četri vergi, kuros SCLK, MISO, MOSI ir kopīgi savienoti ar galveno un katra verga SS ir atsevišķi savienoti ar atsevišķām kapteiņa SS tapām (SS1, SS2, SS3). Iestatot nepieciešamo SS tapu LOW, kapteinis var sazināties ar šo vergu.
SPI tapas Arduino UNO
Zemāk redzamajā attēlā ir redzami SPI tapas ar Arduino UNO (sarkanā lodziņā).
SPI līnija |
Piesprauž Arduino |
MOSI |
11 vai ICSP-4 |
MISO |
12 vai ICSP-1 |
SCK |
13 vai ICSP-3 |
SS |
10 |
Izmantojot SPI Arduino
Pirms sākat programmēt SPI saziņu starp diviem Arduinos. Mums jāzina par Arduino SPI bibliotēku, kas tiek izmantota Arduino IDE.
Bibliotēka
1. SPI.begin ()
LIETOŠANA: lai inicializētu SPI kopni, izejām iestatot SCK, MOSI un SS, pavelkot SCK un MOSI zemu un SS augstu.
2. SPI.setClockDivider (dalītājs)
LIETOŠANA: lai iestatītu SPI pulksteņa dalītāju attiecībā pret sistēmas pulksteni. Pieejamie dalītāji ir 2, 4, 8, 16, 32, 64 vai 128.
Dalītāji:
- SPI_CLOCK_DIV2
- SPI_CLOCK_DIV4
- SPI_CLOCK_DIV8
- SPI_CLOCK_DIV16
- SPI_CLOCK_DIV32
- SPI_CLOCK_DIV64
- SPI_CLOCK_DIV128
3. SPI.attachInterrupt (apdarinātājs)
LIETOŠANA: Šī funkcija tiek izsaukta, kad vergu ierīce saņem datus no galvenā.
4. SPI.transfer (val)
LIETOŠANA: šo funkciju izmanto, lai vienlaikus nosūtītu un saņemtu datus starp galveno un vergu.
Tātad tagad sāksim ar praktisku SPI protokola demonstrēšanu Arduino. Šajā apmācībā mēs izmantosim divus arduino vienu kā galveno un otru kā vergu. Abi Arduino ir piestiprināti ar LED un spiedpogu atsevišķi. Galveno LED var kontrolēt, izmantojot vergu Arduino spiedpogu, un vergu Arduino LED var vadīt ar galvenā Arduino spiedpogu, izmantojot SPI sakaru protokolu, kas atrodas arduino.
Komponenti, kas nepieciešami Arduino SPI saziņai
- Arduino UNO (2)
- LED (2)
- Spiedpoga (2)
- Rezistors 10k (2)
- Rezistors 2.2k (2)
- Maizes dēlis
- Vadu savienošana
Arduino SPI sakaru shēmas diagramma
Zemāk esošajā shēmā ir parādīts, kā izmantot SPI ierīcē Arduino UNO, taču jūs varat ievērot to pašu procedūru arī Arduino Mega SPI komunikācijai vai Arduino nano SPI komunikācijai. Gandrīz viss paliks nemainīgs, izņemot tapas numuru. Jums ir jāpārbauda Arduino nano vai mega pinout, lai atrastu Arduino nano SPI un Arduino Mega tapas, kad esat izdarījis, ka viss pārējais būs tāds pats.
Esmu izveidojis iepriekš parādīto ķēdi virs maizes paneļa, jūs varat redzēt ķēdes iestatījumu, kuru es izmantoju testēšanai zemāk.
Kā programmēt Arduino SPI komunikācijai:
Šajā apmācībā ir divas programmas, viena - meistaram Arduino, bet otra - vergam Arduino. Pilnīgas programmas abām pusēm ir norādītas šī projekta beigās.
Arduino SPI maģistra programmēšanas skaidrojums
1. Vispirms mums jāiekļauj SPI bibliotēka SPI komunikācijas funkciju izmantošanai.
# iekļaut
2. Tukšajā iestatījumā ()
- Mēs sākam sērijveida saziņu ar Baud likmi 115200.
Sērijas sākums (115200);
- Pievienojiet gaismas diode 7. tapai un nospiediet pogu 2. tapai un attiecīgi iestatiet šīs tapas OUTPUT un INPUT.
pinMode (ippoga, INPUT); pinMode (LED, OUTPUT);
- Tālāk mēs sākam SPI komunikāciju
SPI.sākt ();
- Tālāk mēs iestatījām Clockdivider SPI saziņai. Šeit mēs esam iestatījuši dalītāju 8.
SPI.setClockDivider (SPI_CLOCK_DIV8);
- Pēc tam iestatiet SS tapu HIGH, jo mēs nesācām nekādu pārsūtīšanu uz vergu arduino.
digitalWrite (SS, HIGH);
3. Tukšā lokā ():
- Mēs nolasām spiedpogas tapas statusu, kas savienots ar pin2 (Master Arduino), lai nosūtītu šīs vērtības vergam Arduino.
pogas vērtība = digitalRead (ippoga);
- Iestatiet loģiku x vērtības iestatīšanai (jānosūta vergam) atkarībā no ievades no 2. kontakta
ja (pogas vērtība == AUGSTA) { x = 1; } cits { x = 0; }
- Pirms vērtības nosūtīšanas mums ir jāpazemina vergu atlases vērtība, lai sāktu pārsūtīšanu vergam no kapteiņa.
digitalWrite (SS, LOW);
- Šeit seko svarīgais solis. Šajā paziņojumā mēs nosūtīt spiedpogas vērtību, kas saglabāta mainīgajā Mastersend, vergu arduino un arī saņemt vērtību no verga, kas tiks glabāts Mastereceive mainīgajā.
Mastereceive = SPI.transfer (Mastersend);
- Pēc tam atkarībā no Mastereceive vērtības mēs ieslēdzam vai izslēdzam Master Arduino LED.
ja (Mastereceive == 1) { digitalWrite (LED, HIGH); // Iestata tapu 7 HIGH Serial.println ("Master LED ON"); } cits { digitalWrite (LED, LOW); // Iestata tapu 7 LOW Serial.println ("Master LED OFF"); }
Piezīme: Mēs izmantojam serial.println (), lai skatītu rezultātu Arduino IDE sērijveida motorā . Pārbaudiet videoklipu beigās.
Arduino SPI vergu programmēšanas skaidrojums
1. Vispirms mums jāiekļauj SPI bibliotēka SPI komunikācijas funkciju izmantošanai.
# iekļaut
2. Tukšajā iestatījumā ()
- Mēs sākam sērijveida saziņu ar Baud likmi 115200.
Sērijas sākums (115200);
- Pievienojiet gaismas diode 7. tapai un nospiediet pogu 2. tapai un attiecīgi iestatiet šīs tapas OUTPUT un INPUT.
pinMode (ippoga, INPUT); pinMode (LED, OUTPUT);
- Svarīgs solis šeit ir šādi apgalvojumi
pinMode (MISO, OUTPUT);
Iepriekš minētajā paziņojumā MISO tiek iestatīts kā OUTPUT (jānosūta dati Master IN). Tātad dati tiek nosūtīti caur Slave Arduino MISO.
- Tagad ieslēdziet SPI vergu režīmā, izmantojot SPI vadības reģistru
SPCR - = _BV (SPE);
- Pēc tam ieslēdziet pārtraukumu SPI saziņai. Ja tiek saņemti dati no kapteiņa, tiek izsaukta pārtraucošā kārtība un saņemtā vērtība tiek ņemta no SPDR (SPI datu reģistra)
SPI.attachInterrupt ();
- Vērtība no galvenā tiek ņemta no SPDR un saglabāta mainīgajā Slavereceived . Tas notiek sekojot Interrupt rutīnas funkcijai.
ISR (SPI_STC_vect) { Slavereceived = SPDR; saņemts = patiess; }
3. Tālāk tukšajā ciklā () mēs iestatām Slave arduino LED ieslēgties vai izslēgt atkarībā no Slavereceived vērtības.
if (Slavereceived == 1) { digitalWrite (LEDpin, HIGH); // 7. tapu iestata kā HIGH LED ON Serial.println ("Slave LED ON"); } else { digitalWrite (LEDpin, LOW); // iestata tapu 7 kā LOW LED OFF Serial.println ("Slave LED OFF"); }
- Pēc tam mēs nolasījām Slave Arduino spiedpogas statusu un saglabājām vērtību Slavesend, lai nosūtītu vērtību Master Arduino, piešķirot vērtību SPDR reģistram.
buttonvalue = digitalRead (piespraudes); ja (pogas vērtība == AUGSTA) {x = 1; } cits {x = 0; } Slavesend = x; SPDR = Slavesend;
Piezīme: Mēs izmantojam serial.println (), lai skatītu rezultātu Arduino IDE sērijveida motorā . Pārbaudiet videoklipu beigās.
Kā SPI darbojas ar Arduino? - Pārbaudīsim!
Zemāk ir attēls par SPI sakaru galīgo iestatīšanu starp diviem Arduino dēļiem.
Nospiežot pogu Master pusē, ieslēdzas baltā gaismas diode vergu pusē.
Un, nospiežot spiedpogu verga pusē, ieslēdzas sarkanā gaismas diode galvenajā pusē.
Zemāk redzamo videoklipu varat apskatīt, lai redzētu Arduino SPI komunikācijas demonstrāciju. Ja jums ir kādi jautājumi, lūdzu, atstājiet tos komentāru sadaļā, izmantojiet mūsu forumus.