Данная библиотека позволяет Ардуино взаимодействовать с различными SPI-устройствами, выступая при этом в роли ведущего устройства.
- Краткое введение в интерфейс SPI (Serial Peripheral Interface)
- Соединения
- Особенности работы вывода SS в Ардуино на базе AVR
- Расширенные возможности SPI на Arduino Due
- SPI -Serial Peripheral Interface, краткое руководство
- Общие сведения:
- Подключение:
- SPI на Arduino:
- Arduino UNO/Piranha UNO/Arduino ULTRA
- Arduino MEGA
- Пример для Arduino
- SPI на Raspberry Pi
- Подробнее о SPI
- Параметры
- Скорость передачи данных
- SPI Arduino – подключение устройств к ардуино
- SPI в Arduino
- Выводы и контакты SPI
- Взаимодействие SPI устройств
- Подключение SPI к Ардуино
- Библиотека SPI Arduino
- Преимущества и недостатки SPI
- Пример использования SPI Ардуино в проекте с датчиком давления
- Основные элементы скетча программы
- 🎬 Видео
Краткое введение в интерфейс SPI (Serial Peripheral Interface)
Последовательный периферийный интерфейс (SPI) — это синхронный протокол последовательной передачи данных, используемый для связи микроконтроллера с одним или несколькими периферийными устройствами. Интерфейс SPI отличается относительно высокой скоростью и предназначен для связи близко расположенных устройств. Он также может использоваться для взаимодействия двух микроконтроллеров.
Согласно протоколу SPI, одно из взаимодействующих устройств (обычно микроконтроллер) всегда является ведущим и контролирует ведомые периферийные устройства. Как правило, все взаимодействющие устройства объединены тремя общими линиями:
- MISO (Master In Slave Out) — линия для передачи данных от ведомого устройства (Slave) к ведущему (Master),
- MOSI (Master Out Slave In) — линия для передачи данных от ведущего устройства (Master) к ведомым (Slave),
- SCK (Serial Clock) — тактовые импульсы, генерируемые ведущим устройством (Master) для синхронизации процесса передачи данных.
Помимо перечисленных, на каждое устройство отводится отдельная линия:
- SS (Slave Select) — вывод, присутствующий на каждом ведомом устройстве. Он предназначен для активизации Мастером того или иного периферийного устройства.
Периферийное устройство (Slave) взаимодействует с ведущим (Master) тогда, когда на выводе SS присутствует низкий уровень сигнала. В противном случае данные от Master-устройства будут игнорироваться. Такая архитектура позволяет взаимодействовать с несколькими SPI-устройствами, подключенными к одной и той же шине: MISO, MOSI и SCK.
Перед тем, как отправлять данные новому SPI-устройству, необходимо выяснить о нем несколько основных моментов:
- Сдвиг данных должен осуществляться, начиная со старшего бита (MSB) или с младшего бита (LSB)? Порядок следования данных контролируется функцией SPI.setBitOrder().
- При отсутствии тактовых импульсов линия SCK должна находиться в высоком или низком уровне? Считывание данных происходит по фронту или по спаду тактового импульса? Эти режимы работы контролируются функцией SPI.setDataMode().
- Какова должна быть скорость передачи данных по SPI? Этот параметр контролируется функцией SPI.setClockDivider().
Поскольку стандарт SPI является открытым, его реализация в разных устройствах может немного отличаться. Поэтому при написании программ, особое внимание необходимо уделять даташиту того или иного устройства.
Грубо говоря, существует четыре режима передачи данных, отличающиеся условием сдвига данных (по фронту или по спаду синхро-импульсов — так называемая фаза), а также уровнем сигнала, в котором должна находится линия SCK при отсутствии синхро-импульсов (полярность). Различные комбинации фазы и полярности, формирующие четыре режима передачи данных, сведены в таблицу:
Режим | Полярность (CPOL) | Фаза (CPHA) |
SPI_MODE0 | 0 | 0 |
SPI_MODE1 | 0 | 1 |
SPI_MODE2 | 1 | 0 |
SPI_MODE3 | 1 | 1 |
Для изменения режима передачи данных служит функция SPI.setDataMode().
Каждое SPI-устройство налагает определенные ограничения на максимальную скорость SPI-шины. Для корректной работы периферийных устройств в библиотеке предусмотрена функция SPI.setClockDivider(), позволяющая изменять тактовую частоту шины (по умолчанию 4 МГц).
После правильной настройки всех параметров SPI, останется только выяснить, какие регистры периферийного устройства отвечают за те или иные его функции. Как правило, это описано в даташите устройства.
Для получения дополнительной информации об интерфейсе SPI, см. страницу Википедии.
Соединения
Ниже в таблице приведены номера выводов, использующиеся шиной SPI в тех или иных моделях Ардуино:
Плата Arduino | MOSI | MISO | SCK | SS (slave) | SS (master) |
Uno или Duemilanove | 11 или ICSP-4 | 12 или ICSP-1 | 13 или ICSP-3 | 10 | — |
Mega1280 или Mega2560 | 51 или ICSP-4 | 50 или ICSP-1 | 52 или ICSP-3 | 53 | — |
Leonardo | ICSP-4 | ICSP-1 | ICSP-3 | — | — |
Due | ICSP-4 | ICSP-1 | ICSP-3 | — | 4, 10, 52 |
Обратите внимание, что на всех платах выводы MISO, MOSI и SCK соединены с одними и теми же контактами разъема ICSP. Такое расположение может быть удобно при создании универсальных плат расширения, работающих на всех моделях Ардуино.
Особенности работы вывода SS в Ардуино на базе AVR
У всех моделей Ардуино на основе микроконтроллеров AVR есть вывод SS, который используется в режиме работы Slave (например, при управлении Ардуино внешним ведущим устройством). Однако, в библиотеке реализован только режим работы Master, поэтому в этом режиме вывод SS должен быть сконфигурирован как выход. В противном случае SPI может аппаратно переключиться в режим Slave, что приведет к неработоспособности функций библиотеки.
Читайте также: Шина r17 сколько в диаметре
Для управления выводом SS периферийных устройств можно использовать любой из доступных выводов. Например, на плате расширения Arduino Ethernet для взаимодействия со встроенной SD-картой и контроллером Ethernet по SPI используются выводы 4 и 10 соответственно.
Расширенные возможности SPI на Arduino Due
Существуют некоторые особенности работы с интерфейсом SPI на платах Arduino Due. Помимо основных функций и методов, применимых ко всем платам Ардуино, в библиотеке SPI предусмотрено несколько дополнительных методов. Эти методы реализовывают аппаратные возможности микроконтроллеров SAM3X и предоставляют разработчику расширенные возможности:
- автоматический управление процессом выбора ведомого устройства;
- автоматическое управление конфигурациями интерфейса SPI для различных устройств (тактовая частота, режим передачи данных и т.д.). Благодаря этому каждое из ведомых устройств может иметь собственный набор настроек, автоматически применяемых в начале передачи.
В Arduino Due есть три отдельных вывода (4, 10 и 52) для управления линиями SS периферийных устройств.
Видео:Лекция 307. Интерфейс SPIСкачать
SPI -Serial Peripheral Interface, краткое руководство
Данная статья является кратким дискурсом по шине SPI и не должна восприниматься как точная техническая документация. Рассматривается только полнодуплексный вариант применения.
Видео:Видеоуроки по Arduino. Интерфейсы SPI (8-я серия, ч1)Скачать
Общие сведения:
SPI — (Serial Peripheral Interface) эспиай, последовательный периферийный интерфейс иногда называемый 4-х проводным интерфейсом, является последовательным синхронным интерфейсом передачи данных. Изобретён компанией Motorola в середине 1980-x. В отличие от I2C и UART, SPI требует больше сигналов для работы, но может работать на более высоких скоростях. Не поддерживает адресацию, вместо этого используется сигнал SS (slave select — выбор ведомого), который также иногда называется CS (chip select), CE (chip enable) или SE (slave enable). Поддерживает только одного ведущего на шине. Ведущий устанавливает скорость обмена данными и другие параметры, такие как полярность и фаза тактирования. Обмен данными происходит в режиме полного дуплекса, что означает устройства на шине могут одновременно передавать и принимать данные. Интерфейс использует следующие сигналы (в номенклатуре AVR, для получения точного названия сигналов обратитесь к технической документации микросхемы, с которой работаете):
- MISO (master in slave out) — вход ведущего, выход ведомого
- MOSI (master out slave in) — выход ведущего, вход ведомого
- SCK (serial clock) — сигнал тактирования
- SS (slave select) — сигнал выбор ведомого.
Несмотря на то, что интерфейс называется 4-х проводным, для подключения нескольких ведомых понадобится по одному проводу SS для каждого ведомого (в полнодуплексной реализации). Сигналы MISO, MOSI и SCK являются общими для всех устройств на шине. Ведущий посылает сигнал SS для того ведомого, обмен данными с которым будет осуществляться. Простыми словами, все ведомые, кроме выбранного ведущим будут игнорировать данные на шине. SS является инверсным (active-low), что означает что ведущему необходимо прижать эту линию для выбора ведомого.
Видео:Передача данных - шина SPIСкачать
Подключение:
Видео:AVR 38# Последовательный интерфейс SPIСкачать
SPI на Arduino:
Arduino UNO/Piranha UNO/Arduino ULTRA
На Arduino UNO/Piranha UNO/Arduino ULTRA выводы аппаратного SPI расположены на 10, 11, 12 и 13 выводах, а так же эти выводы соединены с колодкой ICSP (in circuit serial programmer):
Сигнал | Вывод |
---|---|
SS | 10 |
MOSI | 11 |
MISO | 12 |
SCK | 13 |
Arduino MEGA
На Arduino MEGA выводы аппаратного SPI расположены на 50, 51, 52 и 53 выводах, а так же эти выводы соединены с колодкой ICSP (in circuit serial programmer):
Сигнал | Вывод |
---|---|
SS | 53 |
MOSI | 51 |
MISO | 50 |
SCK | 52 |
Пример для Arduino
В этих примерах мы соединим две Arduino по SPI по следующей схеме:
В одну плату необходимо загрузить скетч ведущего, а в другую скетч ведомого. Для проверки работы необходимо открыть проследовательный монитор той платы, в которую загружен скетч ведомого.
Arduino UNO в качестве ведущего:
Arduino UNO в качестве ведомого:
После соединения двух Arduino по SPI и загрузки соответствующих скетчей, мы будем получать следующее сообщение в мониторе последовательного порта ведомого микроконтроллера раз в секунду:
Видео:arduino spiСкачать
SPI на Raspberry Pi
На Raspberry Pi выводы аппаратного SPI расположены на выводах GPIO7, GPIO8, GPIO9, GPIO10, GPIO11:
Перед работой с SPI необходимо его включить. Сделать это можно из эмулятора терминала командой sudo raspi-config -> Interfacing options -> Serial -> No -> Yes -> OK -> Finish или из графической среды в главном меню -> Параметры -> Raspberry Pi Configuration -> Interfaces -> SPI
Подробное описание как это сделать можно посмотреть по ссылке Raspberry Pi, включаем I2C, SPI
Пример работы с SPI на Python:
В отличие от Arduino для Raspberry не существует простых решений для работы в режиме ведомого. Подробней ознакомиться с работой чипа BCM Raspberry можно в технической документации на официальном сайте, стр. 160.
Для проверки работы сценария можно подключить Raspberry по SPI к Arduino со скетчем из примера выше через преобразователь уровней или Trema+Expander Hat:
Видео:О шине SPI и библитоеке SPI. Arduino.Скачать
Подробнее о SPI
Параметры
Существуют четыре режима работы SPI, зависящие от полярности (CPOL) и фазы (CPHA) тактирования:
Режим | Полярность | Фаза | Фронт тактирования | Фронт установки бита данных |
---|---|---|---|---|
SPI_MODE0 | 0 | 0 | Спадающий | Нарастающий |
SPI_MODE1 | 0 | 1 | Нарастающий | Спадающий |
SPI_MODE2 | 1 | 0 | Нарастающий | Спадающий |
SPI_MODE3 | 1 | 1 | Спадающий | Нарастающий |
В Arduino IDE для установки режима необходимо передать функции, возвращающей объект настроек параметр режима работы SPI_MODE, например:
Для выбора режима работы SPI на Raspberry Pi необходимо вызвать дескриптор объекта SpiDev().mode и присвоить ему битовые значения CPOL и CPHA, например:
Скорость передачи данных
Скорость передачи данных устанавливается ведущим и может меняться «на лету». Программист в силах указать лишь максимальную скорость передачи данных.
Видео:Теория и практика UART, I2C (TWI), SPI на arduino.Скачать
SPI Arduino – подключение устройств к ардуино
SPI в Arduino- это один из основных протоколов для обмена данными между платой ардуино и подключенными устройствами. Вместе с I2C и UART этот протокол часто используется для многих типов периферийных устройств, поэтому знание принципов работы SPI необходимо любому инженеру-ардуинщику. В этой статье мы коротко рассмотрим основные принципы, схему взаимодействия и способ подключения SPI датчиков и экранов к Arduino.
Видео:MCP2515, контроллер CAN шины с интерфейсом SPIСкачать
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 индивидуально, во втором случае подключение происходит по очереди, т.е. каскадно.
Видео:Видеоуроки по Arduino. Интерфейсы SPI (8-я серия, ч2)Скачать
Подключение 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 расширяет возможности пользователя и позволяет реализовать больше задач, чем на остальных микроконтроллерах. Например, можно автоматически управлять ведомым устройством и автоматически выбирать различные конфигурации (тактовая частота, режим и другие).
Видео:Arduino Интерфейсы SPI 8Скачать
Библиотека 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) – принятие и отправка данных, можно подключать к любым цифровым пинам, но перед этим нужно самостоятельно их настроить.
Видео:🔀 Сдвиговый регистр 74HC595: ПОДКЛЮЧАЕМ ПО SPI К АРДУИНОСкачать
Преимущества и недостатки SPI
Преимущества интерфейса SPI:
- Возможность передавать большие данные, не ограниченные длиной в 8 бит.
- Простота в реализации программного обеспечения.
- Простота аппаратной реализации.
- Выводов нужно меньше, чем для параллельных интерфейсов.
- Только быстродействие устройств ограничивает максимальную тактовую частоту.
- Большое количество выводов по сравнению с I2C.
- Slave не может управлять потоком информации.
- Отсутствие стандартного протокола обнаружения ошибок.
- Большое количество способов реализации интерфейса.
- Отсутствие подтверждения приема информации.
Видео:Видеоуроки по Arduino 8 1 Интерфейсы SPI 8 я серия, ч1Скачать
Пример использования 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 — экранов, альтернатив, в принципе, не существует.
- Свежие записи
- Нужно ли менять пружины при замене амортизаторов
- Скрипят амортизаторы на машине что делать
- Из чего состоит стойка амортизатора передняя
- Чем стянуть пружину амортизатора без стяжек
- Для чего нужны амортизаторы в автомобиле
- Правообладателям
- Политика конфиденциальности
🎬 Видео
💡 Arduino - Экраны #2 - Электронная бумага и SPI шина - EP7Скачать
Интерфейсы :: SPI :: Часть 1:: Общие сведенияСкачать
Лекция 308. Шина I2CСкачать
Интерфейс SPI на примере STM32. Подключение периферии - экрана и памяти.Скачать
Подключить несколько устройств к Ардуино по шине SPIСкачать
Подключение сенсорного цветного 240x320 SPI ILI9341 дисплея 2.8 (2.4, 2.2) к ArduinoСкачать
Введение в шину I2CСкачать
Arduino+Arduino - SPI реализация общения между 2 ардуинами по SPIСкачать