Опубликовано

Шина SPI и библиотеки сторонних разработчиков

По материалам книги Т.Иго «Изучаем Arduino: инструменты и методы технического волшебства. 2-е изд.: пер. с англ.»  (Глава 11. Шина SPI и библиотеки сторонних разработчиков)

Изучаем Arduino: инструменты и методы технического волшебства. 2-е изд.

Исходный код, видеоуроки и прочие электронные ресурсы для этой главы можно загрузить с веб-страницы 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 с двумя ведомыми устройствами.

image1

Рис. 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 следующая:

  1. Подаем сигнал низкого уровня на линию SS ведомого устройства, с которым необходимо выполнить обмен данными.
  2. Подаем на линию тактирования прямоугольный сигнал с частотой меньшей или равной скорости обмена в бодах, поддерживаемой ведомым устройством.
  3. В каждом цикле сигнала тактирования передаем один бит по линии MOSI и принимаем один бит по линии MISO.
  4. Продолжаем до тех пор, пока не будут переданы или приняты все данные, после чего снимаем сигнал тактирования с линии SCLK.
  5. Снова устанавливаем на линии 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
  1. Англ. Serial Peripheral Interface — последовательный синхронный периферийный интерфейс — Пер.
Добавить комментарий