- Mikä on SPI?
- SPI: n toiminta
- SPI-nastat Arduino UNO: ssa
- SPI: n käyttö Arduinossa
- Komponentit, joita tarvitaan Arduino SPI -viestintään
- Arduino SPI -viestintäpiirikaavio
- Kuinka ohjelmoida Arduino SPI-viestintään:
- Arduino SPI Master -ohjelmoinnin selitys
- Arduino SPI Slave -ohjelmointi Selitys
- Kuinka SPI toimii Arduinossa? - Testataan!
Mikrokontrolleri käyttää monia erilaisia protokollia kommunikoimaan erilaisten antureiden ja moduulien kanssa. Langattomalle ja langalliselle viestinnälle on olemassa monia erityyppisiä yhteyskäytäntöjä, ja yleisimmin käytetty viestintätekniikka on sarjaliikenne. Sarjaliikenne on prosessi, jolla dataa lähetetään yksi bitti kerrallaan, peräkkäin, tietoliikennekanavan tai väylän kautta. Sarjaviestintää on monenlaisia, kuten UART, CAN, USB, I2C ja SPI.
Tässä opetusohjelmassa opit SPI-protokollasta ja sen käytöstä Arduinossa. Käytämme SPI-protokollaa kahden Arduinon väliseen viestintään. Täällä yksi Arduino toimii isäntänä ja toinen orjana, kaksi LEDiä ja painonappia kytketään molempiin Arduinoihin. SPI-tiedonsiirron osoittamiseksi ohjaamme isäntäpuolen LEDiä orjapuolen painikkeella ja päinvastoin SPI-sarjaliikenneprotokollaa käyttämällä.
Mikä on SPI?
SPI (Serial Peripheral Interface) on sarjaliikenneprotokolla. Motorola löysi SPI-liitännän vuonna 1970. SPI: llä on full-duplex-yhteys, mikä tarkoittaa, että tiedot lähetetään ja vastaanotetaan samanaikaisesti. Eli isäntä voi lähettää tietoja orjalle ja orja voi lähettää tietoja isännälle samanaikaisesti. SPI on synkroninen sarjaliikenne tarkoittaa, että kelloa tarvitaan viestintätarkoituksiin.
SPI-viestintä on aiemmin selitetty muissa mikro-ohjaimissa:
- SPI-tiedonsiirto PIC-mikrokontrollerin PIC16F877A kanssa
- Yhteensopiva 3,5 tuuman TFT-kosketusnäyttö ja Raspberry Pi
- AVR-mikrokontrollerin ohjelmointi SPI-nastoilla
- Nokia 5110 -näytönohjaimen ja Arduinon liitäntä
SPI: n toiminta
SPI: llä on isäntä / orja-tiedonsiirto käyttäen neljää riviä. SPI: llä voi olla vain yksi isäntä ja useita orjia. Master on yleensä mikro-ohjain ja orjat voivat olla mikro-ohjain, anturit, ADC, DAC, LCD jne.
Alla on lohkokaavioesitys SPI- masterista yhden orjan kanssa.
SPI: llä on seuraavat neljä riviä: MISO, MOSI, SS ja CLK
- MISO (Master in Slave Out) - Slave-rivi tietojen lähettämiseen isännälle.
- MOSI (Master Out Slave In) - Master-linja tietojen lähettämiseen oheislaitteille.
- SCK (sarjakello) - kellopulssit, jotka synkronoivat isännän tuottaman tiedonsiirron.
- SS ( orjavalinta ) - päällikkö voi käyttää tätä nastaa tiettyjen laitteiden käyttöönottoon ja poistamiseen käytöstä.
SPI-isäntä, jossa on useita orjia
Yhteyden aloittamiseksi isännän ja orjan välillä meidän on asetettava vaaditun laitteen Slave Select (SS) -tappi LOW-arvoon, jotta se voi olla yhteydessä isäntään. Kun se on korkea, se jättää isännän huomiotta. Tämän avulla voit saada useita SPI-laitteita jakamaan saman MISO-, MOSI- ja CLK-päälinjan. Kuten yllä olevasta kuvasta näet, on neljä orjaa, joissa SCLK, MISO, MOSI on yhteisesti kytketty isäntään ja kunkin orjan SS on kytketty erikseen masterin yksittäisiin SS-nastoihin (SS1, SS2, SS3). Asettamalla vaaditun SS-nastan LOW päällikkö voi kommunikoida kyseisen orjan kanssa.
SPI-nastat Arduino UNO: ssa
Alla olevassa kuvassa on SPI-nastat, joissa on Arduino UNO (punaisessa laatikossa).
SPI-linja |
Kiinnitä Arduinoon |
MOSI |
11 tai ICSP-4 |
MISO |
12 tai ICSP-1 |
SCK |
13 tai ICSP-3 |
SS |
10 |
SPI: n käyttö Arduinossa
Ennen kuin aloitat SPI-viestinnän ohjelmoinnin kahden Arduinon välillä. Meidän on opittava Arduino IDE: ssä käytetystä Arduino SPI -kirjastosta.
Kirjasto
1. SPI.begin ()
KÄYTTÖ: Alustaa SPI-väylä asettamalla SCK, MOSI ja SS ulostuloihin, vetämällä SCK ja MOSI mataliksi ja SS korkeaksi.
2. SPI.setClockDivider (jakaja)
KÄYTTÖ: SPI-kellonjakajan asettaminen suhteessa järjestelmän kelloon. Saatavilla olevat jakajat ovat 2, 4, 8, 16, 32, 64 tai 128.
Jakajat:
- SPI_CLOCK_DIV2
- SPI_CLOCK_DIV4
- SPI_CLOCK_DIV8
- SPI_CLOCK_DIV16
- SPI_CLOCK_DIV32
- SPI_CLOCK_DIV64
- SPI_CLOCK_DIV128
3. SPI.attachInterrupt (käsittelijä)
KÄYTTÖ: Tätä toimintoa kutsutaan, kun orjalaite vastaanottaa tietoja isännältä.
4. SPI.siirto (val)
KÄYTTÖ: Tätä toimintoa käytetään tietojen lähettämiseen ja vastaanottamiseen samanaikaisesti isännän ja orjan välillä.
Joten aloitetaan nyt SPI-protokollan käytännön esittelystä Arduinossa. Tässä opetusohjelmassa käytämme kahta arduinoa yhtä isäntänä ja toista orjana. Molemmat Arduino on kiinnitetty LEDillä ja painikkeella erikseen. Master-LEDiä voidaan ohjata orja Arduinon painikkeella ja orja Arduinon LEDiä voidaan ohjata isäntä Arduinon painikkeella käyttämällä arduinossa olevaa SPI-yhteyskäytäntöä.
Komponentit, joita tarvitaan Arduino SPI -viestintään
- Arduino UNO (2)
- LED (2)
- Painike (2)
- Vastus 10k (2)
- Vastus 2.2k (2)
- Leipälauta
- Johtojen liittäminen
Arduino SPI -viestintäpiirikaavio
Alla oleva piirikaavio näyttää, kuinka SPI: tä käytetään Arduino UNO: ssa, mutta voit noudattaa samaa menettelyä Arduino Mega SPI Communication- tai Arduino nano SPI -viestinnässä. Lähes kaikki pysyy samana lukuun ottamatta PIN-numeroa. Sinun on tarkistettava Arduino nanon tai megan pinout, jotta löydät Arduino nano SPI -nastat ja Arduino Mega -nastat, kun olet tehnyt, että kaikki muu on sama.
Olen rakentanut yllä esitetyn piirin leipälautan päälle, näet alla olevan piirin kokoonpanon, jota käytin testauksessa.
Kuinka ohjelmoida Arduino SPI-viestintään:
Tässä opetusohjelmassa on kaksi ohjelmaa, yksi Arduinon päällikölle ja toinen orja Arduinolle. Molempien osapuolten täydelliset ohjelmat annetaan tämän projektin lopussa.
Arduino SPI Master -ohjelmoinnin selitys
1. Ensinnäkin meidän on sisällytettävä SPI-kirjasto SPI-viestintätoimintojen käyttöä varten.
#sisältää
2. Tyhjässä asennuksessa ()
- Aloitamme sarjaliikenteen tiedonsiirtonopeudella 115200.
Sarjan alku (115200);
- Kiinnitä LED nastaan 7 ja paina nappia nastaan 2 ja aseta kyseiset nastat OUTPUT ja INPUT.
pinMode (ip-painike, INPUT); pinMode (LED, OUTPUT);
- Seuraavaksi aloitamme SPI-viestinnän
SPI alkaa ();
- Seuraavaksi asetetaan Clockdivider SPI-viestintää varten. Tässä olemme asettaneet jakajan 8.
SPI.setClockDivider (SPI_CLOCK_DIV8);
- Aseta sitten SS-nasta KORKEA, koska emme aloittaneet mitään siirtoa orja-arduinoon.
digitalWrite (SS, HIGH);
3. Tyhjässä silmukassa ():
- Luemme pin2: een liitetyn painonastan (Master Arduino) tilan näiden arvojen lähettämiseksi orja Arduinolle.
buttonvalue = digitalRead (ip-painike);
- Aseta logiikka x-arvon asettamiselle (lähetetään orjalle) riippuen nastasta 2 tulevasta tulosta
jos (painikkeen arvo == KORKEA) { x = 1; } muu { x = 0; }
- Ennen arvon lähettämistä meidän on alitettava orjan valintaarvo aloittaaksesi siirron orjalle isännältä.
digitalWrite (SS, LOW);
- Tässä tulee tärkeä vaihe, seuraavassa lauseessa lähetämme Mastersend- muuttujaan tallennetun painikkeen arvon orja-arduinolle ja saamme myös arvon orjalta, joka tallennetaan Mastereceive- muuttujaan.
Mastereceive = SPI.siirto (Mastersend);
- Sen jälkeen Mastereceive- arvosta riippuen kytkemme Master Arduino -LEDin päälle tai pois päältä.
if (Mastereceive == 1) { digitalWrite (LED, KORKEA); // Asettaa nastan 7 HIGH Serial.println ("Master LED ON"); } else { digitalWrite (LED, LOW); // Asettaa nastan 7 LOW Serial.println ("Master LED OFF"); }
Huomaa: Käytämme sarjaa.println () tarkastellaksesi tulosta Arduino IDE : n sarjamoottorissa . Tarkista video lopussa.
Arduino SPI Slave -ohjelmointi Selitys
1. Ensinnäkin meidän on sisällytettävä SPI-kirjasto SPI-viestintätoimintojen käyttöä varten.
#sisältää
2. Tyhjässä asennuksessa ()
- Aloitamme sarjaliikenteen tiedonsiirtonopeudella 115200.
Sarjan alku (115200);
- Kiinnitä LED nastaan 7 ja paina painiketta nastaan 2 ja aseta kyseiset nastat OUTPUT ja INPUT.
pinMode (ip-painike, INPUT); pinMode (LED, OUTPUT);
- Tärkeä askel tässä ovat seuraavat lausunnot
pinMode (MISO, OUTPUT);
Yllä oleva lause asettaa MISOn OUTPUT-tilaksi (täytyy lähettää tietoja Master IN: lle). Joten tiedot lähetetään MISO: n kautta Slave Arduinosta.
- Kytke nyt SPI päälle orjatilassa SPI Control Register -sovelluksella
SPCR - = _BV (SPE);
- Kytke sitten keskeytys päälle SPI-tiedonsiirtoa varten. Jos tietoja vastaanotetaan päälliköltä, soitetaan keskeytysrutiini ja vastaanotettu arvo otetaan SPDR: stä (SPI-tietorekisteri)
SPI.attachInterrupt ();
- Master-arvo otetaan SPDR: ltä ja tallennetaan Slavereceived- muuttujaan. Tämä tapahtuu seuraavassa keskeytysrutiinitoiminnossa.
ISR (SPI_STC_vect) { Slavereceived = SPDR; saatu = tosi; }
3. Seuraavaksi tyhjässä silmukassa () asetetaan Slave arduino -valo syttymään päälle tai pois päältä riippuen vastaanotetusta arvosta.
if (Slavereceived == 1) { digitalWrite (LEDpin, HIGH); // Asettaa nastan 7 HIGH LED ON -sarjan.println ("Slave LED ON"); } else { digitalWrite (LEDpin, LOW); // Asettaa nastan 7 LOW LED OFF Serial.println ("Slave LED OFF"); }
- Seuraavaksi luemme Slave Arduino -painikkeen tilan ja tallennamme arvon Slavesendiin, jotta arvo voidaan lähettää Master Arduinolle antamalla arvo SPDR-rekisterille.
buttonvalue = digitalRead (napinappi); jos (painikkeen arvo == KORKEA) {x = 1; } muu {x = 0; } Slavesend = x; SPDR = Slavesend;
Huomaa: Käytämme sarjaa.println () tarkastellaksesi tulosta Arduino IDE : n sarjamoottorissa . Tarkista video lopussa.
Kuinka SPI toimii Arduinossa? - Testataan!
Alla on kuva SPI-viestinnän lopullisesta asetuksesta kahden Arduino- levyn välillä.
Kun master-puolen painiketta painetaan, orjapuolen valkoinen LED syttyy.
Ja kun orjapuolen painiketta painetaan, punainen LED Master-puolella syttyy.
Katso alla oleva video nähdäksesi esityksen Arduino SPI -viestinnästä. Jos sinulla on kysyttävää, jätä ne kommenttiosioon, käytä foorumeitamme.