- Čo je SPI?
- Fungovanie SPI
- SPI piny v Arduine UNO
- Používanie SPI v Arduine
- Komponenty požadované pre komunikáciu Arduino SPI
- Schéma komunikačného obvodu Arduino SPI
- Ako naprogramovať Arduino na komunikáciu SPI:
- Vysvetlenie programovania Arduino SPI Master
- Vysvetlenie programovania Arduino SPI Slave
- Ako funguje SPI na Arduine? - Poďme to vyskúšať!
Mikrokontrolér používa na komunikáciu s rôznymi senzormi a modulmi mnoho rôznych protokolov. Existuje veľa rôznych typov komunikačných protokolov pre bezdrôtovú a káblovú komunikáciu a najbežnejšie používanou komunikačnou technikou je sériová komunikácia. Sériová komunikácia je proces odosielania dát po bitoch, postupne, po komunikačnom kanáli alebo zbernici. Existuje mnoho typov sériovej komunikácie, ako napríklad komunikácia UART, CAN, USB, I2C a SPI.
V tomto tutoriáli sa dozvieme o protokole SPI a o tom, ako ho používať v Arduine. Na komunikáciu medzi dvoma Arduínami použijeme protokol SPI. Tu bude jedno Arduino pôsobiť ako Master a druhé ako Slave, k Arduinu budú pripojené dve LED diódy a tlačidlá. Na demonštráciu SPI komunikácie budeme riadiť LED na hlavnej strane tlačidlom na strane slave a naopak pomocou sériového komunikačného protokolu SPI.
Čo je SPI?
SPI (Serial Peripheral Interface) je sériový komunikačný protokol. Rozhranie SPI našla spoločnosť Motorola v roku 1970. SPI má plne duplexné pripojenie, čo znamená, že údaje sú odosielané a prijímané súčasne. To znamená, že hlavný server môže odosielať údaje slave a podriadený server môže súčasne odosielať údaje do nadradeného modulu. SPI je synchrónna sériová komunikácia, čo znamená, že hodiny sú potrebné na účely komunikácie.
Komunikácia SPI je predtým vysvetlená v iných mikrokontroléroch:
- Komunikácia SPI s mikrokontrolérom PIC PIC16F877A
- Rozhranie 3,5 palcový dotykový TFT LCD s Raspberry Pi
- Programovanie mikrokontroléra AVR s pinmi SPI
- Prepojenie grafického LCD displeja Nokia 5110 s Arduino
Fungovanie SPI
SPI má komunikáciu typu master / slave pomocou štyroch liniek. SPI môže mať iba jedného mastera a môže mať viac slave. Master je zvyčajne mikrokontrolér a otrokmi môžu byť mikrokontrolér, snímače, ADC, DAC, LCD atď.
Ďalej je znázornená bloková schéma SPI Master s Single Slave.
SPI má nasledujúce štyri riadky MISO, MOSI, SS a CLK
- MISO (Master in Slave Out) - linka Slave na zasielanie dát do mastera.
- MOSI (Master Out Slave In) - riadok Master na odosielanie údajov do periférií.
- SCK (Serial Clock) - Hodinové impulzy, ktoré synchronizujú prenos dát generovaný nadradenou jednotkou.
- SS (Slave Select) - Tento pin môže majster použiť na povolenie alebo zakázanie konkrétnych zariadení.
SPI Master s viacerými otrokmi
Na začatie komunikácie medzi nadradeným a podradeným zariadením je potrebné nastaviť pin Slave Select (SS) požadovaného zariadenia na LOW, aby mohol komunikovať s nadradeným zariadením. Keď je vysoká, ignoruje pána. To vám umožní mať viac zariadení SPI zdieľajúcich rovnaké riadky MISO, MOSI a CLK hlavnej jednotky. Ako vidíte na obrázku vyššie, existujú štyri podriadené jednotky, v ktorých sú SCLK, MISO, MOSI bežne pripojené k masteru a SS každého slave sú pripojené osobitne k jednotlivým SS pinom (SS1, SS2, SS3) mastera. Nastavením požadovaného SS kolíka LOW môže master komunikovať s týmto podriadeným.
SPI piny v Arduine UNO
Obrázok nižšie ukazuje SPI piny prítomné Arduino UNO (v červenom poli).
SPI linka |
Pripnite si Arduino |
MOSI |
11 alebo ICSP-4 |
MISO |
12 alebo ICSP-1 |
SCK |
13 alebo ICSP-3 |
SS |
10 |
Používanie SPI v Arduine
Pred začatím programovania pre SPI komunikáciu medzi dvoma Arduinos. Musíme sa dozvedieť viac o knižnici Arduino SPI použitej v Arduino IDE.
Knižnica
1. SPI.begin ()
POUŽITIE: Inicializácia zbernice SPI nastavením SCK, MOSI a SS na výstupy, potiahnutím SCK a MOSI nízko a SS vysoko.
2. SPI.setClockDivider (rozdeľovač)
POUŽITIE: Nastavenie rozdeľovača hodín SPI vzhľadom na systémové hodiny. Dostupné oddeľovače sú 2, 4, 8, 16, 32, 64 alebo 128.
Rozdeľovače:
- SPI_CLOCK_DIV2
- SPI_CLOCK_DIV4
- SPI_CLOCK_DIV8
- SPI_CLOCK_DIV16
- SPI_CLOCK_DIV32
- SPI_CLOCK_DIV64
- SPI_CLOCK_DIV128
3. SPI.attachInterrupt (obslužný program)
POUŽITIE: Táto funkcia sa volá, keď pomocné zariadenie prijíma údaje z hlavnej jednotky.
4. SPI.transfer (val)
POUŽITIE: Táto funkcia sa používa na súčasné odosielanie a prijímanie údajov medzi hlavnou a podradenou jednotkou.
Teraz teda začnime s praktickou ukážkou protokolu SPI v Arduine. V tomto tutoriále použijeme dve arduino, jednu ako pána a druhú ako otroka. Obidve Arduino sú pripevnené LED a tlačidlom zvlášť. Master LED je možné ovládať pomocou ovládacieho tlačidla slave Arduino a slave Arduino LED je možné ovládať tlačidlom master Arduino pomocou komunikačného protokolu SPI v arduino.
Komponenty požadované pre komunikáciu Arduino SPI
- Arduino UNO (2)
- LED (2)
- Tlačidlo (2)
- Rezistor 10k (2)
- Rezistor 2,2k (2)
- Nepál
- Pripojenie drôtov
Schéma komunikačného obvodu Arduino SPI
Nižšie uvedená schéma zapojenia ukazuje, ako používať SPI na Arduino UNO, ale môžete postupovať rovnako pri komunikácii Arduino Mega SPI alebo Arduino nano SPI. Takmer všetko zostane rovnaké, okrem čísla PIN. Musíte skontrolovať pinout Arduino nano alebo mega, aby ste našli kolíky Arduino nano SPI a Arduino Mega, akonáhle urobíte, že všetky ostatné budú rovnaké.
Vyššie uvedený obvod som postavil na nepájivej doske, nižšie môžete vidieť nastavenie obvodu, ktoré som použil na testovanie.
Ako naprogramovať Arduino na komunikáciu SPI:
Tento tutoriál má dva programy, jeden pre hlavné Arduino a druhý pre podradené Arduino. Kompletné programy pre obe strany sú uvedené na konci tohto projektu.
Vysvetlenie programovania Arduino SPI Master
1. Najskôr musíme zahrnúť knižnicu SPI na používanie komunikačných funkcií SPI.
#include
2. V neplatnom nastavení ()
- Sériovú komunikáciu začíname prenosovou rýchlosťou 115200.
Serial.begin (115200);
- Pripojte LED ku kolíku 7 a stlačte tlačidlo ku kolíku 2 a nastavte tieto kolíky OUTPUT a INPUT.
pinMode (ipbutton, INPUT); pinMode (LED, VÝSTUP);
- Ďalej začíname komunikáciu SPI
SPI.begin ();
- Ďalej sme nastavili Clockdivider pre SPI komunikáciu. Tu sme nastavili rozdeľovač 8.
SPI.setClockDivider (SPI_CLOCK_DIV8);
- Potom nastavte SS kolík VYSOKÝ, pretože sme nezačali so žiadnym prenosom na slave arduino.
digitalWrite (SS, HIGH);
3. V neplatnej slučke ():
- Načítame stav pinu tlačidla pripojeného k pinu 2 (Master Arduino) na odoslanie týchto hodnôt podriadenému Arduinu.
buttonvalue = digitalRead (ipbutton);
- Logika nastavenia pre nastavenie hodnoty x (bude odoslaná slave) v závislosti od vstupu z kolíka 2
if (buttonvalue == HIGH) { x = 1; } else { x = 0; }
- Pred odoslaním hodnoty musíme LOW slave zvoliť hodnotu, aby sa zahájil prenos na slave z mastera.
digitalWrite (SS, LOW);
- Prichádza dôležitý krok, v nasledujúcom vyhlásení pošleme hodnotu tlačidla uloženú v premennej Mastersend na slave arduino a tiež dostaneme hodnotu od slave, ktorá bude uložená v premennej Mastereceive .
Mastereceive = SPI.transfer (Mastersend);
- Potom v závislosti na hodnote mastereceive zapneme alebo vypneme LED Master Arduino.
if (Mastereceive == 1) { digitalWrite (LED, HIGH); // Nastaví pin 7 HIGH Serial.println ("Hlavná LED svieti"); } else { digitalWrite (LED, LOW); // Nastaví pin 7 LOW Serial.println ("Hlavná LED nesvieti"); }
Poznámka: Na zobrazenie výsledku v Serial Motor of Arduino IDE používame serial.println () . Skontrolujte video na konci.
Vysvetlenie programovania Arduino SPI Slave
1. Najskôr musíme zahrnúť knižnicu SPI na používanie komunikačných funkcií SPI.
#include
2. V neplatnom nastavení ()
- Sériovú komunikáciu začíname prenosovou rýchlosťou 115200.
Serial.begin (115200);
- Pripojte LED na pin 7 a stlačte na pin2 a nastavte tieto piny OUTPUT a INPUT.
pinMode (ipbutton, INPUT); pinMode (LED, VÝSTUP);
- Dôležitým krokom sú nasledujúce tvrdenia
pinMode (MISO, VÝSTUP);
Vyššie uvedené vyhlásenie nastaví MISO ako VÝSTUP (Musí poslať údaje Master IN). Dáta sú teda odosielané cez MISO spoločnosti Slave Arduino.
- Teraz zapnite SPI v režime Slave pomocou ovládacieho registra SPI
SPCR - = _BV (SPE);
- Potom zapnite prerušenie pre komunikáciu SPI. Ak sú dáta prijaté z mastera, volá sa prerušovacia rutina a prijatá hodnota je prevzatá z SPDR (SPI data Register)
SPI.attachInterrupt ();
- Hodnota z mastera je prevzatá z SPDR a je uložená v premennej prijatej slavou . To sa deje v nasledujúcej funkcii prerušenia rutiny.
ISR (SPI_STC_vect) { Slavereceived = SPDR; prijaté = pravda; }
3. Ďalej vo void loop () nastavíme LED diódu Slave arduino na ZAPNUTIE alebo VYPNUTIE v závislosti od hodnoty prijatej Slávou.
if (Slavereceived == 1) { digitalWrite (LEDpin, HIGH); // Nastaví pin 7 na HIGH LED ON Serial.println ("Slave LED ON"); } else { digitalWrite (LEDpin, LOW); // Nastaví pin 7 na LOW LED OFF Serial.println ("Slave LED OFF"); }
- Ďalej prečítame stav tlačidla Slave Arduino a uložíme hodnotu do Slavesend, aby sme hodnotu poslali do Master Arduino tak, že dáme hodnotu do registra SPDR.
buttonvalue = digitalRead (buttonpin); if (buttonvalue == HIGH) {x = 1; } else {x = 0; } Slavesend = x; SPDR = Slavesend;
Poznámka: Na zobrazenie výsledku v Serial Motor of Arduino IDE používame serial.println () . Skontrolujte video na konci.
Ako funguje SPI na Arduine? - Poďme to vyskúšať!
Nižšie je uvedený obrázok konečného nastavenia pre komunikáciu SPI medzi dvoma doskami Arduino.
Po stlačení tlačidla na strane Master sa rozsvieti biela LED na strane slave.
A keď je stlačené tlačidlo na strane Slave, rozsvieti sa červená LED na strane Master.
Môžete sa pozrieť na video nižšie a pozrieť si ukážku komunikácie Arduino SPI. Ak máte akékoľvek otázky, nechajte ich v sekcii komentárov v našom fóre.