- Co to jest SPI?
- Działanie SPI
- Piny SPI w Arduino UNO
- Korzystanie z SPI w Arduino
- Komponenty wymagane do komunikacji Arduino SPI
- Schemat obwodu komunikacji Arduino SPI
- Jak zaprogramować Arduino do komunikacji SPI:
- Opis programowania Arduino SPI Master
- Objaśnienie programowania Arduino SPI Slave
- Jak działa SPI na Arduino? - Przetestujmy to!
Mikrokontroler wykorzystuje wiele różnych protokołów do komunikacji z różnymi czujnikami i modułami. Istnieje wiele różnych typów protokołów komunikacyjnych do komunikacji bezprzewodowej i przewodowej, a najczęściej stosowaną techniką komunikacji jest komunikacja szeregowa. Komunikacja szeregowa to proces przesyłania danych po jednym bicie, sekwencyjnie, przez kanał komunikacyjny lub magistralę. Istnieje wiele rodzajów komunikacji szeregowej, takich jak komunikacja UART, CAN, USB, I2C i SPI.
W tym samouczku dowiemy się o protokole SPI i jak go używać w Arduino. Będziemy używać protokołu SPI do komunikacji między dwoma Arduino. Tutaj jeden Arduino będzie działał jako Master, a drugi jako Slave, dwie diody LED i przyciski zostaną podłączone do obu Arduino. Aby zademonstrować komunikację SPI, będziemy sterować boczną diodą LED nadrzędną za pomocą przycisku po stronie slave i odwrotnie, używając protokołu komunikacji szeregowej SPI.
Co to jest SPI?
SPI (Serial Peripheral Interface) to protokół komunikacji szeregowej. Interfejs SPI został opracowany przez firmę Motorola w 1970 roku. SPI ma połączenie w trybie pełnego dupleksu, co oznacza, że dane są wysyłane i odbierane jednocześnie. To znaczy, że master może wysyłać dane do slave'a, a slave może wysyłać dane do mastera jednocześnie. SPI to synchroniczna komunikacja szeregowa, co oznacza, że do celów komunikacji wymagany jest zegar.
Komunikacja SPI została wcześniej wyjaśniona w innych mikrokontrolerach:
- Komunikacja SPI z mikrokontrolerem PIC PIC16F877A
- Łączący 3,5-calowy ekran dotykowy TFT LCD z Raspberry Pi
- Programowanie mikrokontrolera AVR z wyprowadzeniami SPI
- Interfejs graficzny LCD Nokia 5110 z Arduino
Działanie SPI
SPI ma komunikację master / slave za pomocą czterech linii. SPI może mieć tylko jednego mastera i wielu slaveów. Master jest zwykle mikrokontrolerem, a slave może być mikrokontrolerem, czujnikami, ADC, DAC, LCD itp.
Poniżej znajduje się schemat blokowy urządzenia głównego SPI z pojedynczym podrzędnym.
SPI ma następujące cztery linie: MISO, MOSI, SS i CLK
- MISO (Master in Slave Out) - Linia Slave do wysyłania danych do mastera.
- MOSI (Master Out Slave In) - Linia Master do wysyłania danych do urządzeń peryferyjnych.
- SCK (Serial Clock) - Impulsy zegara, które synchronizują transmisję danych generowaną przez master.
- SS (Slave Select) - Master może używać tego styku do włączania i wyłączania określonych urządzeń.
Mistrz SPI z wieloma niewolnikami
Aby rozpocząć komunikację pomiędzy Master i Slave, musimy ustawić pin Slave Select (SS) wymaganego urządzenia na LOW, aby mogło komunikować się z Master. Kiedy jest wysoki, ignoruje mistrza. Pozwala to na posiadanie wielu urządzeń SPI współdzielących te same linie MISO, MOSI i CLK jako master. Jak widać na powyższym obrazku, są cztery slave'y, w których SCLK, MISO, MOSI są wspólnie podłączone do mastera, a SS każdego slave jest podłączone oddzielnie do poszczególnych pinów SS (SS1, SS2, SS3) mastera. Ustawiając wymagany pin SS LOW, master może komunikować się z tym slave'em.
Piny SPI w Arduino UNO
Poniższy obrazek przedstawia piny SPI przedstawiające Arduino UNO (w czerwonym polu).
Linia SPI |
Pin w Arduino |
MOSI |
11 lub ICSP-4 |
MISO |
12 lub ICSP-1 |
SCK |
13 lub ICSP-3 |
SS |
10 |
Korzystanie z SPI w Arduino
Przed rozpoczęciem programowania komunikacji SPI między dwoma Arduino. Musimy poznać bibliotekę Arduino SPI używaną w Arduino IDE.
Biblioteka
1. SPI.begin ()
UŻYJ: Aby zainicjować magistralę SPI, ustawiając SCK, MOSI i SS na wyjściach, wyciągając SCK i MOSI w stan niski i wysoki SS.
2. SPI.setClockDivider (dzielnik)
UŻYJ: Aby ustawić dzielnik zegara SPI względem zegara systemowego. Dostępne przegródki to 2, 4, 8, 16, 32, 64 lub 128.
Dzielniki:
- SPI_CLOCK_DIV2
- SPI_CLOCK_DIV4
- SPI_CLOCK_DIV8
- SPI_CLOCK_DIV16
- SPI_CLOCK_DIV32
- SPI_CLOCK_DIV64
- SPI_CLOCK_DIV128
3. SPI.attachInterrupt (program obsługi)
UŻYJ: Ta funkcja jest wywoływana, gdy urządzenie slave odbiera dane od mastera.
4. SPI.transfer (val)
UŻYJ: Ta funkcja służy do jednoczesnego wysyłania i odbierania danych między urządzeniem nadrzędnym i podrzędnym.
A teraz zacznijmy od praktycznej demonstracji protokołu SPI w Arduino. W tym tutorialu użyjemy dwóch arduino jako mastera, a drugiego jako slave. Oba Arduino są dołączone osobno za pomocą diody LED i przycisku. Nadrzędną diodą LED można sterować za pomocą przycisku podrzędnego Arduino, a diodą podrzędną Arduino można sterować za pomocą przycisku nadrzędnego Arduino za pomocą protokołu komunikacyjnego SPI obecnego w arduino.
Komponenty wymagane do komunikacji Arduino SPI
- Arduino UNO (2)
- Dioda LED (2)
- Przycisk (2)
- Rezystor 10k (2)
- Rezystor 2,2k (2)
- Płytka prototypowa
- Podłączanie przewodów
Schemat obwodu komunikacji Arduino SPI
Poniższy schemat obwodu pokazuje, jak używać SPI na Arduino UNO, ale możesz wykonać tę samą procedurę dla komunikacji Arduino Mega SPI lub Arduino nano SPI. Prawie wszystko pozostanie takie samo z wyjątkiem numeru PIN. Musisz sprawdzić pinout Arduino nano lub mega, aby znaleźć piny Arduino nano SPI i piny Arduino Mega, gdy już to zrobisz, wszystko inne będzie takie samo.
Powyższy obwód zbudowałem na płytce stykowej, poniżej możesz zobaczyć konfigurację obwodu, którego użyłem do testowania.
Jak zaprogramować Arduino do komunikacji SPI:
Ten samouczek ma dwa programy, jeden dla Master Arduino, a drugi dla Slave Arduino. Kompletne programy dla obu stron są podane na końcu tego projektu.
Opis programowania Arduino SPI Master
1. Przede wszystkim musimy dołączyć bibliotekę SPI do korzystania z funkcji komunikacyjnych SPI.
#zawierać
2. In void setup ()
- Rozpoczynamy komunikację szeregową z prędkością transmisji 115200.
Serial.begin (115200);
- Podłącz diodę LED do pinu 7, a przycisk do pinu 2 i ustaw odpowiednio piny WYJŚCIE i WEJŚCIE.
pinMode (ipbutton, INPUT); pinMode (LED, WYJŚCIE);
- Następnie zaczynamy komunikację SPI
SPI.begin ();
- Następnie ustawiamy Clockdivider na komunikację SPI. Tutaj ustawiliśmy separator 8.
SPI.setClockDivider (SPI_CLOCK_DIV8);
- Następnie ustaw pin SS WYSOKO, ponieważ nie rozpoczęliśmy żadnego transferu do niewolnika arduino.
digitalWrite (SS, HIGH);
3. W pustej pętli ():
- Odczytujemy stan pinu przycisku podłączonego do pinu 2 (Master Arduino) w celu przesłania tych wartości do podrzędnego Arduino.
buttonvalue = digitalRead (ipbutton);
- Ustaw logikę dla ustawienia wartości x (do wysłania do slave) w zależności od wejścia z pinu 2
if (buttonvalue == HIGH) { x = 1; } else { x = 0; }
- Przed wysłaniem wartości musimy LOW wybrać wartość slave, aby rozpocząć transfer do slave z mastera.
digitalWrite (SS, LOW);
- Oto ważny krok, w poniższej instrukcji wysyłamy wartość przycisku przechowywaną w zmiennej Mastersend do slave arduino, a także otrzymujemy wartość od slave, która zostanie zapisana w zmiennej Mastereceive .
Mastereceive = SPI.transfer (Mastersend);
- Następnie w zależności od wartości Mastereceive włączymy lub wyłączymy diodę Master Arduino.
if (Mastereceive == 1) { digitalWrite (LED, HIGH); // Ustawia pin 7 HIGH Serial.println ("Master LED ON"); } else { digitalWrite (LED, LOW); // Ustawia pin 7 LOW Serial.println ("Master LED OFF"); }
Uwaga: Używamy serial.println (), aby wyświetlić wynik w silniku szeregowym Arduino IDE. Sprawdź wideo na końcu.
Objaśnienie programowania Arduino SPI Slave
1. Przede wszystkim musimy dołączyć bibliotekę SPI do korzystania z funkcji komunikacyjnych SPI.
#zawierać
2. In void setup ()
- Rozpoczynamy komunikację szeregową z prędkością transmisji 115200.
Serial.begin (115200);
- Podłącz diodę LED do pinu 7, a przycisk do pinu 2 i ustaw odpowiednio piny OUTPUT i INPUT.
pinMode (ipbutton, INPUT); pinMode (LED, WYJŚCIE);
- Ważnym krokiem są tutaj następujące stwierdzenia
pinMode (MISO, OUTPUT);
Powyższa instrukcja ustawia MISO jako OUTPUT (trzeba wysłać dane do Master IN). Dane są więc przesyłane przez MISO Slave Arduino.
- Teraz włącz SPI w trybie podrzędnym za pomocą rejestru sterowania SPI
SPCR - = _BV (SPE);
- Następnie włącz przerwanie dla komunikacji SPI. Jeśli dane są odbierane od mastera, wywoływana jest procedura przerwania, a odebrana wartość jest pobierana z SPDR (rejestru danych SPI)
SPI.attachInterrupt ();
- Wartość z mastera jest pobierana z SPDR i przechowywana w zmiennej Slavereceived . Odbywa się to w następstwie funkcji Interrupt Routine.
ISR (SPI_STC_vect) { Slavereceived = SPDR; otrzymano = prawda; }
3. Następnie w void loop () ustawiamy diodę Slave arduino, aby włączała się lub wyłączała w zależności od wartości Slavereceived.
if (Slavereceived == 1) { digitalWrite (LEDpin, HIGH); // Ustawia pin 7 jako HIGH LED ON Serial.println ("Slave LED ON"); } else { digitalWrite (LEDpin, LOW); // Ustawia pin 7 jako LOW LED OFF Serial.println ("Slave LED OFF"); }
- Następnie odczytujemy stan przycisku Slave Arduino Push i zapisujemy wartość w Slavesend, aby wysłać wartość do Master Arduino poprzez podanie wartości do rejestru SPDR.
buttonvalue = digitalRead (przypinka); if (buttonvalue == HIGH) {x = 1; } else {x = 0; } Slavesend = x; SPDR = Slavesend;
Uwaga: Używamy serial.println (), aby wyświetlić wynik w silniku szeregowym Arduino IDE. Sprawdź wideo na końcu.
Jak działa SPI na Arduino? - Przetestujmy to!
Poniżej znajduje się obraz końcowej konfiguracji komunikacji SPI między dwoma płytami Arduino.
Po naciśnięciu przycisku po stronie Master, biała dioda LED po stronie slave zapala się.
Po naciśnięciu przycisku po stronie Slave czerwona dioda LED po stronie Master zapala się.
Możesz obejrzeć poniższy film, aby zobaczyć demonstrację komunikacji Arduino SPI. Jeśli masz jakieś pytania, zostaw je w sekcji komentarzy, korzystając z naszych forów.