Исходный код, видеоуроки и прочие электронные ресурсы для этой главы можно загрузить с веб-страницы https://www.exploringarduino.com/content2/ch11.
Исходный код для проектов этой главы можно также загрузить на вкладке Downloads веб-страницы издательства Wiley для этой книги: https://www.wiley.com/go/exploringarduino2e.
Мы уже познакомились с двумя основными методами цифровой передачи данных, поддерживаемыми платформой Arduino: шиной последовательного интерфейса УАПП (RS-232) и шиной I2C. В этой главе мы рассмотрим третий метод цифровой связи, поддерживаемый Arduino: шиной SPI[1].
В отличие от шины I2C, шина SPI имеет несколько линий для обмена данными, а также использует отдельную линию для выбора каждого ведомого устройства. Хотя это увеличивает число проводов, в результате также устраняется необходимость в уникальном адресе для каждого ведомого устройства. Обычно с шиной SPI легче работать, чем с шиной I2C; она также обеспечивает более высокую скорость передачи данных. В этой главе мы узнаем, как использовать встроенные аппаратные возможности SPI платы Arduino для взаимодействия с цифровым акселерометром. В частности, мы рассмотрим, как находить и устанавливать библиотеки сторонних разработчиков для облегчения сопряжения со сложным оборудованием. Для иллюстрации полезности этого подхода мы с помощью акселерометра будем управлять яркостью светодиода и выдавать звуковые сигналы, создав своего рода инструмент, реагирующий на движение звуковыми и визуальными эффектами.
Примечание
В первом издании этой книги для демонстрации принципов работы шины SPI использовалась микросхема цифрового потенциометра MCP4231, поддерживающая возможности SPI. В последнее время эти микросхемы трудно найти и, кроме того, проекты на их основе не особенно стимулируют умственные способности, по сравнению с применением акселерометра. Но если вы хотите узнать, как реализовать сопряжение цифрового потенциометра с платой Arduino, это можно сделать, просмотрев учебный фильм на эту тему по ссылке blum.fyi/spi-digipot-tutorial.
Общие сведения о шине SPI
Шина SPI была разработана компанией Motorola для реализации полнодуплексной последовательной связи между ведущим устройством и одним или несколькими ведомыми устройствами. Поскольку для протокола SPI нет формального стандарта, часто можно встретить SPI-устройства, работающие немного по-разному. Например, количество передаваемых битов может быть другим, или линия выбора ведомого устройства может не использоваться. В этой главе мы сделаем акцент на сопряжении платы Arduino с устройствами, реализующими наиболее распространенные SPI-интерфейсы. Эти устройства поддерживаются средой разработки Arduino IDE и библиотеками сторонних разработчиков, которые мы будем использовать.
Внимание!
Следует иметь в виду, что, как уже упоминалось в тексте, в различных устройствах протокол SPI может быть реализован по-разному. Поэтому чрезвычайно важно внимательно ознакомиться с характеристиками устройства, которое планируется использовать, по его справочному листку.
Шина SPI может работать в четырех основных режимах, выбор конкретного из которых зависит от требований конкретного устройства. Устройства SPI работают в синхронном режиме, т. е. передача данных синхронизируется сигналом тактирования, подаваемым на линию SCLK. Данные могут вводиться в ведомое устройство или по положительному, или по отрицательному перепаду сигнала тактирования (называющемуся фазой сигнала тактирования), а уровень по умолчанию линии сигнала тактирования SCLK (называющийся полярностью сигнала тактирования) можно установить или высоким или низким.
Таким образом, две опции для фазы сигнала тактирования и два варианта его полярности определяют четыре способа конфигурации шины SPI. В таблице 11.1 приведены все четыре возможные комбинации фазы и полярности тактового сигнала и соответствующие режимы в библиотеке SPI языка Arduino.
Таблица 11.1. Режимы связи шины SPI
Режим SPI | Полярность сигнала тактирования | Фаза сигнала тактирования |
Режим 0 | Низкий уровень при простое | Захват данных по положительному перепаду сигнала тактирования |
Режим 1 | Низкий уровень при простое | Захват данных по отрицательному перепаду сигнала тактирования |
Режим 2 | Высокий уровень при простое | Захват данных по отрицательному перепаду сигнала тактирования |
Режим 3 | Высокий уровень при простое | Захват данных по положительному перепаду сигнала тактирования |
При использовании библиотеки SPI, предназначенной для взаимодействия с конкретным устройством, правильный режим обычно устанавливается автоматически. Тем не менее, понимание этих низкоуровневых подробностей поможет вам диагностировать потенциальные проблемы передачи данных в будущем.
Подключение устройств SPI
Конфигурация системы обмена данными по шине SPI сравнительно проста. Для взаимодействия между ведущим устройством и всеми ведомыми устройствами предусмотрены три линии:
- SCLK (serial clock) — последовательный тактовый сигнал.
- MOSI (master out, slave in) — выход ведущего, вход ведомого.
- MISO (master in, slave out) — вход ведущего, выход ведомого.
Кроме этих линий, для каждого ведомого устройства требуется отдельная линия для его выбора. Эта линия называется SS (slave select — выбор ведомого). Таким образом, общее число линий и контактов ввода-вывода ведущего устройства всегда будет равно 3 + n, где n обозначает число ведомых устройств.
На рис. 11.1 показан пример системы связи по шине SPI с двумя ведомыми устройствами.
Рис. 11.1. Стандартная схема организации связи по шине SPI (Рисунок создан в программе EAGLE)
Конфигурация интерфейса SPI
Любая система связи по шине SPI содержит, как минимум, четыре линии данных. Кроме этого, для каждого подключенного к системе ведомого устройства требуется дополнительная линия SS для выбора этого устройства. Прежде чем приступать к изучению, как осуществлять обмен данными между устройствами SPI, нам нужно понимать функцию этих линий связи и как они должны подключаться. Назначение данных линий описано в таблице 11.2.
Таблица 11.2. Линии шины SPI
Линия шины SPI | Описание |
MOSI(выход ведущего, вход ведомого) | Передача последовательных данных от ведущего устройства ведомому устройству |
MISO(вход ведущего, выход ведомого) | Передача последовательных данных от ведомого устройства ведущему устройству |
SCLK(последовательный тактовый сигнал) | Сигнал, синхронизирующий последовательные данные с принимающим устройством, чтобы оно знало, когда считывать входные данные |
SS(выбор ведомого) | Линия для выбора ведомого устройства. Установка на этой линии сигнала низкого уровня означает выбор данного ведомого устройства для обмена данными с ведущим устройством. Как правило, одновременно следует активировать только одну линию выбора ведомого устройства |
В отличие от шины I2C для линий шины SPI подтягивающие резисторы не требуются, поскольку контакты ввода-вывода устройств сконфигурированы для работы в двухтактном режиме, а не в режиме открытого стока. Связь осуществляется в полнодуплексном режиме (т. е. она полностью двунаправленная). Чтобы подключить SPI-устройство к плате Arduino, нужно просто соединить соответствующие контакты MOSI, MISO, SCLK и SS обоих устройств. При этом следует иметь в виду уровни напряжения питания и логических сигналов. Если используется плата Arduino с питанием 5 В (как Arduino Uno), то подключаемое к ней ведомое SPI-устройство также должно поддерживать работу с логическими уровнями величиной 5 В.
О НАЗВАНИЯХ ЛИНИЙ
Поскольку протокол SPI официально не стандартизован, некоторые производители устройств SPI могут по-разному именовать линии связи для своих устройств. Например, линия SS (slave select — выбор ведомого) иногда называется CS (chip select — выбор микросхемы), линия SCLK (serial clock — последовательный тактовый сигнал) может называться просто CLK (clock — тактовый сигнал) или SCK (вариант SCLK), а контакты MOSI и MISO ведомых устройств иногда обозначаются как SDI (serial data in — вход последовательных данных) и SDO (serial data out —выход последовательных данных). В этой главе употребляются все разновидности наименований сигналов, согласно их применению производителями соответствующих устройств.
Протокол передачи данных SPI
Передача данных по протоколу SPI синхронизуется с помощью сигнала тактирования и управляется посредством линии SS для выбора ведомого устройства. Поскольку все устройства на шине SPI подключены к одним и тем же линиям MOSI, MISO и SCLK, посылаемые ведущим устройством сигналы видимы всем ведомым устройствам. Выбор устройства, которое должно реагировать на эти сигналы, осуществляется с помощью соответствующей линии SS. Важно отметить, что это означает необходимость следить за тем, чтобы в любой разрабатываемой программе низкий (активный) уровень одновременно подавался только на одну линию SS выбора ведомого устройства. Базовая процедура связи с устройством SPI следующая:
- Подаем сигнал низкого уровня на линию SS ведомого устройства, с которым необходимо выполнить обмен данными.
- Подаем на линию тактирования прямоугольный сигнал с частотой меньшей или равной скорости обмена в бодах, поддерживаемой ведомым устройством.
- В каждом цикле сигнала тактирования передаем один бит по линии MOSI и принимаем один бит по линии MISO.
- Продолжаем до тех пор, пока не будут переданы или приняты все данные, после чего снимаем сигнал тактирования с линии SCLK.
- Снова устанавливаем на линии SS сигнал высокого уровня.
Сравнительные характеристики протоколов SPI, I2C и UART
Многие устройства, включая акселерометры, цифровые потенциометры и дисплеи поддерживают как протокол SPI, так и протокол I2C. (В частности, акселерометр, с которым мы будем работать далее в этой главе, поддерживает оба протокола.) Это означает, среди прочего, что если вы хотите организовать взаимодействие между несколькими платами Arduino, то для этого можно разработать программу, которая будет работать с шиной SPI, I2C или RS-232 (UART). Но как решить, какой из протоколов выбрать? В таблице 11.3 приведены сравнительные характеристики этих трех протоколов, включая их преимущества и недостатки. В конечном итоге, решение будет зависеть от того, какой из них, по вашему мнению, легче всего реализовать и который лучше всего отвечает требованиям вашей задачи.
Таблица 11.3. Сравнительные характеристики протоколов SPI, I2C и UART
SPI | I2C | UART (RS-232) |
Обеспечивает наивысшую скорость передачи данных | Максимальная скорость передачи данных сильно зависит от физических свойств шины: длины линий, количества подключенных к ней устройств, значений сопротивлений повышающих резисторов и т.п. | Скорость передачи в бодах должна быть согласована между обоими участвующими в обмене устройствами до начала обмена |
В целом, с этим протоколом легче работать, чем с протоколом I2C. | Требует всего лишь две линии связи | Практически не требует никаких протокольных накладных расходов, в результате чего легко поддается реализации |
Не требует повышающих резисторов для линий связи | Поддерживает взаимодействие устройств с разными уровнями напряжения питания | Нет предопределенных ведущего и ведомого устройств. Протокол определяется разработчиком |
Количество ведомых устройств ограничено только количеством доступных контактов SS на ведущем устройстве | Количество ведомых устройств ограничено доступностью микросхем с конкретных адресом ведущего устройства | Поддержку нескольких ведомых устройств трудно реализовать |
Поддерживает аппаратное и программное обеспечение платформы Arduino | Поддерживает аппаратное и программное обеспечение платформы Arduino | Поддерживает аппаратное и программное обеспечение платформы Arduino |
- Англ. Serial Peripheral Interface — последовательный синхронный периферийный интерфейс — Пер. ↑
Рекомендации по тэгам “SPI”, “I2C”
-
4-канальный логический преобразователь уровня (I2C, SPI), двунаправленный модуль от 5 В до 3,3 В для Arduino, Raspberry Pi, Intel Edison
40₽32₽ -
Текстовый ЖК-дисплей LCD2004 с модулем IIC/I2C/TWI с синей подсветкой для Arduino UNO R3 MEGA2560 20X4 LCD2004
390₽312₽ -
Светодиодная матрица 8*8 с модулем MAX7219
140₽112₽ -
Arduino и Raspberry Pi в проектах Internet of Things. 2-е изд.
803 ₽
658 ₽ -
Считыватель и программатор RFID ключей MFRC522
150₽120₽ -
Текстовый ЖК-дисплей LCD1602 с платой I2C (с синей подсветкой)
190₽