- Co je SPI?
- Práce SPI
- SPI piny v Arduino UNO
- Používání SPI v Arduinu
- Komponenty potřebné pro komunikaci Arduino SPI
- Schéma zapojení Arduino SPI
- Jak naprogramovat Arduino pro komunikaci SPI:
- Vysvětlení programování Arduino SPI Master
- Vysvětlení programování Arduino SPI Slave
- Jak SPI funguje na Arduinu? - Zkusme to!
Mikrokontrolér používá ke komunikaci s různými senzory a moduly mnoho různých protokolů. Existuje mnoho různých typů komunikačních protokolů pro bezdrátovou a kabelovou komunikaci a nejběžněji používanou komunikační technikou je sériová komunikace. Sériová komunikace je proces posílání dat po bitech, postupně, po komunikačním kanálu nebo sběrnici. Existuje mnoho typů sériové komunikace, jako je komunikace UART, CAN, USB, I2C a SPI.
V tomto tutoriálu se dozvídáme o protokolu SPI a jeho použití v Arduinu. Pro komunikaci mezi dvěma Arduiny použijeme protokol SPI. Zde bude jedno Arduino fungovat jako Master a druhé jako Slave, k oběma Arduino budou připojeny dvě LED diody a tlačítka. Abychom předvedli komunikaci SPI, budeme ovládat LED na hlavní straně tlačítkem na straně slave a naopak pomocí sériového komunikačního protokolu SPI.
Co je SPI?
SPI (Serial Peripheral Interface) je sériový komunikační protokol. Rozhraní SPI našla společnost Motorola v roce 1970. SPI má plně duplexní připojení, což znamená, že data jsou odesílána a přijímána současně. To znamená, že master může odesílat data slave a slave může odesílat data do masteru současně. SPI je synchronní sériová komunikace, což znamená, že hodiny jsou vyžadovány pro komunikační účely.
Komunikace SPI je dříve vysvětlena v jiných mikrokontrolérech:
- Komunikace SPI s mikrokontrolérem PIC PIC16F877A
- Rozhraní 3,5 palcový dotykový TFT LCD s Raspberry Pi
- Programování mikrokontroléru AVR s piny SPI
- Propojení grafického LCD displeje Nokia 5110 s Arduino
Práce SPI
SPI má komunikaci master / slave pomocí čtyř linek. SPI může mít pouze jednoho pána a může mít více otroků. Master je obvykle mikrokontrolér a otroky mohou být mikrokontrolér, senzory, ADC, DAC, LCD atd.
Níže je blokové schéma znázornění SPI Master s Single Slave.
SPI má následující čtyři řádky MISO, MOSI, SS a CLK
- MISO (Master in Slave Out) - Linka Slave pro odesílání dat do masteru.
- MOSI (Master Out Slave In) - hlavní linka pro odesílání dat do periferních zařízení.
- SCK (Serial Clock) - Hodinové pulsy, které synchronizují přenos dat generovaný masterem.
- SS (Slave Select) - Mistr může pomocí tohoto pinu povolit a zakázat konkrétní zařízení.
SPI Master s více otroky
Chcete-li zahájit komunikaci mezi masterem a slave, musíme nastavit pin Slave Select (SS) požadovaného zařízení na LOW, aby mohl komunikovat s masterem. Když je vysoká, ignoruje pána. To vám umožní mít více zařízení SPI sdílejících stejné řádky MISO, MOSI a CLK hlavní jednotky. Jak můžete vidět na obrázku výše, existují čtyři slave, ve kterých jsou SCLK, MISO, MOSI běžně připojeny k masteru a SS každého slave jsou připojeny samostatně k jednotlivým SS pinům (SS1, SS2, SS3) masteru. Nastavením požadovaného SS pin LOW může master komunikovat s tímto slave.
SPI piny v Arduino UNO
Obrázek níže ukazuje SPI piny přítomné Arduino UNO (v červeném poli).
Linka SPI |
Připojte Arduino |
MOSI |
11 nebo ICSP-4 |
MISO |
12 nebo ICSP-1 |
SCK |
13 nebo ICSP-3 |
SS |
10 |
Používání SPI v Arduinu
Před zahájením programování komunikace SPI mezi dvěma Arduinos. Musíme se dozvědět o knihovně Arduino SPI používané v Arduino IDE.
Knihovna
1. SPI.begin ()
POUŽITÍ: Inicializace sběrnice SPI nastavením SCK, MOSI a SS na výstupy, zatažením SCK a MOSI nízko a SS vysoko.
2. SPI.setClockDivider (dělič)
POUŽITÍ: Nastavení rozdělovače hodin SPI vzhledem k systémovým hodinám. Dostupné děliče jsou 2, 4, 8, 16, 32, 64 nebo 128.
Dělič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ŽITÍ: Tato funkce se volá, když podřízené zařízení přijímá data z nadřízeného.
4. SPI.transfer (val)
POUŽITÍ: Tato funkce se používá k současnému odesílání a přijímání dat mezi masterem a slave.
Začněme tedy s praktickou ukázkou protokolu SPI v Arduinu. V tomto tutoriálu použijeme dva arduino, jeden jako master a druhý jako slave. Obě Arduino jsou připevněna LED a tlačítkem zvlášť. Master LED lze ovládat pomocí tlačítka slave Arduino a LED slave Arduino lze ovládat tlačítkem master Arduino pomocí komunikačního protokolu SPI přítomného v arduino.
Komponenty potřebné pro komunikaci Arduino SPI
- Arduino UNO (2)
- LED (2)
- Tlačítko (2)
- Rezistor 10k (2)
- Rezistor 2,2k (2)
- Nepájivá deska
- Připojení vodičů
Schéma zapojení Arduino SPI
Níže uvedené schéma zapojení ukazuje, jak používat SPI na Arduino UNO, ale můžete postupovat stejným způsobem pro komunikaci Arduino Mega SPI nebo Arduino nano SPI. Téměř všechno zůstane stejné, kromě čísla PIN. Musíte zkontrolovat pinout Arduino nano nebo mega, abyste našli piny Arduino nano SPI a piny Arduino Mega, jakmile uděláte, že všechno ostatní bude stejné.
Postavil jsem výše zobrazený obvod na prkénku, níže vidíte nastavení obvodu, které jsem použil pro testování.
Jak naprogramovat Arduino pro komunikaci SPI:
Tento výukový program má dva programy, jeden pro hlavní Arduino a druhý pro podřízené Arduino. Kompletní programy pro obě strany jsou uvedeny na konci tohoto projektu.
Vysvětlení programování Arduino SPI Master
1. Nejprve musíme zahrnout knihovnu SPI pro používání komunikačních funkcí SPI.
#zahrnout
2. V neplatném nastavení ()
- Zahajujeme sériovou komunikaci s přenosovou rychlostí 115200.
Serial.begin (115200);
- Připojte LED ke kolíku 7 a stiskněte tlačítko ke kolíku 2 a nastavte tyto kolíky OUTPUT a INPUT.
pinMode (ipbutton, INPUT); pinMode (LED, VÝSTUP);
- Dále zahájíme komunikaci SPI
SPI.begin ();
- Dále nastavíme Clockdivider pro SPI komunikaci. Zde jsme nastavili dělič 8.
SPI.setClockDivider (SPI_CLOCK_DIV8);
- Poté nastavte pin SS na VYSOKÝ, protože jsme nezačali žádný přenos na slave arduino.
digitalWrite (SS, HIGH);
3. V neplatné smyčce ():
- Čteme stav tlačítka pinu připojeného k pinu 2 (Master Arduino) pro odesílání těchto hodnot do podřízeného Arduina.
buttonvalue = digitalRead (ipbutton);
- Logika nastavení pro nastavení hodnoty x (bude odeslána slave) v závislosti na vstupu z pinu 2
if (buttonvalue == HIGH) { x = 1; } else { x = 0; }
- Před odesláním hodnoty musíme LOW slave vybrat hodnotu pro zahájení přenosu na slave z masteru.
digitalWrite (SS, LOW);
- Zde přichází důležitý krok, v následujícím prohlášení pošleme hodnotu tlačítka uloženou v proměnné Mastersend na slave arduino a také přijmeme hodnotu od slave, která bude uložena v proměnné Mastereceive .
Mastereceive = SPI.transfer (Mastersend);
- Poté v závislosti na hodnotě Mastereceive zapneme nebo vypneme LED Master Arduino.
if (Mastereceive == 1) { digitalWrite (LED, HIGH); // Nastaví pin 7 HIGH Serial.println ("Hlavní LED svítí"); } else { digitalWrite (LED, LOW); // Nastaví pin 7 LOW Serial.println ("Hlavní LED nesvítí"); }
Poznámka: Pro zobrazení výsledku v Serial Motor of Arduino IDE používáme serial.println () . Na konci zkontrolujte video.
Vysvětlení programování Arduino SPI Slave
1. Nejprve musíme zahrnout knihovnu SPI pro používání komunikačních funkcí SPI.
#zahrnout
2. V neplatném nastavení ()
- Zahajujeme sériovou komunikaci s přenosovou rychlostí 115200.
Serial.begin (115200);
- Připojte LED na pin 7 a stiskněte na pin2 a nastavte tyto piny OUTPUT a INPUT.
pinMode (ipbutton, INPUT); pinMode (LED, VÝSTUP);
- Důležitým krokem jsou následující prohlášení
pinMode (MISO, VÝSTUP);
Výše uvedený příkaz nastavuje MISO jako VÝSTUP (Musíte odeslat data do Master IN). Data jsou tedy odesílána prostřednictvím MISO Slave Arduino.
- Nyní zapněte SPI v režimu Slave pomocí SPI Control Register
SPCR - = _BV (SPE);
- Poté zapněte přerušení pro komunikaci SPI. Pokud jsou data přijata z masteru, je volána Interrupt Routine a přijatá hodnota je převzata z SPDR (SPI data Register)
SPI.attachInterrupt ();
- Hodnota z masteru je převzata z SPDR a uložena do Slavereceived proměnné. K tomu dochází v následující funkci Přerušit rutinu.
ISR (SPI_STC_vect) { Slavereceived = SPDR; obdrženo = pravda; }
3. Dále ve void loop () nastavíme LED Slave arduino na ZAPNUTÍ nebo VYPNUTÍ v závislosti na hodnotě přijaté Slavem.
if (Slavereceived == 1) { digitalWrite (LEDpin, HIGH); // Nastaví pin 7 jako HIGH LED ON Serial.println ("Slave LED ON"); } else { digitalWrite (LEDpin, LOW); // Nastaví pin 7 na LOW LED OFF Serial.println ("Slave LED OFF"); }
- Dále jsme si přečetli stav tlačítka Slave Arduino a uložili jsme hodnotu do Slavesend, abychom ji poslali do Master Arduino tak, že dáme hodnotu do registru SPDR.
buttonvalue = digitalRead (buttonpin); if (buttonvalue == HIGH) {x = 1; } else {x = 0; } Slavesend = x; SPDR = Slavesend;
Poznámka: Pro zobrazení výsledku v Serial Motor of Arduino IDE používáme serial.println () . Na konci zkontrolujte video.
Jak SPI funguje na Arduinu? - Zkusme to!
Níže je obrázek konečného nastavení komunikace SPI mezi dvěma deskami Arduino.
Po stisknutí tlačítka na straně Master se rozsvítí bílá LED na straně slave.
A když je stisknuto tlačítko na straně Slave, rozsvítí se červená LED na straně Master.
Níže si můžete prohlédnout ukázku komunikace Arduino SPI. Máte-li jakékoli dotazy, nechte je v sekci komentářů, použijte naše fóra.