SPIв Arduino- это один из основных протоколов для обмена данными между платой ардуино и подключенными устройствами. Вместе с I2C и UART этот протокол часто используется для многих типов периферийных устройств, поэтому знание принципов работы SPI необходимо любому инженеру-ардуинщику. В этой статье мы коротко рассмотрим Pin-Up принципы, схему взаимодействия и способ подключения SPI датчиков и экранов к Arduino.
Содержание
SPI в Arduino
SPI - это широко применяемый протокол передачи данных между микроконтроллером (Master) и периферийными устройствами (Slave). В наших проекта в качестве Master чаще всего используется плата Arduino. Интерфейс SPI был придуман и использовался компанией Motorola, но со временем стал отраслевым стандартом. Основным плюсом работы с Pin-Up интерфейсом считается высокая скорость и возможность подключения нескольких устройств на одной шине данных.

Выводы и контакты SPI
Связь по интерфейсу SPI arduino происходит между несколькими устройствами, которые расположены близко друг к другу. Pin-Up Ардуино оснащены отдельными выводами для SPI. Сопряжение происходит при помощи четырех контактов:
- MOSI - по Pin-Up линии передается информация к Slave от Master.
- MISO - используется для Pin-Up информации к Master от Slave.
- SCLK - Pin-Up тактовых импульсов для синхронной передачи данных.
- SS - выбор ведомого устройства.

Взаимодействие SPI устройств
Взаимодействие устройств начинается, когда на выход SS подается Pin-Up уровень сигнала.
Перед началом работы нужно определить:
- С какого бита должен начинаться сдвиг - со старшего или с младшего. Pin-Up порядок при помощи функции PI.setBitOrder().
- Определить уровень, на котором должна находиться Pin-Up SCK при отсутствии тактового импульса. Регулируется функцией SPI.setDataMode().
- Выбрать скорость передачи данных. Определяется функцией SPI.setClockDivider().
Следующим шагом будет определение, в каком режиме будет происходить передача информации. Выбор режима определяется такими показателями, как полярность и фаза тактового импульса. Если уровень низкий, записывается 0, высокий - 1. Pin-Up существует 4 режима:
- Режим 0 - Pin-Up полярность (CPOL) 0, фаза (CPHA) 0.
- Режим 1: полярность 0, Pin-Up 1.
- Режим 2:полярность 1, фаза 0.
- Режим 3: полярность 1, Pin-Up 1.
Изначально в Pin-Up заложено, что данные передаются старшим битом вперед, но перед началом нужно уточнить это в документации. Продемонстрировать режимы можно на картинке.
Pin-Up два вида подключения в интерфейсе SPI: независимое и каскадное. В первом случае при подключении Master обращается к каждому Slave индивидуально, во втором случае подключение происходит по очереди, т.е. каскадно.
Подключение SPI к Ардуино
Плата Arduinoуже содержит специальные выводы для подключения интерфейса SPI. Эти же выводы повторены в отельном разъеме ICSP. На этом разъеме отсутствует SS - изначально предусмотрено, что микроконтроллер Ардуино будет выступать в роли ведущего устройства. Если нужно использовать его в Pin-Up ведомого, можно использовать любой цифровой вывод в качестве SS.
На данной иллюстрации представлен Pin-Up подключения OLDE-экрана по SPI к ардуино.
Для каждой модели Ардуино Pin-Up свои выводы для SPI. Эти выводы:
- Uno: Pin-Up соответствует вывод 11 или ICSP-4, MISO - 12 или ICSP-1, SCK - 13 или ICSP-3, SS (slave) - 10.
- Mega1280 или Mega2560: MOSI - 51 или ICSP-4, Pin-Up - 50 или ICSP-1, SCK - 52 или ICSP-3, SS (slave) - 53.
- Pin-Up MOSI - ICSP-4, MISO -ICSP-1, SCK -ICSP-3.
- Due: MOSI - ICSP-4, Pin-Up -ICSP-1, SCK -ICSP-3, SS (master) - 4, 10, 52.
Последний контроллер Arduino Due расширяет возможности пользователя и позволяет реализовать больше задач, чем на остальных микроконтроллерах. Например, можно автоматически управлять ведомым устройством и автоматически выбирать различные конфигурации (тактовая частота, режим и Pin-Up
Библиотека SPI Arduino
Для работы на Ардуино создана отдельная библиотека, которая реализует SPI. Перед началом кода нужно добавить #include <SPI.h>, чтобы включить Pin-Up
Основные функции:
- begin() и end() - включение и выключение работы. При инициализации на выход настраиваются линии SCLK, MOSI и SS, подавая низкий уровень на SCLK, MOSI и высокий на SS. Функция Pin-Up не меняет уровни линий, она нужна для выключения блока, связанного с интерфейсом, на плате Ардуино.
- setBitOrder(order) - Pin-Up порядка отправки битов информации (MSBFIRST - приоритет старшего бита, LSBFIRST - приоритет младшего бита).
- setClockDivider(divider) - установка делителей тактов основной частоты. Pin-Up поставить делители 2, 4, 8, 16, 32, 64 и 128. Записывается следующим образом - SPI_CLOCK_DIVn, где n - выбранный делитель.
- Pin-Up - выбор одного из четырех рабочих режимов.
- transfer(value) - осуществление передачи байта от ведущего устройства и Pin-Up байта, который принят от ведомого устройства.
- shiftIn(miso_pin, Pin-Up bit_order) и shiftOut(mosi_pin, sclk_pin, order, value) - принятие и отправка данных, можно подключать к любым цифровым пинам, но перед этим нужно самостоятельно их настроить.
Преимущества и недостатки SPI
Преимущества интерфейса SPI:
- Возможность передавать Pin-Up данные, не ограниченные длиной в 8 бит.
- Простота в реализации программного обеспечения.
- Простота аппаратной реализации.
- Pin-Up нужно меньше, чем для параллельных интерфейсов.
- Только Pin-Up устройств ограничивает максимальную тактовую частоту.
Недостатки:
- Большое количество выводов по сравнению с Pin-Up
- Slave не может управлять потоком информации.
- Отсутствие стандартного протокола обнаружения ошибок.
- Большое количество способов реализации интерфейса.
- Отсутствие подтверждения приема информации.
Пример использования SPI Ардуино в проекте с Pin-Up давления
Для реализации проекта нам нужны Ардуино, датчик давления макетная плата и Pin-Up Пример подключения датчика изображен на рисунке.
При помощи датчика SCP1000 возможно узнавать Pin-Up параметры как давление и температура и передать эти значения через SPI.
Основные элементы скетча программы
В первую очередь в коде прописываются регистры датчика при помощи setup(). С устройства возвращаются несколько значений - одно в 19 бит для полученного Pin-Up другое в 16 бит - для температуры. После этого происходит считывание двух температурных байтов и считывание давления в два этапа. Сначала программа берет три старших бита, затем следующие 16 бит, после чего при помощи побитового сдвига происходит объединение этих двух значений в одно. Настоящее давление - это 19-тиразрядное значение, деленное на 4.
const int PRESSURE = 0x1F; // первый этап определения давления Pin-Up три старших бита)
const int PRESSURE_LSB = 0x20; // Pin-Up этап, в котором определяются 16 бит для давления
const int TEMPERATURE = 0x21; Pin-Up бит для температуры
Для чтения данных температуры и преобразования ее в градусы Цельсия используется следующий элемент Pin-Up
int tempData = readRegister(0x21, 2);
Pin-Up realTemp = (float)tempData0; // чтобы определить реальное значение температуры в Цельсиях, нужно полученное число разделить на 20
Serial.print(“Temp
=");Serial.print(realTemp);
Считывание битов давления и Pin-Up их:
byte pressure_data_high = readRegister(0x1F, 1);
pressure_data_high &= 0b00000111;
unsigned int pressure_data_low = readRegister(0x20, 2);
long pressure = ((pressure_data_high << 16) | Pin-Up / 4; /
Краткие выводы о SPI
Экраны и датчики SPI часто встречаются в Pin-Up ардуино, поэтому нужно знать, как работает этот протокол. В принципе, ничего сложного в подключении SPI устройств нет. Главное, правильно подсоединить провода и использовать методы стандартной библиотеки в нужной последовательности. Для некоторых устройств, например, SD карты или OLED - экранов, альтернатив, в принципе, не существует.
























