- Kas yra SPI?
- SPI darbas
- SPI kaiščiai „Arduino UNO“
- SPI naudojimas „Arduino“
- Komponentai, reikalingi „Arduino SPI“ ryšiui
- „Arduino SPI“ ryšio grandinės schema
- Kaip užprogramuoti „Arduino“ SPI komunikacijai:
- „Arduino“ SPI magistro programavimo paaiškinimas
- „Arduino SPI Slave“ programavimo paaiškinimas
- Kaip SPI veikia „Arduino“? - Išbandykime!
Mikrovaldiklis naudoja daug skirtingų protokolų, kad galėtų bendrauti su įvairiais jutikliais ir moduliais. Yra daug įvairių belaidžio ir laidinio ryšio protokolų tipų, o dažniausiai naudojama komunikacijos technika yra nuoseklioji komunikacija. Nuoseklioji komunikacija yra duomenų siuntimo po vieną bitą, nuosekliai, perdavimo kanalu ar magistrale procesas. Yra daugybė nuosekliojo ryšio tipų, tokių kaip UART, CAN, USB, I2C ir SPI.
Šioje pamokoje sužinome apie SPI protokolą ir kaip jį naudoti „Arduino“. Mes naudosime SPI protokolą bendravimo tarp dviejų Arduinos. Čia vienas „Arduino“ veiks kaip „Master“, o kitas - kaip „Slave“, prie abiejų „Arduino“ bus prijungti du šviesos diodai ir mygtukai. Norėdami parodyti SPI ryšį, valdysime pagrindinį šoninį šviesos diodą paspausdami mygtuką vergo pusėje ir atvirkščiai, naudodami SPI nuoseklaus ryšio protokolą.
Kas yra SPI?
SPI (nuoseklioji periferinė sąsaja) yra nuoseklaus ryšio protokolas. SPI sąsają „Motorola“ rado 1970 m. SPI turi pilną dvipusį ryšį, o tai reiškia, kad duomenys siunčiami ir gaunami vienu metu. Tai reiškia, kad šeimininkas gali siųsti duomenis vergui, o vergas - vienu metu. SPI yra sinchroninis nuoseklusis ryšys - laikrodis reikalingas ryšio tikslais.
SPI ryšys anksčiau buvo paaiškintas kituose mikrovaldikliuose:
- SPI ryšys su PIC mikrovaldikliu PIC16F877A
- 3,5 colių jutiklinio ekrano TFT skystųjų kristalų ekranas su „Raspberry Pi“
- AVR mikrovaldiklio programavimas su SPI kaiščiais
- Sąsaja su „Nokia 5110“ grafiniu LCD su „Arduino“
SPI darbas
SPI turi pagrindinį ir pavaldųjį ryšį naudodamas keturias eilutes. SPI gali turėti tik vieną šeimininką ir kelis vergus. Šeimininkas paprastai yra mikrovaldiklis, o vergai gali būti mikrovaldiklis, jutikliai, ADC, DAC, LCD ir kt.
Žemiau pateikiama SPI Master su Single Slave blokinė schema.
SPI turi keturias eilutes: MISO, MOSI, SS ir CLK
- „MISO“ („Master in Slave Out“) - „Slave“ linija, skirta siųsti duomenis valdytojui.
- MOSI (Master Out Slave In) - pagrindinė linija duomenims siųsti į periferinius įrenginius.
- SCK (nuoseklusis laikrodis) - laikrodžio impulsai, kurie sinchronizuoja pagrindinio kompiuterio sugeneruotą duomenų perdavimą.
- SS („Slave Select“) - meistras gali naudoti šį kaištį tam, kad įjungtų ir išjungtų konkrečius įrenginius.
SPI meistras su keliais vergais
Norėdami užmegzti ryšį tarp pagrindinio ir vergo, turime nustatyti reikiamo įrenginio „Slave Select“ (SS) kaištį į LOW, kad jis galėtų bendrauti su pagrindiniu. Kai jis aukštas, jis nepaiso meistro. Tai leidžia jums turėti kelis SPI įrenginius, naudojančius tas pačias MISO, MOSI ir CLK pagrindines linijas. Kaip matote aukščiau pateiktame paveikslėlyje, yra keturi vergai, kuriuose SCLK, MISO, MOSI yra bendrai prijungti prie pagrindinio kompiuterio, o kiekvieno vergo SS yra atskirai prijungti prie atskirų pagrindinio SS kaiščių (SS1, SS2, SS3). Nustačius reikiamą SS kaištį LOW, meistras gali bendrauti su šiuo vergu.
SPI kaiščiai „Arduino UNO“
Žemiau pateiktame paveikslėlyje rodomi SPI kaiščiai, esantys „Arduino UNO“ (raudonoje dėžutėje).
SPI linija |
Prisegti „Arduino“ |
MOSI |
11 arba ICSP-4 |
MISO |
12 arba ICSP-1 |
SCK |
13 arba ICSP-3 |
SS |
10 |
SPI naudojimas „Arduino“
Prieš pradedant programuoti SPI ryšį tarp dviejų „Arduinos“. Turime sužinoti apie „ Arduino“ SPI biblioteką, naudojamą „Arduino IDE“.
Biblioteka
1. SPI.prasideda ()
NAUDOJIMAS: Inicijuokite SPI magistralę nustatydami SCK, MOSI ir SS išvestims, traukdami SCK ir MOSI žemus, o SS aukštus.
2. SPI.setClockDivider (daliklis)
NAUDOJIMAS: Norėdami nustatyti SPI laikrodžio daliklį, palyginti su sistemos laikrodžiu. Skirstytuvai yra 2, 4, 8, 16, 32, 64 arba 128.
Skirstytuvai:
- SPI_CLOCK_DIV2
- SPI_CLOCK_DIV4
- SPI_CLOCK_DIV8
- SPI_CLOCK_DIV16
- SPI_CLOCK_DIV32
- SPI_CLOCK_DIV64
- SPI_CLOCK_DIV128
3. SPI.attachIntrrupt (tvarkytojas)
NAUDOTI: Ši funkcija iškviečiama, kai vergo įrenginys gauna duomenis iš pagrindinio.
4. SPI.transfer (val)
NAUDOTI: ši funkcija naudojama tuo pačiu metu siųsti ir gauti duomenis tarp pagrindinio ir pavaldinio.
Taigi dabar pradėkime nuo praktinio SPI protokolo demonstravimo „Arduino“. Šioje pamokoje mes naudosime du „arduino“ kaip pagrindinius ir kitus kaip vergus. Abi „Arduino“ atskirai pritvirtintos su LED ir mygtuku. Pagrindinį šviesos diodą galima valdyti naudojant vergo „Arduino“ mygtuką ir vergo „Arduino“ šviesos diodą - valdant pagrindinį „Arduino“ mygtuką, naudojant SPI ryšio protokolą, esantį „arduino“.
Komponentai, reikalingi „Arduino SPI“ ryšiui
- „Arduino UNO“ (2)
- LED (2)
- Mygtukas (2)
- Rezistorius 10k (2)
- Rezistorius 2.2k (2)
- Bandomoji Lenta
- Laidų sujungimas
„Arduino SPI“ ryšio grandinės schema
Žemiau pateiktoje grandinės schemoje parodyta, kaip naudoti SPI „Arduino UNO“, tačiau tą pačią procedūrą galite atlikti ir „Arduino Mega SPI Communication“ arba „Arduino nano SPI“ ryšiui. Beveik viskas išliks ta pati, išskyrus PIN kodą. Norėdami rasti „Arduino nano SPI“ ir „Arduino Mega“ kaiščius, turite patikrinti „Arduino nano“ arba „mega“ kištuką, kai tai padarysite, kad visa kita bus tokia pati.
Pirmiau parodytą grandinę sukūriau virš duonos lentos, žemiau galite pamatyti grandinės sąranką, kurią naudojau bandymams.
Kaip užprogramuoti „Arduino“ SPI komunikacijai:
Šioje pamokoje yra dvi programos, skirtos meistrui „Arduino“, kitos - vergui „Arduino“. Užbaigtos programos abiem pusėms pateikiamos šio projekto pabaigoje.
„Arduino“ SPI magistro programavimo paaiškinimas
1. Pirmiausia turime įtraukti SPI biblioteką naudodamiesi SPI komunikacijos funkcijomis.
# įtraukti
2. Neteisingoje sąrankoje ()
- Nuoseklią komunikaciją pradedame 115200 perdavimo sparta.
Serijos pradžia (115200);
- Pritvirtinkite šviesos diodą prie 7 kaiščio ir paspauskite mygtuką prie 2 kaiščio ir nustatykite tuos kaiščius atitinkamai OUTPUT ir INPUT.
pinMode (ip mygtukas, INPUT); pinMode (LED, OUTPUT);
- Toliau pradedame SPI bendravimą
SPI.prasideda ();
- Tada nustatėme „Clockdivider“ SPI ryšiui. Čia mes nustatėme daliklį 8.
SPI.setClockDivider (SPI_CLOCK_DIV8);
- Tada nustatykite SS kaištį HIGH, nes mes nepradėjome jokio perkėlimo į vergo arduino.
„digitalWrite“ (SS, HIGH);
3. Tuščioje kilpoje ():
- Mes perskaitėme mygtuko, prijungto prie pin2 (Master Arduino), būseną, kad ši vertė būtų siunčiama vergui Arduino.
mygtuko reikšmė = digitalRead (ip mygtukas);
- Nustatykite logiką nustatydami x vertę (bus siunčiami vergui), atsižvelgiant į įvestį iš 2 kaiščio
if (mygtuko reikšmė == AUKŠTAS) { x = 1; } dar { x = 0; }
- Prieš siunčiant vertę, mes turime SUMINTI vergo pasirinkimo vertę, kad pradėtume perduoti vergui iš pagrindinio.
„digitalWrite“ (SS, LOW);
- Čia pateikiamas svarbus žingsnis, šiame sakinyje mes siunčiame „ Mastersend“ kintamajame saugomą mygtuko vertę vergo „arduino“ ir taip pat gauname vertę iš vergo, kuris bus saugomas „ Mastereceive“ kintamajame.
Mastereceive = SPI.transfer (Mastersend);
- Po to, priklausomai nuo „ Mastereceive“ vertės, „Master Arduino“ šviesos diodą įjungsime arba išjungsime .
if (Mastereceive == 1) { digitalWrite (LED, HIGH); // Nustatomas kaištis 7 HIGH Serial.println („Pagrindinis šviesos diodas įjungtas“); } else { digitalWrite (LED, LOW); // Nustato kaištį 7 LOW Serial.println („Pagrindinis LED išjungtas“); }
Pastaba: Mes naudojame serial.println (), norėdami peržiūrėti rezultatus „Arduino IDE“ serijos variklyje. Pabaigoje patikrinkite vaizdo įrašą.
„Arduino SPI Slave“ programavimo paaiškinimas
1. Pirmiausia turime įtraukti SPI biblioteką naudodamiesi SPI komunikacijos funkcijomis.
# įtraukti
2. Neteisingoje sąrankoje ()
- Nuoseklią komunikaciją pradedame 115200 perdavimo sparta.
Serijos pradžia (115200);
- Pritvirtinkite šviesos diodą prie 7 kaiščio ir paspauskite mygtuką prie 2 kaiščio ir atitinkamai nustatykite tuos kaiščius OUTPUT ir INPUT.
pinMode (ip mygtukas, INPUT); pinMode (LED, OUTPUT);
- Svarbus žingsnis yra šie teiginiai
pinMode (MISO, OUTPUT);
Pirmiau pateiktame teiginyje MISO nustatomas kaip OUTPUT (reikia siųsti duomenis „Master IN“). Taigi duomenys siunčiami per „Slave Arduino“ MISO.
- Dabar įjunkite SPI vergo režimu naudodami SPI valdymo registrą
SPCR - = _BV (SPE);
- Tada įjunkite pertraukimą SPI ryšiui. Jei duomenys gaunami iš magistro, iškviečiama pertraukiamoji programa ir gauta vertė paimama iš SPDR (SPI duomenų registras)
SPI.attachInterrupt ();
- Vertė iš pagrindinio yra paimta iš SPDR ir saugoma Slavereceived kintamajame. Tai vyksta vykdant „Interrupt Routine“ funkciją.
ISR (SPI_STC_vect) { Slavereceived = SPDR; gautas = tiesa; }
3. Toliau „void loop“ () nustatėme „Slave“ arduino šviesos diodą įjungti arba išjungti, priklausomai nuo „Slavereceived“ vertės.
if (Slavereceived == 1) { digitalWrite (LEDpin, HIGH); // 7 kaištį nustato kaip HIGH LED ON Serial.println („Slave LED ON“); } else { digitalWrite (LEDpin, LOW); // 7 kaištį nustato kaip LOW LED OFF Serial.println („Slave LED OFF“); }
- Tada mes perskaitėme „Slave Arduino“ mygtuko būseną ir išsaugojome vertę „ Slavesend“, norėdami nusiųsti vertę „Master Arduino“, suteikdami vertę SPDR registrui.
mygtuko reikšmė = digitalRead (sagutė); if (mygtuko reikšmė == AUKŠTAS) {x = 1; } dar {x = 0; } Vergas = x; SPDR = „Slavesend“;
Pastaba: Mes naudojame serial.println (), norėdami peržiūrėti rezultatus „Arduino IDE“ serijos variklyje. Pabaigoje patikrinkite vaizdo įrašą.
Kaip SPI veikia „Arduino“? - Išbandykime!
Žemiau pateikiama galutinės SPI ryšio tarp dviejų „Arduino“ plokščių sąrankos nuotrauka .
Paspaudus pagrindiniame šone esantį mygtuką, vergo pusėje įsijungia baltas šviesos diodas.
Kai paspaudžiamas mygtukas vergo pusėje, raudonas šviesos diodas pagrindinėje pusėje įsijungia.
Galite pamatyti toliau pateiktą vaizdo įrašą, kad pamatytumėte „Arduino SPI“ komunikacijos demonstraciją. Jei turite klausimų, palikite juos komentarų skiltyje, naudokitės mūsų forumais.