Arduino SPI (Serial Peripheral Interface) переводится как «последовательный периферийный интерфейс» и является протоколом последовательной связи. Платы Ардуино используют несколько протоколов для связи с датчиками и периферийными устройствами, одним из наиболее часто используемых является шина SPI. В статье рассмотрим этот интерфейс, как подключить к микроконтроллеру несколько устройств по протоколу SPI.
СОДЕРЖАНИЕ
Необходимые компоненты:
- Arduino Uno / Arduino Nano / Arduino Mega
- тактовые кнопки
- резисторы
- макетная плата
- коннекторы
- скачать библиотеку SPI.h
Дополнительные материалы на эту тему:
Последовательный периферийный интерфейс Arduino SPI (Serial Peripheral Interface) является полностью дуплексным — данные передаются и принимаются по проводам одновременно. Ведущее устройство посылает данные ведомому, а ведомое может одновременно посылать данные ведущему (обычно микроконтроллеру Ардуино). Последовательный интерфейс был разработан компанией Motorola в 1970 году.
Протокол SPI Arduino Nano: описание, пример

- MISO (Master in Slave Out) — линия для отправки данных ведущему устройству;
- MOSI (Master Out Slave In) — линия для отправки данных на ведомое устройство;
- CLK (Serial Clock) — линия синхронизации, генерируемая ведущим устройством;
- SS (Slave Select) — линия для включения/выключения ведомых устройств.
Для работы по протоколу spi Ардуино использует 4 линии (обозначены на плате, как MISO, MOSI, SCLK и SS). В этом интерфейсе всегда есть одно ведущее устройство (обычно это плата Ардуино) и несколько ведомых устройств (это датчики, модули, OLED дисплеи или другие микроконтроллеры). На изображении выше показано, как работает протокол Arduino Uno SPI с одним или несколькими устройствами, подключенных к Ардуино.
Реализация интерфейса SPI Arduino Mega и Uno

| выводы | Arduino Uno spi | Arduino Nano spi | Arduino Mega spi |
| MISO | 12 | 12 | 50 |
| MOSI | 11 | 11 | 51 |
| SCK | 13 | 13 | 52 |
| SC | 10 | 10 | 53 |
Чтобы инициировать обмен данными, порт ведомого устройства (SS) должен быть установлен в низкий уровень, если порт установлен в высокий уровень, то ведомое устройство будет игнорировать ведущего. На предыдущем изображении показана схема подключения трех устройств по протоколу spi, где линии SCLK, MISO, MOSI являются общими, а линии SS у устройств подключены к отдельным выводам (SS1, SS2, SS3).
Как подключить две платы Ардуино по шине SPI

Схема подключения двух плат для и создания соединения между ними по SPI показана на рисунке. Проект требует загрузки двух программ: первая — для ведущей Arduino Uno, вторая — для ведомой Arduino Uno. Когда вы нажимаете кнопку на ведущей плате, загорается светодиод, подключенный к ведомой плате. При нажатии кнопки на ведомом микроконтроллере Ардуино Уно загорается светодиод на ведущей плате.
Скетч для ведущей платы Arduino Nano SPI (master)
#include "SPI.h"
#define LED 13
#define ipbutton 2
int buttonvalue;
int x;
void setup () {
pinMode(ipbutton, INPUT);
pinMode(LED, OUTPUT);
SPI.begin();
SPI.setClockDivider(SPI_CLOCK_DIV8);
digitalWrite(SS, HIGH);
}
void loop() {
byte Mastersend, Mastereceive;
buttonvalue = digitalRead(ipbutton);
if(buttonvalue == HIGH) { x = 1; }
else { x = 0; }
digitalWrite(SS, LOW);
Mastersend = x;
Mastereceive = SPI.transfer(Mastersend);
if(Mastereceive == 1) { digitalWrite(LED, HIGH); }
else { digitalWrite(LED, LOW); }
delay(100);
}
Скетч для ведомой платы Arduino Nano SPI (slave)
#include "SPI.h"
#define LEDpin 13
#define buttonpin 2
volatile boolean received;
volatile byte Slavereceived,Slavesend;
int buttonvalue;
int x;
void setup() {
pinMode(buttonpin, INPUT);
pinMode(LEDpin, OUTPUT);
pinMode(MISO, OUTPUT);
SPCR |= _BV(SPE);
received = false;
SPI.attachInterrupt();
}
ISR (SPI_STC_vect) {
Slavereceived = SPDR;
received = true;
}
void loop() {
if(received) {
if (Slavereceived==1) { digitalWrite(LEDpin, HIGH); }
else { digitalWrite(LEDpin, LOW); }
buttonvalue = digitalRead(buttonpin);
if (buttonvalue == HIGH) { x=1; }
else { x=0; }
Slavesend=x;
SPDR = Slavesend;
delay(100);
}
}
Библиотека SPI.h Arduino команды, описание

#include «SPI.h» — подключение библиотеки в программе.
SPI.begin() — инициализирует шину SPI, устанавливая режимы SCK, MOSI и SS для вывода данных, подавая на выводы SCK и MOSI низкое напряжение, а на вывод SS — высокое напряжение.
SPI.setClockDivider(divider) — устанавливает коэффициент деления тактового сигнала SPI относительно тактовой частоты микроконтроллера Arduino. Вы можете использовать делители 2, 4, 8, 16, 32, 64 или 128.
SPI.attachInterrupt(handler) — включает режим прерывания в ведомом устройстве. Прерывание возникает всякий раз, когда ведомое устройство получает данные от ведущего устройства.
SPI.transfer(val) — эта функция используется для одновременного приема и передачи данных между ведущим и ведомым устройствами.
Заключение. Связь на SPI Arduino является одним из основных коммуникационных интерфейсов между Arduino и устройствами. Протоколы SPI, IIC и UART очень часто используются при программировании микроконтроллеров, и знание принципов работы SPI будет полезно каждому. В этой статье мы кратко рассмотрели библиотеку SPI.h, основные принципы связи и подключения нескольких устройств через интерфейс SPI.
