- Що таке SPI?
- Робота SPI
- Шпильки SPI в Arduino UNO
- Використання SPI в Arduino
- Компоненти, необхідні для зв’язку Arduino SPI
- Схема зв'язку Arduino SPI
- Як запрограмувати Arduino на комунікацію SPI:
- Пояснення щодо програмування Arduino SPI Master
- Пояснення щодо програмування підлеглого Arduino SPI
- Як SPI працює на Arduino? - Давайте перевіримо!
Мікроконтролер використовує безліч різних протоколів для зв'язку з різними датчиками та модулями. Існує багато різних типів комунікаційних протоколів для бездротового та дротового зв'язку, і найбільш часто використовуваною технікою зв'язку є послідовна комунікація. Послідовний зв’язок - це процес надсилання даних по одному біту, послідовно, по каналу зв’язку або по шині. Існує багато типів послідовного зв'язку, таких як UART, CAN, USB, I2C та SPI.
У цьому посібнику ми дізнаємося про протокол SPI та про те, як використовувати його в Arduino. Ми використовуватимемо протокол SPI для зв'язку між двома Arduinos. Тут один Arduino буде виконувати функції ведучого, а інший - веденого, два світлодіоди та кнопки будуть підключені до обох Arduino. Щоб продемонструвати зв'язок SPI, ми будемо керувати світлодіодом на стороні ведучого кнопкою на веденій стороні і навпаки, використовуючи протокол послідовного зв'язку SPI.
Що таке SPI?
SPI (послідовний периферійний інтерфейс) - це послідовний протокол зв'язку. Інтерфейс SPI був знайдений компанією Motorola в 1970 році. SPI має повнодуплексне з'єднання, що означає, що дані надсилаються та приймаються одночасно. Тобто ведучий може надсилати дані веденому, а підлеглий може надсилати дані ведучому одночасно. SPI - це синхронний послідовний зв'язок, що означає, що годинник необхідний для зв'язку.
SPI-зв'язок раніше пояснювався в інших мікроконтролерах:
- SPI-зв'язок з мікроконтролером PIC16F877A
- Зв'язок 3,5-дюймового сенсорного TFT-дисплея з Raspberry Pi
- Програмування мікроконтролера AVR з контактами SPI
- Взаємодія графічного РК-дисплея Nokia 5110 з Arduino
Робота SPI
SPI має зв'язок ведучий / ведений за допомогою чотирьох ліній. SPI може мати лише одного ведучого і може мати декількох ведених. Майстер, як правило, є мікроконтролером, а підлеглі можуть бути мікроконтролером, датчиками, АЦП, ЦАП, РК-дисплеєм тощо.
Нижче наведено блок-схему представлення SPI Master з одним веденим пристроєм.
SPI має наступні чотири рядки MISO, MOSI, SS та CLK
- MISO (Master in Slave Out) - ведений рядок для надсилання даних ведучому.
- MOSI (Master Out Slave In) - головна лінія для відправки даних на периферію.
- SCK (послідовний годинник) - тактові імпульси, які синхронізують передачу даних, генеровану ведучим.
- SS (Вибір підлеглого ) - Майстер може використовувати цей штифт для ввімкнення та вимкнення певних пристроїв.
SPI Master з кількома рабами
Щоб розпочати зв’язок між ведучим та веденим пристроєм, нам потрібно встановити штифт вибору підлеглого (SS) потрібного пристрою на LOW, щоб він міг спілкуватися з ведучим. Коли він високий, він ігнорує майстра. Це дозволяє мати декілька пристроїв SPI, що мають однакові лінії MISO, MOSI та CLK. Як ви можете бачити на наведеному вище зображенні, є чотири ведених пристрою, в яких SCLK, MISO, MOSI є загальними, підключеними до ведучого, а SS кожного підлеглого підключено окремо до окремих висновків SS (SS1, SS2, SS3) ведучого. Встановивши необхідний штифт SS LOW, ведучий може спілкуватися з цим веденим пристроєм.
Шпильки SPI в Arduino UNO
На зображенні нижче показані штифти SPI, які присутні Arduino UNO (у червоному полі).
Лінія SPI |
Булавка в Arduino |
МОЗІ |
11 або ICSP-4 |
MISO |
12 або ICSP-1 |
SCK |
13 або ICSP-3 |
СС |
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.transfer (val)
ВИКОРИСТАННЯ: Ця функція використовується для одночасного надсилання та отримання даних між ведучим та веденим пристроєм.
Отже, зараз почнемо з практичної демонстрації протоколу SPI в Arduino. У цьому підручнику ми будемо використовувати два arduino, один як ведучий, а інший як ведений. Обидва Arduino прикріплені світлодіодом та кнопкою окремо. Головним світлодіодом можна керувати за допомогою кнопки веденого Arduino, а веденим світлодіодом Arduino можна керувати кнопкою ведучого Arduino за допомогою протоколу зв'язку SPI, присутнього в arduino.
Компоненти, необхідні для зв’язку Arduino SPI
- Arduino UNO (2)
- Світлодіодні (2)
- Кнопка (2)
- Резистор 10k (2)
- Резистор 2.2k (2)
- Макет
- Підключення проводів
Схема зв'язку Arduino SPI
На наведеній нижче схемі схеми показано, як використовувати SPI на Arduino UNO, але ви можете дотримуватися тієї ж процедури для зв'язку Arduino Mega SPI або Arduino nano SPI. Майже все залишиться незмінним, крім номера піну. Вам потрібно перевірити розписування Arduino nano або mega, щоб знайти шпильки SPI Arduino nano та Arduino Mega, як тільки ви зробите, що все інше буде однаковим.
Я побудував вище показано схему на макетній панелі, ви можете побачити схему схеми, яку я використовував для тестування нижче.
Як запрограмувати Arduino на комунікацію SPI:
Цей підручник має дві програми - одну для майстра Arduino та іншу для раба Arduino. Повні програми для обох сторін наведені в кінці цього проекту.
Пояснення щодо програмування Arduino SPI Master
1. Перш за все нам потрібно включити бібліотеку SPI для використання функцій зв'язку SPI.
#включати
2. Налаштування void ()
- Ми починаємо послідовний зв'язок зі швидкістю передачі 115200.
Serial.begin (115200);
- Прикріпіть світлодіод до штифта 7 і кнопку до штифта 2 і встановіть ці штирі ВИХІД і ВХІД відповідно.
pinMode (ipbutton, INPUT); pinMode (світлодіод, ВИХІД);
- Далі ми починаємо спілкування SPI
SPI.begin ();
- Далі ми встановлюємо Clockdivider для зв'язку SPI. Тут ми встановили дільник 8.
SPI.setClockDivider (SPI_CLOCK_DIV8);
- Потім встановіть SS-штифт ВИСОКО, оскільки ми не розпочали жодну передачу в slave arduino.
digitalWrite (SS, HIGH);
3. У циклі void ():
- Ми зчитуємо стан кнопкового штифта, підключеного до pin2 (Master Arduino) для передачі цих значень підлеглому Arduino.
buttonvalue = digitalRead (ipbutton);
- Встановіть логіку для встановлення значення x (для надсилання на ведений) залежно від вводу з виводу 2
якщо (buttonvalue == HIGH) { x = 1; } ще { x = 0; }
- Перш ніж відправити значення, нам потрібно ЗНИЖИТИ значення вибору веденого, щоб розпочати передачу на ведений від ведучого.
digitalWrite (SS, LOW);
- Ось важливий крок: у наступному твердженні ми надсилаємо значення кнопки, що зберігається у змінній Mastersend, на підлеглий arduino, а також отримуємо значення від підлеглого, яке буде зберігатися у змінній Mastereceive .
Mastereceive = SPI.transfer (Mastersend);
- Після цього, залежно від значення Mastereceive, ми увімкнемо або вимкнемо індикатор Master Arduino.
if (Mastereceive == 1) { digitalWrite (LED, HIGH); // Встановлює штифт 7 HIGH Serial.println ("Master LED ON"); } else { digitalWrite (світлодіод, НИЗЬКИЙ); // Встановлює штифт 7 LOW Serial.println ("Master LED OFF"); }
Примітка: Ми використовуємо serial.println () для перегляду результату в Serial Motor від Arduino IDE. Перевірте відео в кінці.
Пояснення щодо програмування підлеглого Arduino SPI
1. Перш за все нам потрібно включити бібліотеку SPI для використання функцій зв'язку SPI.
#включати
2. Налаштування void ()
- Ми починаємо послідовний зв'язок зі швидкістю передачі 115200.
Serial.begin (115200);
- Прикріпіть світлодіод до контакту 7 та кнопку до контакту 2 та встановіть ці штирі ВИХІД і ВХІД відповідно.
pinMode (ipbutton, INPUT); pinMode (світлодіод, ВИХІД);
- Важливим кроком тут є наступні твердження
pinMode (MISO, OUTPUT);
Наведене вище твердження встановлює MISO як ВИХІД (потрібно надсилати дані Master IN). Тож дані надсилаються через MISO Slave Arduino.
- Тепер увімкніть SPI в режимі веденого, використовуючи реєстр керування SPI
SPCR - = _BV (SPE);
- Потім увімкніть переривання для зв'язку SPI. Якщо дані отримуються від ведучого, викликається процедура переривання, а отримане значення береться з SPDR (реєстру даних SPI)
SPI.attachInterrupt ();
- Значення з master береться з SPDR і зберігається у змінній Slavereceived . Це відбувається в наступній функції переривання.
ISR (SPI_STC_vect) { Slavereceived = SPDR; отримано = істина; }
3. Далі в циклі void () ми встановлюємо світлодіод Slave arduino на включення або вимкнення залежно від значення Slavereceived.
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.
При натисканні кнопки зі сторони ведучого білий світлодіод на веденій стороні вмикається.
І коли натискається кнопка на стороні веденого, червоний світлодіод на стороні ведучого вмикається.
Ви можете переглянути відео нижче, щоб побачити демонстрацію зв'язку Arduino SPI. Якщо у вас виникли запитання, залиште їх у розділі коментарів, використовуйте наш форум.