Изучаем Arduino: инструметы и методы технического волшебства - [47]
ВНИМАНИЕ!
Так как техническая реализация протокола SPI может быть разной, необходимо изучать техническое описание, прилагаемое к каждому устройству.
В зависимости от требований конкретного устройства существуют четыре основных способа реализации протокола SPI. SPI-устройства выступают при обмене в качестве подчиненных синхронных устройств, данные синхронизируются с тактовым сигналом (SCLK). Подчиненное устройство может воспринимать данные либо по положительному, либо по отрицательному фронту тактового сигнала (так называемая фаза синхронизации), а активное состояние SCLK по умолчанию может быть высоким или низким уровнем (так называемая полярность синхронизации).
В итоге получается, что обмен SPI в общей сложности можно настроить четырьмя способами (табл. 9.1).
Таблица 9.1. Режимы SP/ в Arduino IDE
No | Режим SPI | Полярность синхронизации | Фаза синхронизации |
1 | Mode O | LOW | По фронту синхросигнала |
2 | Mode 1 | LOW | По спаду синхросигнала |
- 188 -
Таблица 9.1 (окончание)
No | Режим SPI | Полярность синхронизации | Фаза синхронизации |
3 | Mode 2 | HIGH | По спаду синхросигнала |
4 | Mode 3 | HIGH | По фронту синхросигнала |
9.2. Подключение устройств SPI
Систему обмена данными через SPI несложно настроить. Для связи между мастером и всеми подчиненными устройствами используется три вывода:
• последовательный сигнал синхронизации (SCLK);
• выход ведущего, вход ведомого (MOSI);
• вход ведущего, выход ведомого (MISO).
У каждого ведомого устройства также есть контакт выбора данного устройства (контакт SS). Следовательно, общее число портов ввода-вывода, необходимых на мастер-устройстве, всегда будет 3+n, где n - число ведомых устройств. Пример SPI-системы с двумя ведомыми устройствами изображен на рис. 9.1.
Рис. 9.1. Пример конфигурации SPI-устройств
- 189 -
Любой интерфейс SPI содержит, как минимум, четыре линии передачи данных. Для каждого ведомого устройства добавляются дополнительные линии SS. Прежде чем отправлять или получать данные через SPI, нужно выяснить, что делают эти линии ввода-вывода и как они должны быть подключены (табл. 9.2).
Таблица 9.2. Описание линий ввода-вывода интерфейса SPI
Линии SPI | Описание |
MOSI | Линия для отправки последовательных данных от ведущего устройства к ведомому |
MISO | Линия для отправки последовательных данных от ведомого устройства к ведущему |
SCLK | Линия синхронизации последовательных данных |
SS | Линия выбора ведомого устройства, активный уровень - низкий |
В отличие от интерфейса I>2C, подтягивающие резисторы здесь не требуются, и протокол полностью двунаправленный. Итак, чтобы подключить устройство SPI к плате Arduino, необходимо соединить его с контактами MOSI, MISO, SCLK и SS.
После этого все готово к использованию Arduino библиотеки SPI.
Так как SPI не является универсальным стандартом, некоторые производители устройств SPI могут по-разному называть линии связи SPI. Линию выбора ведомого иногда называют CS, линию синхронизации - CLK; контакты MOSI и MISO ведомых устройств называют входом последовательных данных (SDI) и выходом последовательных данных (SDO) соответственно.
Передача данных по SPI синхронизируется тактовым сигналом и зависит от состояния линий SS. Все команды, отправляемые мастером, проявляются на входах MOSI, MISO, SCLK всех ведомых устройств. Состояние контакта SS сообщает устройству, игнорировать эти данные или принимать. При написании программы следует учитывать, что при передаче данных только один контакт SS должен иметь низкий уровень.
Последовательность действий для связи с устройством SPI выглядит следующим образом:
1. У становить низкий уровень на линии SS устройства, с которым хотите установить связь.
2. Переключать на тактовой линии уровень сигнала вверх и вниз со скоростью, меньшей или равной скорости передачи, поддерживаемой ведомым устройством.
3. На каждом такте отправлять 1 бит данных по линии MOSI или получать 1 бит данных по линии MISO.
- 190 -
4. Продолжать, пока передача (или прием) не закончится, и остановить переключения тактовой линии.
5. Установить на SS высокий уровень.
Обратите внимание, что на каждом такте данные должны быть отправлены (или получены). Например, далее в сценарии связи с цифровым потенциометром плата Arduino будет посылать данные, но ничего не получать от ведомого устройства.
9.3. Сравнение SPI и I>2C
Многие виды устройств, в том числе акселерометры, цифровые потенциометры, дисплеи и т. п., доступны и в SPI- и в I>2C-версиях. Что лучше выбрать? В табл. 9.3
перечислены некоторые преимущества устройств I>2C и SPI. В конечном счете, выбор устройства зависит от конкретной ситуации. Большинство начинающих считают, что работать с устройствами SPI легче, чем с устройствами I>2C.
Таблица 9.3. Сравнение протоколов SPI и I>2C
Преимущества SPI | Преимущества I>2C |
Может работать на более высокой скорости | Для организации обмена требуется только две линии |
Легче программируется | Имеет аппаратную поддержку Arduino |
Не требует подтягивающих резисторов | |
Имеет аппаратную поддержку Arduino |
9.4. Подключение цифрового потенциометра SPI
Теперь пора применить полученные знания на практике. Рассмотрим устройство управления яркостью светодиодов с помощью цифрового потенциометра ( кратко называемого digipot). В данном примере используем микросхему SPI цифрового потенциометра МСР4231 10ЗЕ. Доступно несколько вариантов данного чипа с различным значением сопротивления. Как и обычный потенциометр, цифровой имеет регулируемый вывод, который определяет сопротивление между двумя выводами микросхемы. Микросхема МСР4231 содержит два потенциометра на одном корпусе. Разрядность каждого из них составляет 7 бит, что определяет 128 значений в диапазоне от 0 до 10 кОм. Сначала с помощью цифрового потенциометра будем менять яркость свечения светодиода, а затем используем digipot для регулировки громкости динамика. Завершив эти два проекта, вы получите основу для реализации более сложных конструкций.