SPI Arduino подключение устройств к ардуино
Содержание
- SPI в Arduino
- Подключение SPI к Ардуино
- Библиотека SPI Arduino
- Преимущества и недостатки SPI
- Пример использования SPI Ардуино в проекте с датчиком давления
SPI в Arduino- это один из основных протоколов для обмена данными между платой ардуино и подключенными устройствами. Вместе с I2C и UART этот протокол часто используется для многих типов периферийных устройств, поэтому знание принципов работы SPI необходимо любому инженеру-ардуинщику. В этой статье мы коротко рассмотрим основные принципы, схему взаимодействия и способ подключения SPI датчиков и экранов к Arduino.
SPI в Arduino
SPI – это широко применяемый протокол передачи данных между микроконтроллером (Master) и периферийными устройствами (Slave). В наших проекта в качестве Master чаще всего используется плата Arduino. Интерфейс SPI был придуман и использовался компанией Motorola, но со временем стал отраслевым стандартом. Основным плюсом работы с этим интерфейсом считается высокая скорость и возможность подключения нескольких устройств на одной шине данных.
Выводы и контакты SPI
Связь по интерфейсу SPI arduino происходит между несколькими устройствами, которые расположены близко друг к другу. Платы Ардуино оснащены отдельными выводами для SPI. Сопряжение происходит при помощи четырех контактов:
- MOSI – по этой линии передается информация к Slave от Master.
- MISO – используется для передачи информации к Master от Slave.
- SCLK – создание тактовых импульсов для синхронной передачи данных.
- SS – выбор ведомого устройства.
Взаимодействие SPI устройств
Взаимодействие устройств начинается, когда на выход SS подается низкий уровень сигнала.
Перед началом работы нужно определить:
- С какого бита должен начинаться сдвиг – со старшего или с младшего. Регулируется порядок при помощи функции PI.setBitOrder().
- Определить уровень, на котором должна находиться линия SCK при отсутствии тактового импульса. Регулируется функцией SPI.setDataMode().
- Выбрать скорость передачи данных. Определяется функцией SPI.setClockDivider().
Следующим шагом будет определение, в каком режиме будет происходить передача информации. Выбор режима определяется такими показателями, как полярность и фаза тактового импульса. Если уровень низкий, записывается 0, высокий – 1. Всего существует 4 режима:
- Режим 0 SPI_MODE0: полярность (CPOL) 0, фаза (CPHA) 0.
- Режим 1: полярность 0, фаза 1.
- Режим 2:полярность 1, фаза 0.
- Режим 3: полярность 1, фаза 1.
Изначально в Ардуино заложено, что данные передаются старшим битом вперед, но перед началом нужно уточнить это в документации. Продемонстрировать режимы можно на картинке.
Возможно два вида подключения в интерфейсе SPI: независимое и каскадное. В первом случае при подключении Master обращается к каждому Slave индивидуально, во втором случае подключение происходит по очереди, т.е. каскадно.
Подключение SPI к Ардуино
Плата Arduino уже содержит специальные выводы для подключения интерфейса SPI. Эти же выводы повторены в отельном разъеме ICSP. На этом разъеме отсутствует SS – изначально предусмотрено, что микроконтроллер Ардуино будет выступать в роли ведущего устройства. Если нужно использовать его в качестве ведомого, можно использовать любой цифровой вывод в качестве SS.
На данной иллюстрации представлен вариант подключения OLDE-экрана по SPI к ардуино.
Для каждой модели Ардуино существую свои выводы для SPI. Эти выводы:
- 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.
Последний контроллер Arduino Due расширяет возможности пользователя и позволяет реализовать больше задач, чем на остальных микроконтроллерах. Например, можно автоматически управлять ведомым устройством и автоматически выбирать различные конфигурации (тактовая частота, режим и другие).
Библиотека SPI Arduino
Для работы на Ардуино создана отдельная библиотека, которая реализует SPI. Перед началом кода нужно добавить #include SPI.h, чтобы включить библиотеку.
- begin() и end() – включение и выключение работы. При инициализации на выход настраиваются линии SCLK, MOSI и SS, подавая низкий уровень на SCLK, MOSI и высокий на SS. Функция end() не меняет уровни линий, она нужна для выключения блока, связанного с интерфейсом, на плате Ардуино.
- setBitOrder(order) – установка порядка отправки битов информации (MSBFIRST – приоритет старшего бита, LSBFIRST – приоритет младшего бита).
- setClockDivider(divider) – установка делителей тактов основной частоты. Можно поставить делители 2, 4, 8, 16, 32, 64 и 128. Записывается следующим образом SPI_CLOCK_DIVn, где n – выбранный делитель.
- setDataMode(mode) – выбор одного из четырех рабочих режимов.
- transfer(value) – осуществление передачи байта от ведущего устройства и возвращение байта, который принят от ведомого устройства.
- shiftIn(miso_pin, sclk_pin, bit_order) и shiftOut(mosi_pin, sclk_pin, order, value) – принятие и отправка данных, можно подключать к любым цифровым пинам, но перед этим нужно самостоятельно их настроить.
Преимущества и недостатки SPI
Преимущества интерфейса SPI:
- Возможность передавать большие данные, не ограниченные длиной в 8 бит.
- Простота в реализации программного обеспечения.
- Простота аппаратной реализации.
- Выводов нужно меньше, чем для параллельных интерфейсов.
- Только быстродействие устройств ограничивает максимальную тактовую частоту.
- Большое количество выводов по сравнению с I2C.
- Slave не может управлять потоком информации.
- Отсутствие стандартного протокола обнаружения ошибок.
- Большое количество способов реализации интерфейса.
- Отсутствие подтверждения приема информации.
Пример использования SPI Ардуино в проекте с датчиком давления
Для реализации проекта нам нужны Ардуино, датчик давления макетная плата и провода. Пример подключения датчика изображен на рисунке.
При помощи датчика SCP1000 возможно узнавать такие параметры как давление и температура и передать эти значения через SPI.
Основные элементы скетча программы
В первую очередь в коде прописываются регистры датчика при помощи setup(). С устройства возвращаются несколько значений – одно в 19 бит для полученного давления, другое в 16 бит – для температуры. После этого происходит считывание двух температурных байтов и считывание давления в два этапа. Сначала программа берет три старших бита, затем следующие 16 бит, после чего при помощи побитового сдвига происходит объединение этих двух значений в одно. Настоящее давление – это 19-тиразрядное значение, деленное на 4.
const int PRESSURE = 0x1F; // первый этап определения давления (выявляются три старших бита)
const int PRESSURE_LSB = 0x20; // второй этап, в котором определяются 16 бит для давления
const int TEMPERATURE = 0x21; //16 бит для температуры
Для чтения данных температуры и преобразования ее в градусы Цельсия используется следующий элемент кода:
int tempData = readRegister(0x21, 2);
float realTemp = (float)tempData / 20.0; // чтобы определить реальное значение температуры в Цельсиях, нужно полученное число разделить на 20
__SPI-3">Краткие выводы о SPI
Экраны и датчики SPI часто встречаются в проектах ардуино, поэтому нужно знать, как работает этот протокол. В принципе, ничего сложного в подключении SPI устройств нет. Главное, правильно подсоединить провода и использовать методы стандартной библиотеки в нужной последовательности. Для некоторых устройств, например, SD карты или OLED — экранов, альтернатив, в принципе, не существует.
Источник: