- SPI Arduino – подключение устройств к ардуино
- SPI в Arduino
- Выводы и контакты SPI
- Взаимодействие SPI устройств
- Подключение SPI к Ардуино
- Библиотека SPI Arduino
- Преимущества и недостатки SPI
- Пример использования SPI Ардуино в проекте с датчиком давления
- Основные элементы скетча программы
- Интерфейс SPI и Arduino
- Инструкция по работе Arduino с интерфейсом SPI
- 1 Описание последовательного интерфейса SPI
- 2 Реализация интерфейса SPI на платах семейства Arduino
- 3 Стандартная библиотека для работы по интерфейсу SPI
- 4 Подключение сдвигового регистра к Arduino
- 5 Скетч для управления сдвиговым регистром по интерфейсу SPI
- 6 «Бегущая волна» из светодиодов
- Поделиться
- Похожие материалы (по тегу)
- Последнее от .aave.
- Другие материалы в этой категории:
- 8 комментарии
SPI Arduino – подключение устройств к ардуино
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 , чтобы включить библиотеку.
- 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
Считывание битов давления и объединение их:
byte pressure_data_high = readRegister(0x1F, 1);
unsigned int pressure_data_low = readRegister(0x20, 2);
long pressure = ((pressure_data_high Краткие выводы о SPI
Экраны и датчики SPI часто встречаются в проектах ардуино, поэтому нужно знать, как работает этот протокол. В принципе, ничего сложного в подключении SPI устройств нет. Главное, правильно подсоединить провода и использовать методы стандартной библиотеки в нужной последовательности. Для некоторых устройств, например, SD карты или OLED — экранов, альтернатив, в принципе, не существует.
Источник
Интерфейс SPI и Arduino
Изучаем интерфейс SPI и подключаем к Arduino сдвиговый регистр, к которому мы будем обращаться по этому протоколу для управления светодиодами.
Инструкция по работе Arduino с интерфейсом SPI
- Arduino UNO или иная совместимая плата;
- сдвиговый регистр 74HC595;
- 8 светодиодов (к примеру, вот из такого набора);
- 8 резисторов по 220 Ом (рекомендую приобрести набор резисторов с номиналами от 10 Ом до 1 МОм);
- соединительные провода (например, вот такой хороший набор);
- макетная плата;
- персональный компьютер со средой разработки Arduino IDE.
1 Описание последовательного интерфейса SPI
SPI – Serial Peripheral Interface или «Последовательный периферийный интерфейс» – это синхронный протокол передачи данных для сопряжения ведущего устройства (Master) с периферийными устройствами (Slave). Ведущим устройством часто является микроконтроллер. Связь между устройствами осуществляется по четырём проводам, поэтому SPI иногда называют «четырёхпроводной интерфейс». Вот эти шины:
Название | Назначение шины SPI |
---|---|
MOSI (Master Out Slave In) | линия передачи данных от ведущего к ведомым устройствам; |
MISO (Master In Slave Out) | линия передачи от ведомого к ведущему устройству; |
SCLK (Serial Clock) | тактовые импульсы синхронизации, генерируемые ведущим устройством; |
SS (Slave Select) | линия выбора ведомого устройства; когда на линии логический «0», ведомое устройство «понимает», что сейчас обращаются к нему. |
Существует четыре режима передачи данных (SPI_MODE0, SPI_MODE1, SPI_MODE2, SPI_MODE3), обусловленные сочетанием полярности тактовых импульсов (работаем по уровню HIGH или LOW), Clock Polarity, CPOL, и фазой тактовых импульсов (синхронизация по переднему или заднему фронту тактового импульса), Clock Phase, CPHA. В последнем столбце таблицы приведены поясняющие иллюстрации. На них Sample обозначены моменты, когда данные на линии должны быть готовы и считываются устройствами. Буквой Z отмечено, что состояние данных на линии неизвестно или не важно.
Режим | Полярность тактовых импульсов (CPOL) | Фаза тактовых импульсов (CPHA) | Диаграмма режима |
---|---|---|---|
SPI_MODE0 | 0 | 0 | |
SPI_MODE1 | 0 | 1 | |
SPI_MODE2 | 1 | 0 | |
SPI_MODE3 | 1 | 1 |
Четыре режима работы интерфейса SPI —>
Виды подключения устройств для работы по интерфейсу SPI: независимое и каскадное
2 Реализация интерфейса SPI на платах семейства Arduino
На рисунке приведено стандартное соответствие выводов шинам SPI для Arduino UNO и Nano.
Реализация интерфейса SPI на платах Arduino UNO и Arduino Nano
3 Стандартная библиотека для работы по интерфейсу SPI
Временная диаграмма работы интерфейса SPI
Работа с протоколом завершается командой SPI.endTransaction().
Желательно минимизировать время выполнения передачи между инструкциями SPI.beginTransaction() и SPI.endTransaction(), чтобы не возникло накладок, если другое устройство попробует инициализировать передачу данных, используя другие настройки.
Если вы планируете в своём скетче использовать стандартные пины Arduino, можно не описывать их в начале программы, т.к. они уже определены в самой библиотеке и имеют следующие имена:
Данные пины определены в файле pins_arduino.h , который находится по пути %programfiles%\arduino-(версия)\hardware\arduino\avr\variants\ (если вы устанавливали программу в стандартное расположение). То есть, например, чтобы опустить пин выбора ведомого в состояние «0», можно написать:
4 Подключение сдвигового регистра к Arduino
Схема подключения сдвигового регистра 74HC595 к Arduino
5 Скетч для управления сдвиговым регистром по интерфейсу SPI
Напишем скетч, реализующий «бегущую волну», последовательно зажигая светодиоды, подключённые к выходам сдвигового регистра.
Чтобы зажечь определённый светодиод с помощью сдвигового регистра, нужно подать на его вход 8-разрядное число. Например, чтобы загорелся первый светодиод – подаём двоичное число 00000001, чтобы второй – 00000010, чтобы третий – 00000100, и т.д. Эти двоичные числа при переводе в десятичную систему счисления образуют такую последовательность: 1, 2, 4, 8, 16, 32, 64, 128 и являются степенями двойки от 0 до 7.
Соответственно, в цикле loop() по количеству светодиодов делаем пересчёт от 0 до 7. Функция pow(основание, степень) возводит 2 в степень счётчика цикла. Микроконтроллеры не очень точно работают с числами типа «double», поэтому для преобразования результата в целое число используем функцию округления round(). И передаём получившееся число в сдвиговый регистр. Для наглядности в монитор последовательного порта выводятся значения, которые получаются при этой операции: единичка «бежит» по разрядам – светодиоды загораются волной.
Числа, посылаемые в сдвиговый регистр 74HC595
6 «Бегущая волна» из светодиодов
Поделиться
Похожие материалы (по тегу)
Последнее от .aave.
Другие материалы в этой категории:
8 комментарии
Даешь статью про каскадное подключение. Мне прямо очень надо! Спасибо!)))
Алекс, обязательно. Просто сейчас совсем нет времени это.
По поводу розовых и голубых вертикальных линий: очевидно, что розовый цвет отражает передний фронт тактового импульса, а голубой — задний фронт. Не очевидно то, что они вводят читателя в заблуждение. Блуд в том, что в данном применении они извращают понимание фазы. Считывание (latch) текущего бита всегда происходит по фронту импульса: при фазе 0 — по переднему, а при фазе 1 — по заднему. В каждом цикле обработки текущего бита моменту отсечки (latch) ВСЕГДА ПРЕДШЕСТВУЕТ (на половину тактового сигнала) момент выдачи бита (shift). Передний фронт тактового сигнала (в SPI) не его начало, а его середина. Комплект цветных линий на рисунке разумен для режима передачи (mode) SPI 1 и 3. Для режима 0 и 2 весь этот комплект линий должен быть смещён на пол такта влево.
Хочу обратить внимание читателей на то, что для прояснения принципа функционирования SPI, автором данной странички представлен рисунок белиберды под названием «Временная диаграмма работы интерфейса SPI».
Что там не так:
1. передаются 8 бит — значит и импульсов SCLK должно быть 8, а на рисунке их 9 с гаком;
2. моментов представления текущих битов (на рисунке «скрещивание» MOSI) должно быть 8, а их 9;
3. принципиально — SPI СИНХРОННАЯ передача, поскольку начало передачи на рисунке соответствует mode0, то отсечка (latch) каждого передаваемого бита должна происходить по переднему фронту импульса (середина текущего такта), а представление текущего бита (shift) — в момент начала текущего такта SCLK.
На рисунке синхронность процесса передачи отсутствует.
Михаил, большое спасибо за замечания! Заменил иллюстрацию, на которой изображена временная диаграмма SPI.
Если на клетке слона прочтёшь надпись «буйвол», не верь глазам своим. Применительно к SPI, в клетке находится SS, а надпись на клетке — «Slave Select». На самом деле, SS — синхронизация сеанса обмена данными. Синхронизация сеанса об мена данными — это единственная и неотъемлемая роль SS в протоколе интерфейса SPI. Физически SS представляет собой импульс. Передний фронт этого импульса — старт, начало общения Управляющего и Управляемого, а задний фронт — конец общения, начало осмысления. Следует отметить, что импульс SS особенно важен для Управляющего т.к. по переднему фронту импульса SS Управляющий начинает генерировать тактовые сигналы SCLK, каждый из которых синхронизирует обмен одного бита данных.
Предвидя то, что среди читающих мои строки найдутся непримиримые, укориенелые сторонники «Slave Select», потряхивающие картинкой «Один мастер и три слэйва», хочу их успокоить: — ) В нашей стране извращения не запрещен. Более того, а не пора ли перейти к картинке «Три мастера один слэйв»? Прошу детей к этому не привлекать.
Поменял «шило на мыло». И в предыдущий рисунок демонстрировал отсутствие синхронизации, и текущий рисунок нагло демонстрирует отсутствие синхронизации. Нарочито моменты смены значения текущего передаваемого бита (shift) не синхронизированы.
Источник