SPI (Serial Peripheral Interface) – это широко применяемый протокол передачи данных между микроконтроллером (Master) и периферийными устройствами (Slave). В проектах в качестве Master чаще всего используется плата Arduino SPI. Этот интерфейс был изначально разработан и использовался компанией Motorola, но со временем стал отраслевым стандартом. Одним из основных преимуществ работы с подключением SPI Arduino является высокая скорость и возможность подключения нескольких устройств на одной шине данных.
Выводы и контакты
Связь по интерфейсу SPI Arduino устройства происходит между несколькими устройствами, которые расположены близко друг к другу. Платы Arduino оснащены отдельными выводами для дисплея SPI Arduino дисплей. Сопряжение осуществляется при помощи четырех контактов:
-
MOSI – по этой линии передается информация к Slave от Master.
-
MISO – используется для передачи информации к Master от Slave.
-
SCLK – создание тактовых импульсов для синхронной передачи данных.
-
SS – выбор ведомого устройства.
Взаимодействие устройства SPI Arduino
Взаимодействие устройств начинается, когда на выход SS подается низкий уровень сигнала. Перед началом работы необходимо определить:
-
С какого бита должен начинаться сдвиг – со старшего или с младшего. Это регулируется при помощи функции SPI.setBitOrder().
-
Определить уровень, на котором должна находиться линия SCK при отсутствии тактового импульса, используя функцию SPI.setDataMode().
-
Выбрать скорость передачи данных с помощью функции SPI.setClockDivider().
Следующим шагом будет определение режима передачи данных, который определяется такими параметрами, как полярность и фаза тактового импульса. В зависимости от этих параметров можно выбрать один из четырех режимов:
-
Режим 0 – SPI_MODE0: полярность (CPOL) 0, фаза (CPHA) 0.
-
Режим 1: полярность 0, фаза 1.
-
Режим 2: полярность 1, фаза 0.
-
Режим 3: полярность 1, фаза 1.
Подключение SPI Arduino
Плата Arduino уже содержит специальные выводы для подключения интерфейса SPI Arduino. Эти выводы также дублируются в отдельном разъеме ICSP, на котором отсутствует SS. Это сделано с расчетом на то, что микроконтроллер Arduino будет выступать в роли ведущего устройства. Если необходимо использовать его в качестве ведомого, можно применить любой цифровой вывод в качестве SS.
В зависимости от модели Arduino выводы для SPI Display Arduino могут различаться:
-
Uno: MOSI – вывод 11 или ICSP-4, MISO – 12 или ICSP-1, SCK – 13 или ICSP-3, SS (slave) – 10.
-
Mega1280 или Mega2560: MOSI – 51 или ICSP-4, MISO – 50 или ICSP-1, SCK – 52 или ICSP-3, SS (slave) – 53.
-
Leonardo: MOSI – ICSP-4, MISO –ICSP-1, SCK –ICSP-3.
-
Due: MOSI – ICSP-4, MISO –ICSP-1, SCK –ICSP-3, SS (master) – 4, 10, 52.
Библиотека SPI Arduino
Для работы с SPI Arduino была создана отдельная библиотека, которая реализует все необходимые функции для работы с этим интерфейсом. В начале кода нужно добавить #include <SPI.h>, чтобы включить библиотеку.
Основные функции:
-
begin() и end() – включение и выключение работы.
-
setBitOrder(order) – установка порядка отправки битов информации.
-
setClockDivider(divider) – установка делителей тактов основной частоты.
-
setDataMode(mode) – выбор одного из четырех рабочих режимов.
-
transfer(value) – передача и прием байта данных.
Преимущества и недостатки SPI Arduino
Преимущества SPI Arduino:
-
Возможность передачи больших данных.
-
Простота программной и аппаратной реализации.
-
Меньшее количество выводов по сравнению с параллельными интерфейсами.
Недостатки:
-
Большее количество выводов по сравнению с I2C.
-
Отсутствие стандартного протокола обнаружения ошибок.
-
Отсутствие подтверждения приема информации.
Пример использования SPI Arduino с датчиком давления
Для реализации проекта с датчиком давления понадобятся Arduino SPI, датчик давления, макетная плата и провода. Пример подключения датчика показан на рисунке. При помощи датчика SCP1000 можно измерять такие параметры, как давление и температура, и передавать эти значения через дисплей SPI Arduino.
Основные элементы программы включают настройку регистров датчика и последующее считывание данных. Температура, например, считывается и преобразуется в градусы Цельсия с помощью простого кода.
int tempData = readRegister(0x21, 2);
float realTemp = (float)tempData / 20.0; // реальное значение температуры в Цельсиях
Serial.print("Temp: ");
Serial.println(realTemp);