- Какво е SPI?
- Работа на SPI
- SPI щифтове в Arduino UNO
- Използване на SPI в Arduino
- Компоненти, необходими за Arduino SPI комуникация
- Схема за комуникация на Arduino SPI
- Как да програмирате Arduino за SPI комуникация:
- Arduino SPI Master Programming Обяснение
- Arduino SPI Slave Програмиране Обяснение
- Как SPI работи на Arduino? - Да го тестваме!
Микроконтролерът използва много различни протоколи за комуникация с различни сензори и модули. Има много различни видове комуникационни протоколи за безжична и жична комуникация, а най-често използваната комуникационна техника е серийната комуникация. Последователната комуникация е процес на изпращане на данни по един бит последователно, по комуникационен канал или шина. Има много видове серийна комуникация като UART, CAN, USB, I2C и SPI комуникация.
В този урок научаваме за протокола SPI и как да го използваме в Arduino. Ще използваме протокол SPI за комуникация между два Arduinos. Тук един Arduino ще действа като Master, а друг ще действа като Slave, два светодиода и бутони ще бъдат свързани към двата Arduino. За да демонстрираме SPI комуникация, ние ще контролираме светодиода на главната страна чрез бутона с бутон на подчинената страна и обратно, използвайки протокола SPI Serial комуникация.
Какво е SPI?
SPI (Serial Peripheral Interface) е сериен комуникационен протокол. SPI интерфейсът е намерен от Motorola през 1970 г. SPI има пълен дуплекс връзка, което означава, че данните се изпращат и получават едновременно. Тоест главен може да изпраща данни на роб, а роб може да изпраща данни на главен едновременно. SPI е синхронна серийна комуникация означава, че часовникът е необходим за комуникационни цели.
SPI комуникацията е обяснена по-рано в други микроконтролери:
- SPI комуникация с PIC микроконтролер PIC16F877A
- Взаимодействие на 3,5-инчов TFT LCD сензорен екран с Raspberry Pi
- Програмиране на AVR микроконтролер с SPI щифтове
- Взаимодействие на графичен LCD Nokia 5110 с Arduino
Работа на SPI
SPI има главна / подчинена комуникация чрез използване на четири линии. SPI може да има само един главен и може да има множество подчинени. Главният обикновено е микроконтролер, а подчинените могат да бъдат микроконтролер, сензори, ADC, DAC, LCD и т.н.
По-долу е представено блок схемата на SPI Master с Single Slave.
SPI има следните четири реда MISO, MOSI, SS и CLK
- MISO (Master in Slave Out) - Подчинената линия за изпращане на данни до главния.
- MOSI (Master Out Slave In) - Главната линия за изпращане на данни към периферните устройства.
- SCK (сериен часовник) - Импулсите на часовника, които синхронизират предаването на данни, генерирани от главното устройство.
- SS (Избор на подчинени устройства) - Master може да използва този щифт, за да активира и деактивира определени устройства.
SPI Master с множество подчинени
За да започнем комуникация между главен и подчинен, трябва да настроим щифта на подчиненото устройство (SS) на необходимото устройство на НИСКО, за да може то да комуникира с главното. Когато е висока, тя игнорира капитана. Това ви позволява да имате множество SPI устройства, които споделят едни и същи MISO, MOSI и CLK главни линии. Както можете да видите на горното изображение, има четири подчинени устройства, при които SCLK, MISO, MOSI са общи, свързани към главен, а SS на всеки подчинен е свързан отделно към отделни SS пинове (SS1, SS2, SS3) на master. Чрез задаване на необходимия SS щифт LOW майсторът може да комуникира с този slave.
SPI щифтове в Arduino UNO
Изображението по-долу показва SPI щифтовете, които присъстват Arduino UNO (в червено поле).
SPI линия |
ПИН в Arduino |
МОСИ |
11 или ICSP-4 |
MISO |
12 или ICSP-1 |
SCK |
13 или ICSP-3 |
SS |
10 |
Използване на SPI в Arduino
Преди да започнете програмиране за SPI комуникация между два Arduinos. Трябва да научим за библиотеката Arduino SPI, използвана в Arduino IDE.
Библиотеката
1. SPI.begin ()
ИЗПОЛЗВАНЕ: За да инициализирате SPI шината, като настроите SCK, MOSI и SS към изходи, издърпвайки SCK и MOSI ниско и SS високо.
2. SPI.setClockDivider (разделител)
УПОТРЕБА: За да зададете делителя на часовника SPI спрямо системния часовник. Наличните разделители са 2, 4, 8, 16, 32, 64 или 128.
Разделители:
- SPI_CLOCK_DIV2
- SPI_CLOCK_DIV4
- SPI_CLOCK_DIV8
- SPI_CLOCK_DIV16
- SPI_CLOCK_DIV32
- SPI_CLOCK_DIV64
- SPI_CLOCK_DIV128
3. SPI.attachInterrupt (манипулатор)
УПОТРЕБА: Тази функция се извиква, когато подчиненото устройство получава данни от главното устройство.
4. SPI.трансфер (вал)
УПОТРЕБА: Тази функция се използва за едновременно изпращане и получаване на данни между главен и подчинен.
Така че сега нека започнем с практическа демонстрация на протокол SPI в Arduino. В този урок ще използваме два arduino, единият като главен, а другият като роб. И двата Arduino са прикрепени с LED и бутон отделно. Главният светодиод може да се управлява с помощта на бутон на подчинен Arduino, а подчиненият LED на Arduino може да се управлява от бутона на главния Arduino, използвайки протокола за комуникация SPI, присъстващ в arduino.
Компоненти, необходими за Arduino SPI комуникация
- Arduino UNO (2)
- LED (2)
- Бутон (2)
- Резистор 10k (2)
- Резистор 2.2k (2)
- Макет
- Свързване на проводници
Схема за комуникация на Arduino SPI
Долната схема на схемата показва как да използвате SPI на Arduino UNO, но можете да следвате същата процедура за Arduino Mega SPI комуникация или Arduino nano SPI комуникация. Почти всичко ще остане същото, с изключение на номера на пина. Трябва да проверите щифта на Arduino nano или mega, за да намерите Arduino nano SPI щифтовете и Arduino Mega щифтовете, след като сте направили, че всичко останало ще бъде същото.
Изградих горепосочената схема върху макет, можете да видите настройката на веригата, която използвах за тестване по-долу.
Как да програмирате Arduino за SPI комуникация:
Този урок има две програми - една за главен Arduino и друга за slave Arduino. Пълни програми за двете страни са дадени в края на този проект.
Arduino SPI Master Programming Обяснение
1. На първо място трябва да включим библиотеката SPI за използване на комуникационни функции SPI.
#include
2. При настройка за невалидност ()
- Започваме серийна комуникация със скорост на предаване 115200.
Serial.begin (115200);
- Прикрепете светодиода към щифт 7 и бутон към щифт 2 и задайте тези щифтове съответно ИЗХОД и ВХОД.
pinMode (ipbutton, INPUT); pinMode (LED, OUTPUT);
- След това започваме комуникацията SPI
SPI.begin ();
- След това задаваме Clockdivider за SPI комуникация. Тук сме задали разделител 8.
SPI.setClockDivider (SPI_CLOCK_DIV8);
- След това задайте SS пина HIGH, тъй като не стартирахме прехвърляне към slave arduino.
digitalWrite (SS, HIGH);
3. In void loop ():
- Четем състоянието на щифта на бутон, свързан към pin2 (Master Arduino) за изпращане на тези стойности към slave Arduino.
buttonvalue = digitalRead (ipbutton);
- Задайте логика за задаване на стойност x (да се изпрати на подчинен) в зависимост от въведеното от щифт 2
ако (buttonvalue == HIGH) { x = 1; } иначе { x = 0; }
- Преди да изпратим стойността, трябва да НИСИМ избраната стойност на подчиненото устройство, за да започнем прехвърлянето към подчинен от главния.
digitalWrite (SS, LOW);
- Тук идва важната стъпка, в следващото изявление изпращаме стойността на бутон, съхранена в променливата Mastersend, на подчиненото arduino и също така получаваме стойност от подчинената, която ще се съхранява в променливата Mastereceive
Mastereceive = SPI.transfer (Mastersend);
- След това, в зависимост от стойността на Mastereceive , ще включим или изключим LED Master Arduino.
if (Mastereceive == 1) { digitalWrite (LED, HIGH); // Задава щифт 7 HIGH Serial.println ("Master LED ON"); } else { digitalWrite (LED, LOW); // Задава щифт 7 LOW Serial.println ("Master LED OFF"); }
Забележка: Използваме serial.println (), за да видим резултата в Serial Motor на Arduino IDE. Проверете видеото в края.
Arduino SPI Slave Програмиране Обяснение
1. На първо място трябва да включим библиотеката SPI за използване на комуникационни функции SPI.
#include
2. При настройка за невалидност ()
- Започваме серийна комуникация със скорост на предаване 115200.
Serial.begin (115200);
- Прикрепете светодиода към щифт 7 и бутон към щифт2 и задайте тези щифтове съответно ИЗХОД и ВХОД.
pinMode (ipbutton, INPUT); pinMode (LED, OUTPUT);
- Важната стъпка тук са следните твърдения
pinMode (MISO, OUTPUT);
Горното изявление задава MISO като ИЗХОД (Трябва да изпращате данни на Master IN). Така че данните се изпращат чрез MISO на Slave Arduino.
- Сега включете SPI в режим Slave, като използвате SPI Control Register
SPCR - = _BV (SPE);
- След това включете прекъсването за SPI комуникация. Ако данните се получат от главен, се извиква рутинната програма за прекъсване и получената стойност се взема от SPDR (SPI регистър на данни)
SPI.attachInterrupt ();
- Стойността от master се взема от SPDR и се съхранява в Slavereceived променлива. Това се случва в следната функция за прекъсване.
ISR (SPI_STC_vect) { Slavereceived = SPDR; получено = вярно; }
3. Следващ цикъл void (), ние задаваме Slave arduino LED да се включва или изключва в зависимост от получената стойност.
if (Slavereceived == 1) { digitalWrite (LEDpin, HIGH); // Задава щифт 7 като HIGH LED ON Serial.println ("Slave LED ON"); } else { digitalWrite (LEDpin, LOW); // Задава щифт 7 като LOW LED OFF Serial.println ("Slave LED OFF"); }
- След това четем състоянието на бутон Slave Arduino и съхраняваме стойността в Slavesend, за да изпратим стойността на Master Arduino, като придадем стойност на SPDR регистър.
buttonvalue = digitalRead (бутон); ако (buttonvalue == HIGH) {x = 1; } иначе {x = 0; } Slavesend = x; SPDR = Slavesend;
Забележка: Използваме serial.println (), за да видим резултата в Serial Motor на Arduino IDE. Проверете видеото в края.
Как SPI работи на Arduino? - Да го тестваме!
По-долу е картинката на окончателната настройка за SPI комуникация между две платки Arduino.
При натискане на бутона от главната страна, белият светодиод от подчинената страна се включва.
И когато бутонът от страна на Slave е натиснат, червеният светодиод от страна на Master се включва.
Можете да разгледате видеоклипа по-долу, за да видите демонстрацията на комуникация Arduino SPI. Ако имате въпроси, оставете ги в раздела за коментари, използвайте нашия форум.