- Что такое 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 будет действовать как Master, а другой - как Slave, два светодиода и кнопки будут подключены к обоим Arduino. Чтобы продемонстрировать связь SPI, мы будем управлять светодиодом ведущей стороны с помощью кнопки на ведомой стороне и наоборот, используя протокол связи SPI Serial.
Что такое SPI?
SPI (Serial Peripheral Interface) - это протокол последовательной связи. Интерфейс SPI был обнаружен Motorola в 1970 году. SPI имеет полнодуплексное соединение, что означает, что данные отправляются и принимаются одновременно. То есть мастер может отправлять данные подчиненному, а подчиненный может одновременно отправлять данные мастеру. SPI - это синхронная последовательная связь, что означает, что часы необходимы для связи.
Связь SPI ранее объяснялась в других микроконтроллерах:
- Связь SPI с PIC микроконтроллером 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) - линия Slave для отправки данных мастеру.
- MOSI (Master Out Slave In) - главная линия для отправки данных на периферийные устройства.
- SCK (Serial Clock) - тактовые импульсы, которые синхронизируют передачу данных, генерируемую мастером.
- SS (выбор ведомого ) - мастер может использовать этот вывод для включения и отключения определенных устройств.
Мастер SPI с несколькими подчиненными
Чтобы начать связь между ведущим и ведомым, нам необходимо установить вывод выбора ведомого устройства (SS) в положение LOW, чтобы оно могло взаимодействовать с ведущим. Когда он высокий, он игнорирует мастера. Это позволяет иметь несколько устройств SPI, совместно использующих одни и те же линии MISO, MOSI и CLK ведущего устройства. Как вы можете видеть на изображении выше, есть четыре ведомых устройства, в которых SCLK, MISO, MOSI обычно подключены к ведущему, а SS каждого ведомого устройства подключается отдельно к отдельным контактам SS (SS1, SS2, SS3) ведущего. Установив требуемый вывод SS LOW, ведущий может связываться с этим ведомым.
Контакты SPI в Arduino UNO
На изображении ниже показаны контакты SPI, присутствующие в Arduino UNO (в красном поле).
Линия SPI |
Пин в Arduino |
MOSI |
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)
- Резистор 10к (2)
- Резистор 2.2к (2)
- Макетная плата
- Подключение проводов
Принципиальная схема связи Arduino SPI
На приведенной ниже принципиальной схеме показано, как использовать SPI на Arduino UNO, но вы можете выполнить ту же процедуру для связи Arduino Mega SPI или связи Arduino nano SPI. Практически все останется прежним, кроме пин-кода. Вы должны проверить распиновку Arduino nano или mega, чтобы найти контакты Arduino nano SPI и контакты Arduino Mega, как только вы это сделаете, все остальное будет таким же.
Я построил показанную выше схему на макете, вы можете увидеть схему, которую я использовал для тестирования ниже.
Как запрограммировать Arduino для связи SPI:
В этом руководстве есть две программы: одна для ведущего Arduino, а другая - для ведомого Arduino. Полные программы для обеих сторон приведены в конце этого проекта.
Объяснение программирования Arduino SPI Master
1. Прежде всего, нам нужно включить библиотеку SPI для использования коммуникационных функций SPI.
#включают
2. В void setup ()
- Мы запускаем последовательную связь со скоростью 115200 бод.
Serial.begin (115200);
- Подключите светодиод к контакту 7, а кнопку - к контакту 2 и установите эти контакты ВЫХОД и ВХОД соответственно.
pinMode (ipbutton, ВВОД); pinMode (светодиод, ВЫХОД);
- Далее мы начинаем коммуникацию SPI
SPI.begin ();
- Затем мы устанавливаем Clockdivider для связи SPI. Здесь мы установили делитель 8.
SPI.setClockDivider (SPI_CLOCK_DIV8);
- Затем установите контакт SS на ВЫСОКИЙ, поскольку мы не начали передачу на подчиненный Arduino.
digitalWrite (SS, HIGH);
3. В void loop ():
- Мы читаем состояние контакта кнопки, подключенного к контакту 2 (Master Arduino), для отправки этого значения на подчиненный Arduino.
buttonvalue = digitalRead (ipbutton);
- Установите логику для установки значения x (для отправки на ведомое устройство) в зависимости от входа с контакта 2
если (buttonvalue == HIGH) { x = 1; } else { x = 0; }
- Перед отправкой значения нам нужно НИЗКОЕ значение выбора ведомого, чтобы начать передачу ведомого от ведущего.
digitalWrite (SS, LOW);
- Вот важный шаг: в следующем утверждении мы отправляем значение кнопки, сохраненное в переменной Mastersend, на подчиненный Arduino, а также получаем значение от подчиненного устройства, которое будет сохранено в переменной Mastereceive .
Mastereceive = SPI.transfer (Mastersend);
- После этого, в зависимости от значения Mastereceive, мы включим или выключим светодиод Master Arduino.
если (Mastereceive == 1) { digitalWrite (LED, HIGH); // Устанавливает вывод 7 HIGH Serial.println ("Главный светодиод включен"); } else { digitalWrite (светодиод, НИЗКИЙ); // Устанавливает вывод 7 LOW Serial.println ("Главный светодиод ВЫКЛ"); }
Примечание. Мы используем serial.println () для просмотра результата в последовательном двигателе Arduino IDE. Проверьте видео в конце.
Объяснение программирования подчиненного устройства Arduino SPI
1. Прежде всего, нам нужно включить библиотеку SPI для использования коммуникационных функций SPI.
#включают
2. В void setup ()
- Мы запускаем последовательную связь со скоростью 115200 бод.
Serial.begin (115200);
- Подключите светодиод к контакту 7 и нажмите кнопку к контакту 2 и установите эти контакты ВЫХОД и ВХОД соответственно.
pinMode (ipbutton, ВВОД); pinMode (светодиод, ВЫХОД);
- Важным шагом здесь являются следующие утверждения
pinMode (MISO, ВЫХОД);
Вышеупомянутый оператор устанавливает MISO как OUTPUT (необходимо отправлять данные в Master IN). Таким образом, данные отправляются через MISO ведомого Arduino.
- Теперь включите SPI в ведомом режиме с помощью регистра управления SPI.
SPCR - = _BV (SPE);
- Затем включите прерывание для связи SPI. Если данные получены от мастера, вызывается процедура прерывания, и полученное значение берется из SPDR (регистр данных SPI).
SPI.attachInterrupt ();
- Значение от мастера берется из SPDR и сохраняется в переменной Slavereceived . Это происходит в следующей функции процедуры прерывания.
ISR (SPI_STC_vect) { Slavereceived = SPDR; получено = правда; }
3. Затем в void loop () мы устанавливаем светодиод Slave arduino на включение или выключение в зависимости от полученного значения Slave.
если (Slavereceived == 1) { digitalWrite (LEDpin, HIGH); // Устанавливает вывод 7 как ВЫСОКИЙ светодиод 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; } else {x = 0; } Slavesend = x; SPDR = Slavesend;
Примечание. Мы используем serial.println () для просмотра результата в последовательном двигателе Arduino IDE. Проверьте видео в конце.
Как SPI работает на Arduino? - Давай проверим!
Ниже приведено изображение окончательной настройки связи SPI между двумя платами Arduino.
При нажатии кнопки на стороне ведущего включается белый светодиод на стороне ведомого.
И когда нажимается кнопка на стороне Slave, загорается красный светодиод на стороне Master.
Вы можете посмотреть видео ниже, чтобы увидеть демонстрацию связи Arduino SPI. Если у вас есть какие-либо вопросы, оставьте их в разделе комментариев на нашем форуме.