Изучаем 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 -

9.2.1. Конфигурация интерфейса SPI

Любой интерфейс 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) соответственно.

9.2.2. Протокол передачи данных SPI

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