- SPI -Serial Peripheral Interface, краткое руководство
- Общие сведения:
- Подключение:
- SPI на Arduino:
- Arduino UNO/Piranha UNO/Arduino ULTRA
- Arduino MEGA
- Пример для Arduino
- SPI на Raspberry Pi
- Подробнее о SPI
- Параметры
- Скорость передачи данных
- Подключаемое железо, интерфейсы
- Распиновка Nano
- Простые цифровые датчики
- Интерфейсы
- Другие
- Аналоговый сигнал
- Резюмируя
- 🎥 Видео
Видео:Передача данных - шина 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), что означает что ведущему необходимо прижать эту линию для выбора ведомого.
Видео:MCP2515, контроллер CAN шины с интерфейсом SPIСкачать
Подключение:
Видео:Лекция 307. Интерфейс 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 и загрузки соответствующих скетчей, мы будем получать следующее сообщение в мониторе последовательного порта ведомого микроконтроллера раз в секунду:
Видео:О шине SPI и библитоеке SPI. Arduino.Скачать
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:
Видео:Теория и практика UART, I2C (TWI), 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, например:
Скорость передачи данных
Скорость передачи данных устанавливается ведущим и может меняться «на лету». Программист в силах указать лишь максимальную скорость передачи данных.
Видео:arduino spiСкачать
Подключаемое железо, интерфейсы
Суть и вообще предназначение Ардуино состоит в быстрой и удобной разработке электронных устройств. Это универсальный контроллер, на базе которого можно сделать законченный девайс (от англ. Device – устройство, прибор) абсолютно произвольного назначения, от полезного (часы-будильник, реле времени с кучей настроек и дисплеем, автоматизацию теплицы, умный дом…) до бесполезного, но забавного или интересного (самонаводящийся вентилятор, машинка на радиоуправлении с пушкой, робот с большим количеством функций и так далее). Для достижения этих целей к Ардуино подключаются различные внешние устройства, с которыми она может взаимодействовать.
Начнем с мира цифрового, в котором устройства общаются друг с другом при помощи цифровых сигналов, так называемых логических, то есть имеющих два простейших состояния: правда и ложь, да и нет, 1 и 0. В большинстве цифровых устройств эти два состояния передаются напряжением 0 и 5 Вольт, но бывает и 0 и 3.3 Вольта. Таким образом микроконтроллер по сути может измерить цифровой сигнал (что подаётся на ногу, 0 или 5 Вольт), или выдать со своей ноги 0 и 5 Вольт соответственно. Закодированный цифровой сигнал выглядит примерно вот так: скачки 0 и 5 (или 3.3) Вольт с разной продолжительностью.
Совокупность правил и длин участков 5 и 0 Вольт называют интерфейсом связи.
Видео:🔀 Сдвиговый регистр 74HC595: ПОДКЛЮЧАЕМ ПО SPI К АРДУИНОСкачать
Распиновка Nano
- GPIO – базовый порт ввода-вывода. Может читать и выдавать цифровой сигнал (только 0 и 5 Вольт).
- PWM – может аппаратно генерировать ШИМ сигнал.
- ANALOG – пин АЦП, аналогово-цифрового преобразователя. Может измерять напряжение.
- UART – выводы аппаратного UART для подключения модулей с таким же интерфейсом.
- I2C– выводы аппаратной шины I2C для подключения модулей с таким же интерфейсом.
- SPI – выводы аппаратной шины SPI для подключения модулей с таким же интерфейсом.
Видео:Подключить несколько устройств к Ардуино по шине SPIСкачать
Простые цифровые датчики
К простым цифровым можно отнести любые датчики, имеющие пин с логическим выходом, то есть напряжение на этом пине может быть только 0 или 5 Вольт в зависимости от показания датчика. Это например ИК датчик движения, кнопка, датчик линии, энкодер, а также практически все остальные датчики с пинами питания и выходом, помеченным как DO, OUT или S.
Такие модули подключаются в любые GPIO пины.
Видео:AVR 38# Последовательный интерфейс SPIСкачать
Интерфейсы
Некоторые датчики имеют цифровой выход, но выдают не просто 0 и 5V, а передают данные по цифровому интерфейсу связи. Сигнальные пины таких датчиков могут быть подписаны как SCK, SDA, SCL, MISO, MOSI, SS и прочими аббревиатурами. Для работы с такими датчиками нужно обязательно смотреть примеры или документацию. По сути любой такой датчик можно подключить на любой GPIO пин и программно эмулировать нужный интерфейс связи, что сложно и будет отбирать лишнее процессорное время. Arduino Nano поддерживает несколько интерфейсов аппаратно, то есть позволяет работать с ними очень быстро и эффективно.
UART – пины D0 (RX) и D1 (TX). По нему чаще всего подключаются Bluetooth, GPS и GSM модули. В общем случае поддерживает подключение только одного модуля. Пины на модуле называются обычно RX и TX. Подключение к модулю осуществляется “наоборот” – RX->TX и TX->RX, так как RX принимает сигналы (Receiver), а TX – передаёт (Transmitter). Для подключения нескольких UART модулей или одновременной работы модуля и “монитора порта” используют программный UART при помощи встроенной библиотеки SoftwareSerial.
I2C – пины A4 (SDA) и A5 (SCL). Данный интерфейс является шиной, то есть к нему можно подключить параллельно сразу несколько (до 128) устройств с уникальными адресами.
Варианты маркировки и подключение к аппаратному I2C:
- A4SCL (C, SCK) – линия синхронизации, Serial CLock
SPI – пины D11 (MOSI), D12 (MISO) и D13 (SCLK), иногда добавляется D10 (SS). Данный интерфейс также является шиной, причём высокоскоростной, и поддерживает подключение по сути неограниченного количества модулей: у модуля есть пин CS (Chip Select), который прижимается микроконтроллером к GND для выбора данного модуля в качестве устройства приёма и передачи данных в текущий момент. SPI – очень распространённый и простой интерфейс, очень часто датчики и модули подключают к любым GPIO пинам и используют программную отправку и приём данных через встроенные функции shiftIn() и shiftOut(). “Сложные” датчики и датчики с большим объёмом и высокой скоростью передаваемых данных (карта памяти, NFC модуль) нужно подключать к аппаратной шине SPI микроконтроллера.
Варианты маркировки и подключение к аппаратному SPI:
- D11MISO (SDO, DO, DON, SO) – линия данных от модуля к Ардуино
- D13SCLK (SCK, CLK, SPC) – линия синхронизации
- D10CS (SS, RCK) – выбор текущего модуля прижатием этого пина к GND
Другие
Помимо этих трёх популярных интерфейсов существуют и другие (CAN, 1-wire и прочее), но так как у нас есть сила микроконтроллера, мы можем эмулировать практически любой протокол и интерфейс связи, так называемый software (softwareSerial, softwareI2C…). И тут на помощь приходит комьюнити ардуино, которое уже написало библиотеки для всего что можно, и можно без проблем общаться практически с любой железкой, поддерживающей какой-либо популярный протокол связи. По той же CAN шине можно подключиться к мозгам своего автомобиля и делать с ним всякое. Куча микросхем различного назначения без особых проблем и телодвижений подключаются к ардуино и позволяют собой управлять. Всяческие усилители, драйверы, сдвиговые регистры, ЦАПы, АЦПы, мультиплексоры, цифровые резисторы и сотни других интересных штук.
Видео:ЛУЧШИЙ ЭКРАН ДЛЯ АРДУИНО ARDUINO TFT LCD 1.44 SPI 128Х128 ЗА $3!Скачать
Аналоговый сигнал
Второй тип связи – аналоговый, работает только “на приём”. Микроконтроллер может измерять напряжение, которое подаётся ему на АЦП (аналогово-цифровой преобразователь), диапазон измерения ограничен вплоть до опорного напряжения или напряжения питания микроконтроллера, то есть максимум, что может измерить микроконтроллер без дополнительного железа – от 0 до 5 вольт, или от 0 до 3.3 вольт для 3.3 вольтовых моделей. К этому мы ещё вернёмся.
Благодаря наличию АЦП (чтение аналогового сигнала) ардуино может считывать показания любых аналоговых датчиков: термисторы, термопары, фоторезисторы, потенциометры, напряжение шунта и прочее прочее из мира аналоговой электроники. По сути можно подключить всё что угодно без особых навыков, было бы желание и готовая библиотека. Ну и умение читать.
К аналоговым относятся модули и датчики, сигнал с которых выходит в виде напряжения от 0 до 5 Вольт, но меняется “плавно” в зависимости от показания с датчика. Это например микрофон, термистор, фоторезистор, датчик влажности, потенциометр и прочее. Многие аналоговые датчики имеют пины, подписанные так же, как цифровые. Как отличить цифровой датчик от аналогового? Либо по описанию, либо методом “тыка” – подключить в аналоговый пин и вывести сигнал. Некоторые модули имеют цифровой и аналоговый выход одновременно (датчики звука, линии, холла и некоторые другие), пины у них обычно подписаны как DO – цифровой выход и AO – аналоговый. Также аналоговый выход может быть маркирован как OUT или S.
Такие модули подключаются в любые ANALOG пины.
Видео:Видеоуроки по Arduino. Интерфейсы SPI (8-я серия, ч2)Скачать
Резюмируя
Теперь по сути дела: датчики, их куча кучная, измерять можно ну просто всё, что вообще измеряется. Электроника: напряжение, ток, сопротивление, работа с переменным током, поля. Параметры микроклимата: температура, влажность, давление, содержание газов, скорость ветра, освещенность, что угодно. Интересных модулей тоже очень много: Bluetooth, сотовая связь, GPS, дисплеи различных типов и размеров, датчики присутствия, как ИК, так и микроволновые, модули для беспроводной связи ардуинок и многое другое.
Можно управлять абсолютно любой железкой, которая выполняет свою функцию просто при подаче питания: лампочка, светодиодная лента, электронагреватель, мотор или любой электропривод, электромагнит, соленоид-толкатель, и это все с любым напряжением питания. Но тут нужно кое что понять: Ардуино (точнее микроконтроллер) – логическое устройство, то есть по-хорошему она должна только отдавать команды другим устройствам, или принимать их от них. Это я к тому, что напрямую от ардуино не работают ни лампочки, ни моторчики, ни нагреватели, ни- ху че-го. Максимум – светодиод. С пониманием этого идём дальше. Чтобы ардуино включила или выключила (подала питание) на другое устройство, нужно устройство – посредник, например реле или транзистор. Ардуино управляет реле, а реле в свою очередь включает любую нужную нагрузку с любым напряжением питания и все такое, подробнее об этом поговорим отдельно.
Как суть всего выше написанного – возможности Ардуино по подключению и управлению различными железками практически безграничны, можно воплотить любую идею, даже самую безумную. Датчики что то измеряют, исполнительные устройства что то контролируют, в это же время ведётся отсылка данных куда-нибудь, что-то отображается на дисплее и контролируется при помощи кнопок. Романтика!
У меня в каталоге ссылок на Ардуино-компоненты можно найти практически все существующие датчики, модули и прочие железки для Ардуино, и практически у каждого есть ссылка на статью с примером и библиотекой. Пользуйтесь!
🎥 Видео
Arduino+Arduino - SPI реализация общения между 2 ардуинами по SPIСкачать
STM32.ARDUINO.SPI I2C PROTOCOLSСкачать
💡 Arduino - Экраны #2 - Электронная бумага и SPI шина - EP7Скачать
ЛУЧШИЙ ЭКРАН ДЛЯ АРДУИНО ARDUINO TFT LCD 1.8 SPI 128Х160Скачать
Arduino Интерфейсы SPI 8Скачать
SegM8 — семисегментный светодиодный индикатор для Arduino с SPI на борту. Железки АмперкиСкачать
LCD дисплей LCM1602A-14, I2C и SPIСкачать
Введение в шину I2CСкачать