Цифровой потенциометр AD8402.
В качестве очередных семплов мне прибыла партия цифровых потенциометров от Analog Devices. Вещь интересная и многообещающая. Попытаюсь разобраться с линейкой AD8400/AD8402/AD8403. Отличаются между собой они только количеством потенциометров в одной микросхеме: 1, 2 и 4, соответственно. Мне достались AD8402, т.е. с двумя R в одной микросхеме. Блок-схему можете посмотреть в даташите — там всё просто. Только вот реализация непосредственно переменного резистора не показана. Восполню этот пробел схемкой из просторов интернета:
Как видно из рисунка, резистивный элемент Rh — Rl состоит из N-1 резисторов, и N (это его разрядность) коммутирующих ключей в виде МОП-транзисторов. В моём случае — N = 256, и дальше я буду это подразумевать . Код дешифратора определяет подключаемую в цепь «ползунка» Rw через соответствующий МОП-транзистор точку соединения 255-ти последовательно соединённых резисторов. Если зависимость потенциометра линейная (как в моём случае), то величины сопротивлений составляющих линейку резисторов будут одинаковы. Отмечу, что обозначениям на рисунке слева соотносятся обозначения в даташите: Rh -> A, Rl -> B, а Rw -> W.
Команды установки принимаются по последовательному 10-ти разрядному SPI — интерфейсу.
Далее посмотрим на распиновку камня. Рисунок из даташита:
AGND — аналоговая «земля»;
A2-B2 — резистивный элемент 2-го резистора;
W2 — ползунок 2-го резистора;
DGND — цифровая «земля»;
SHDN — сигнал аппаратной установки ползунков обоих резисторов в минимальное значение;
CS — стандартный «выбор кристалла»;
SDI — вход данных последовательного интерфейса;
CLK — тактирующий сигнал последовательного интерфейса;
RS — сигнал аппаратной установки ползунков обоих резисторов в среднее значение;
Vdd — + питания;
W1 — ползунок 1-го резистора;
A1 — B1 — резистивный элемент 1-го резистора.
Теперь структура управляющего слова из того же даташита:
Слово состоит из 10-ти разрядов. А1 и А0 определяют, какому именно резистору (00 — 1-му, а 01 — 2-му) отсылается байт устанавливаемого значения D7 — D0 для ползунка W. Как видите — совершенно ничего сложного нет.

Макетную плату я сконструировал из платы старого отладочного модуля для ATtiny2313.
�? написал код:
#include <avr/io.h> #include <util/delay.h> #define PORT_SPI PORTD/*назначения портов и сигналов*/ #define DDR_SPI DDRD #define PIN_SPI PIND #define SDO PD0 #define CKL PD1 #define CS PD2 #define SHDN PD3 #define RS PD4 void init_SPI (void)//функция инициализации программного SPI < DDR_SPI |= (1< <SDO) | (1<<CKL) | (1<<CS) | (1<<SHDN) | (1<<RS);//все сигналы выходы PORT_SPI |= (1<<CS) | (1<<SHDN) | (1<<RS);//с лог. 1 PORT_SPI &=
(1<<SDO);//иначе — выставляем ноль PORT_SPI |= (1<<CKL);//фронт синхроимпульса PORT_SPI &=
Теперь вернёмся к блок-схеме. Посмотрите на неё ещё раз внимательно… Ничего не напоминает? На один из выводов резистивного элемента подаём опорное напряжение и получаем… ЦАП — цифро-аналоговый преобразователь! �? код написан для этой функции — так лучше будет осциллографом наблюдать работу микросхемы. Ну, если захочется омметром проверить, то раскомментируйте задержку. Тогда будет видно изменение сопротивления.
�?, наконец, непосредственно исследования.
Убедившись в работе цифрового потенциометра омметром, а также в правильной работе сигналов SHDN и RS, я упомянутую выше полсекундную задержку закомментировал и решил для себя выяснить поведение чипа при:
1. Подаче напряжения на резистор непосредственно от питания самой микросхемы, т.е. гальванически не развязанного. Картинка получилась такая:
Это, если на А подать + питания, а корпус на В.
�? такая:
если на В подать + питания, а на А — корпус (короче, переполюсовать).
2. Подаче напряжения на резистор от отдельного, гальванически развязанного источника напряжением меньше или равного питанию самой микросхемы.
Это при питании микросхемы от 5 В, а резистора — от отдельного аккумулятора 3,3 В при подаче + 3,3 В на А, а — 3,3 В на В.
Питание то же, но для резистора — переполюсовка (- на А, + на В).
3. Подаче напряжения на резистор от отдельного, гальванически развязанного источника напряжением немного большим, чем питание самой микросхемы.
Это при питании микросхемы от 3 В, а резистора — от отдельного аккумулятора 5 В при подаче + 5 В на А, а — 5 В на В.
Питание то же, но для резистора — переполюсовка (- на А, + на В).
4. Подаче напряжения на резистор от отдельного, гальванически развязанного источника напряжением много большим, чем питание самой микросхемы.
Это при питании микросхемы от 3 В, а резистора — от «Кроны» 9 В при подаче + 9 В на А, а — 9 В на В.
Питание то же, но для резистора — переполюсовка (- на А, + на В).
Для случаев 3 и 4 AD8402 греется, а в 4-м случае достаточно ощутимо, да и на «Кроне» напряжение просаживается до 7 В. �?нтересно, что в 4-м опыте явно видны ступеньки дискретизации, а частота ощутимо выросла.
Вот такие дела, господа! Хреново, что резистор гальванически привязан к потрохам самой микросхемы. Выше головы 7 В не прыгнешь, а я хотел использовать описываемую микросхему в электронной начинке лабораторного блока питания (имею ввиду напрямую т.е. без дополнительного обвеса)
Shdn что это
Приемопередатчики для сетей CAN-bus
Сеть промышленного назначения CAN-bus (Controller Area Network) была создана фирмой Robert Bosch для применения в распределенных системах управления, работающих в режиме реального времени со скоростью передачи до 2 Мбит/с и вначале использовалась исключительно в автомобилестроении. Высокая помехозащищенность и надежность, а также большой выбор компонентов от крупнейших производителей (Fujitsu, Maxim, Motorola, NEC, Siemens, Texas Instruments и др.) превратили САN в совокупность программных, схемотехнических и алгоритмических решений для широкого диапазона применений — в САN-технологию. Важное место в сети САN отводится приемопередатчикам (ПП), связывающим САN-контроллер и реальные провода САN-шины. Рассмотрим ПП фирмы MAXIM, которые могут заинтересовать потребителей в силу традиционно высокого качества всей продукции компании, невысокой стоимости (порядка 2,5 у.е.) и ряда технологических особенностей.
Приемопередатчики МАХ3050/3057 (рис. 1) первоначально предназначались для автомобильной промышленности, где необходимы скорость передачи данных до 2 Мбит/с и защита от короткого замыкания в системах с высоким напряжением питания. ПП характеризуются однополярным питанием +5 В, током потребления 56 мА в активном и 3,6 мА в пассивном состоянии.
Приборы МАХ3050/3057 работают в четырех режимах:
- высокое быстродействие;
- регулируемое быстродействие;
- пониженное потребление;
- отключение.
Рис. 1
Приемопередатчики МАХ3050/3057
Режим определяется сигналом определенного уровня на выводе RS микросхемы. Передатчик при этом преобразует однополярный сигнал от CAN-контроллера в дифференциальный сигнал для шины CAN (CANH, CANL). Режим высокого быстродействия (вывод«КБ соединен с общим проводом) позволяет достичь при передаче скорости 2 Мбит/с. В этом режиме присутствует повышенный уровень электромагнитных помех, который можно снизить, применив экранированную вигую пару.
Снизить уровень помех без использования экранированной витой пары можно в режиме регулируемого быстродействия. В этом режиме скорость передачи (от 40 до 500 кбит/с) определяется резистором, подключенным между выводом RS и общим проводом. Сопротивление резистора вычисляется по формуле:
Для перехода в режим пониженного энергопотребления необходимо подать на вывод RS микросхемы высокий уровень. При этом передатчики отключаются, а приемники находятся в состоянии малого потребления. В этом режиме возможна потеря первого сообщения, передаваемого на высокой скорости.
Отключение приемопередатчика МАХ3057 происходит при подаче на вывод SHDN сигнала низкого уровня. В ПП МАХ3050 реализован режим AutoShutdown, разработанный фирмой MAXIM, при котором микросхема отключается при отсутствии приема или передачи в течение заданного времени. Значение этого времени задается внешним конденсатором, подключаемым к выводу SHDN, и определяется по формуле:
где VSHDN — порог срабатывания SHDN.
Подача на вывод SHDN высокого уровня переводит МАХ3050 в рабочий режим.
Приемник считывает дифференциальный сигнал с шины (CANH, CANL) и преобразует его в однополярный (RXD) для CAN-контроллера. Компаратор на входе приемника сравнивает разность напряжений ΔV = (CANH-CANL) с внутренним порогом 0,7 В. Если разность положительна, то на выводе RXD формируется сигнал низкого уровня, если отрицательна, то — высокого.
В ПП МАХ3050/МАХ3057 для приемника реализован режим «эхо», т.е. происходит повтор передаваемых данных.
Диапазон синфазного сигнала для линий CANH и CANL от
7 до +12 В. В случае короткого замыкания или обрыва в цепи CANH-CANL, а также если входное синфазное напряжение не более 0,5 В, на выводе RXD формируется сигнал высокого уровня. Если входное напряжение более 0,9 В, то на RXD — низкий уровень.
Микросхемы МАХ3050/3057 имеют два типа зашиты. Первый тип — тепловая защита, которая отключает микросхему и устанавливает линии CANH и CANL в третье состояние, если температура кристалла превысит +160°С. Такое возможно, например, при коротком замыкании на шине. Гистерезис составляет 20°С, т.е. обратное включение произойдет при снижении температуры до +140°С. Второй тип защиты — ограничение тока выходного каскада при коротком замыкании.
Более упрощенным вариантом микросхемы МАХ3050 является МАХ3053, у которой отсутствует режим пониженного потребления. В остальном — это полный аналог МАХ3050.
Фирма MAXIM выпускает также микросхемы МАХ3054/3055/3056 (их структурная схема приведена на рис. 2), предназначенные для применения в автомобильных системах (в том числе с напряжением бортовой сети 42 В). Их главная особенность — переход в режим однопро-водной передачи при возникновении различных отказов. Надежность микросхем определяют тепловая и токовая защиты. Тепловая защита аналогична МАХ3050 (гистерезис —15°С). Токовая защита предохраняет выход передатчика при коротком замыкании на шине. Дополнительно линии CANH и CANL защищены от импульсных помех, характерных для автомобильной электроники.
Приемопередатчики МАХ3054/ 3055/3056 работают в трех режимах, переход в каждый из которых (и выход тоже) задается подачей управляющих сигналов на выводы STB и EN. Для отключения внешнего стабилизатора питания используется вывод INH.
Каждая из микросхем данного семейства рассчитана на определенную скорость передачи данных: МАХ3054 — 250 кбайт/с, МАХЗО55 — 125 кбайт/с, МАХ3056 -40 кбайт/с. Высокая помехозащищенность обеспечивается фильтрами на входе приемников, а встроенная схема регулируемого быстродействия в микросхемах МАХ3055 и МАХ3056 позволяет обойтись без экранированного кабеля.
Работа приемника и передатчика в обычном режиме аналогична работе МАХ3050/3057. Отметим только их отличия.
Для работы от автомобильного аккумулятора (в том числе и 42-вольтового) в микросхеме предусмотрен вывод ВАТТ, через который и подается питание (до +80 В).
С целью снижения потребления в режиме ожидания в микросхемах МАХ3054-МАХ3056 реализована функция управления внешним источником питания. При переходе в режим ожидания потенциал на выходе INH изменяется с низкого на высокий в трех случаях: при «холодном» запуске, по фронту или спаду сигнала на выводе WAKE и если длительность доминирующего сигнала больше 38 мкс при низких уровнях на выводах EN и STB. После включения питания сигнал на выводе INH становится «высоким» и устанавливается внутренний флаг включения питания. Значение этого флага может быть считано в режиме ожидания на выводе ERR (STB = 1, EN = 0), а сброс происходит при переходе в нормальный рабочий режим.
Чтобы иметь информацию о состоянии микросхем, в них предусмотрен вывод ERR. Сигнал на этом выводе устанавливается в «0» при включении питания, выходе из режима ожидания и при сбойной ситуации. В остальных случаях на выводе ERR — высокий уровень.
Отказы и что с ними делать
 Схема обнаружения отказов полностью задействована в нормальном рабочем режиме. При обнаружении отказа она переключается в соответствующее состояние, как показано в табл. 1. Типовое пороговое напряжение составляет -3,2 В (Vcc = 5 В), что обеспечивает корректный прием данных с предельной помехоустойчивостью в нормальном режиме или при отказах 1, 2, 5 и 9.
| № отказа | Описание | Режим работы | Состояние внутренних ключей (0 — выключен, 1 — включен) | Состояние выходов (0 — запрет, 1 — разрешение) | |
| CANH | CANL | ||||
| 1 | Обрыв линии CANH | Нормальный | RTH, RTL-1 | 1 | 1 |
| 2 | Обрыв линии CANL | Нормальный | RTH, RTL-1 | 1 | 1 |
| 3 | Короткое замыкание CANH на шину ВАТТ | Все | RTH-0 | 0 | 1 |
| 4 | Короткое замыкание CANL на общую шину | Все | RTH или RTL-0 | 1 | 0 |
| 5 | Короткое замыкание CANH на общую шину | Нормальный | RTH,RTL-1 | 1 | 1 |
| 6 | Короткое замыкание CANL нa шину ВАТТ | Нормальный | RTH-1, RTL-0 | 1 | 1 |
| 7 | Короткое замыкание линии CANL на CANH | Все | RTH или RTL-0 | 1 | 0 |
| 8 | Короткое замыкание CANH на шину питания | Все | RTH-0 | 0 | 1 |
| 9 | Короткое замыкание CANL на шину питания | Нормальный | RTH,RTL-1 | 1 | 1 |
Режимы пониженного энергопотребления
Приемопередатчики МАХ3054-МАХ3056 могут работать в одном из трех режимов пониженного потребления, которые выбираются подачей сигналов на выводы STB и EN (табл. 2).
| Режим | Уровни сигналов на выводах | Шины, к которым прдключается вывод RTL | |||||
| STB | EN | ERR | RXD | ||||
| 0 | 1 | 0 | 1 | ||||
| Переход в дежурный | 0 | 1 | Выход по прерыванию | — | Выход по прерыванию | — | VВАТТ |
| Дежурный | 0 | 0 | |||||
| Ожидания | 0 | 0 | |||||
| Ожидание включения питания | 1 | 0 | Флаг включения VВАТТ | — | Выход по прерыванию | — | VВАТТ |
| Нормальный | 1 | 1 | Флаг ошибки | Нет флага | Доминирующие принимаемые данные | Рецессивные принимаемые данные | Vсс |
Дежурный (спящий) режим -режим с минимальным потреблением. В этом режиме отключается внешний стабилизатор напряжения переводом выхода INH в третье состояние, смещение на выход CANL от источника питания подается через выход RTL. Если подается питание, то на выводах RXD и ERR формируется прерывание на запуск системы.
Режим ожидания может применяться в том случае, когда необходим внешний стабилизатор напряжения для сохранения активного состояния при малом потреблении (аналогичен дежурному режиму, но на выходе INH устанавливается высокий уровень).
Режим ожидания включения питания — при переходе микросхемы из режима ожидания в режим ожидания включения питания на выходе INH устанавливается высокий уровень, а из дежурного — низкий.
Особенности применения в сети
МАХ3054/3055/3056 могут работать в сети с общим числом приемопередатчиков до 32 на одной шине. Эти ПП спроектированы для работы с суммарным сопротивлением согласующих резисторов 100 Ом (для каждой из линий CANH и CANL). Значение согласующих резисторов RTL и RTH изменяется в соответствии с размерами конкретной системы. Но если у вас нет желания заниматься расчетами, то можно поставить одинаковые резисторы, важно, чтобы их суммарное сопротивление не превышало 100 Ом.
Синхронный последовательный интерфейс SPI в микроконтроллерах «от А до Я» и его реализация на примере ADuC70xx фирмы Analog Devices. Часть 1
В ходе написания статьи оказалось, что доля текста, посвященного вопросам «когда, как и для чего», превысила 50%. Тогда было принято решение изменить характер изложения в направлении, обозначенном в заглавии.
Вследствие выросшего объема материал будет разбит на три отдельные статьи:
- Принципы интерфейса SPI и организация ведомых устройств.
- Подсистемы SPI в микроконтроллерах: варианты организации и использование.
- Подсистема SPI в МК семейства ADuC70xx.
История SPI
Изобретатель интерфейса SPI фирма Motorola [1]. Однако изобретение было сделано не на «пустом месте». Предшественником послужил интерфейс MicroWire фирмы National Semiconductor [2]. Автор статьи познакомился с интерфейсом SPI, работая с популярным семейством M68HC11 практически первым, в котором SPI появился в конце 1980-х годов. Основное предназначение этого интерфейса подключение к МК различных периферийных устройств. Очень быстро SPI стал весьма популярен по следующим причинам:
- минимальные требования к аппаратной части подключаемого к МК устройства (сдвиговый регистр);
- SPI-ведущего в минимальной конфигурации легко эмулировать программно, если в МК отсутствует аппаратная реализация SPI.
В последние два десятилетия многочисленные фирмы производят огромное количество различных периферийных узлов, подключаемых к МК через SPI (см., например, [3]). Это датчики физических величин (температуры, давления, ускорения и т. п.), устройства аналого-цифрового преобразования (АЦП, ЦАП, цифровые потенциометры), устройства преобразования интерфейсов (CAN-контроллеры, Ethernet-контроллеры), модули энергонезависимой памяти (Flash-карты MMC и SD, микросхемы EEPROM) и многие другие. В [4] (2005 год) утверждается, что «примерно 85% МК оснащены интерфейсом SPI».
Исторически, однако, сложилось так, что какой-либо официальный общепризнанный стандарт на интерфейс SPI отсутствует. Поэтому свойства подсистемы SPI в микросхемах разных производителей могут различаться как набором возможностей, так и их реализацией, что нередко вызывает затруднения при использовании. Разработчики преодолевают эти затруднения по большей части методом проб и ошибок либо обмениваясь опытом. В свою очередь производители МК нередко, в предположении, что SPI это общеизвестный стандарт, описывают свойства подсистемы излишне кратко. Этим, в частности, грешит техническое описание МК семейства ADuC70xx фирмы Analog Devices [5].
Весьма нелегко найти источники, в которых бы систематически были описаны все (или хотя бы большинство) из возможных особенностей интерфейса SPI. Обычно встречаемая на форумах разработчиков рекомендация взять техническое описание МК, в котором SPI имеется. Но там, естественно, описывается лишь подмножество опций, реализованных в конкретном МК.
Автору известно лишь несколько публикаций, в которых сделана попытка описать свойства SPI без привязки к конкретному типу МК [3, 4, 6, 14], и все они страдают неполнотой. Некоторые фирмы опубликовали свое «видение» того, что представляет собой SPI, например [1, 79], однако упомянутые документы в значительной степени «привязаны» к реализациям МК, выпускаемых этими фирмами.
Минимальная архитектура интерфейса и конфигурации
Минимальная архитектура изображена на рис. 1. Интерфейс SPI содержит четыре линии:
- MOSI (Master Out Slave In) выход данных ведущего (она же вход данных ведомого);
- MISO (Master In Slave Out) вход данных ведущего (она же выход данных ведомого);
- SCK (Serial ClocK) тактирование (синхронизация);
- SS (Slave Select) выбор ведомого.

Синхронизация передачи
Частота следования битовых интервалов в линиях данных SPI определяется синхросигналом SCK, который генерирует один из абонентов ведущий (Master). Прочие абоненты ведомые (Slave), которых может быть как один, так и несколько, используют синхросигнал для определения моментов изменения битов на линии данных. Ведомые устройства никак не могут влиять на частоту следования битовых интервалов (в отличие, например, от интерфейса I 2 C).
Ведущий в подавляющем большинстве случаев это приемопередатчик SPI в составе МК (если аппаратный SPI отсутствует, его можно эмулировать программно). Однако автору известны реализации SPI-ведущего устройства в составе микросхем PLD фирмы Xilinx [10], а также в ИМС преобразователя параллельного интерфейса в интерфейс USB [11]. В обоих этих случаях ведущий ориентирован на подключение определенного типа микросхем: EEPROM с SPI-совместимым интерфейсом.
Ведомое устройство это обычно периферийная микросхема. Однако SPI можно использовать и для связи двух (или больше) МК, эта возможность будет обсуждаться позже.
Передача битов осуществляется пакетами. Длина пакета чаще всего составляет 1 байт (8 битов), хотя встречаются реализации SPI с иной длиной пакета [9, 12, 15]. Как в ведущем устройстве, так и в ведомом имеется (обычно программно недоступный) счетчик импульсов синхронизации (битов). Счетчик в ведомом устройстве позволяет последнему определить момент окончания передачи пакета. Счетчик битов сбрасывается в ноль при выключении (деактивации) подсистемы SPI, такая возможность всегда имеется в ведущем устройстве. В ведомом устройстве счетчик битов обычно сбрасывается деактивацией интерфейсного сигнала SS. Передача пакета, то есть запуск генератора синхроимпульсов в ведущем, обычно осуществляется автоматически при записи передаваемого байта в регистр сдвига ведущего.
Задание частоты следования битов FSCKосуществляется стандартным для последовательных интерфейсов способом: FSCK=FG/DIV, где FG постоянная частота задающего генератора SPI, значение которой приведено в техническом описании на микросхему, DIVА-217.(О— делитель, который может быть задан программно. В ряде МК делитель DIV может быть выбран только из набора предопределенных значений. Например, в МК семейства M68HC11 это одно из четырех значений: 2, 4, 16, 32 [13]. При номинальном значении FG, равном 2 МГц, частота сдвига в этих МК может составлять 1000, 500, 125 или 62,5 кГц. В других МК значение DIV разрешается выбирать произвольно в пределах ограниченной разрядности. В семействе микроконтроллеров ADuC70xx [5] эта разрядность составляет один байт, величина делителя может задаваться в пределах от 5 до 255, что позволяет выбрать одно из 251 значения частоты сдвигов в пределах от 3482 до 81,2 кГц.
Поскольку действия на ведущем и ведомом устройствах тактируются одним и тем же сигналом SCK, к стабильности частоты этого сигнала не предъявляется никаких требований (за исключением ограничения сверху на длительности полупериодов, определяемого максимальной рабочей частотой более медленного абонента). Это позволяет использовать SPI в системах с низкостабильной частотой тактирования (тактовый генератор без кварцевой стабилизации, с времязадающей RCцепью), а также существенно облегчает программную эмуляцию ведущего устройства. Более того, при программной эмуляции вполне допустимо приостанавливать передачу «в середине» байта, если это допускает ведомое устройство.
Передача данных
SPI предполагает передачу бит за битом: от ведущего по линии MOSI и от ведомого (в обратную сторону) по линии MISO. Таким образом, возможен полнодуплексный режим, когда данные передаются в обоих направлениях одновременно и синхронно. Порядок следования битов в исходной версии SPI фирмы Motorola [13] можно определить как «начиная со старшего», однако в дальнейшем некоторые производители микроконтроллеров позволяли его задавать программно. Возможны реализации, в которых для передачи данных используется единственная двунаправленная линия; подобная конфигурация описана, в частности, в документе фирмы Freescale, полупроводниковой «дочки» фирмы Motorola [1].
Выбор ведомого сигнал SS
Четвертый сигнал интерфейса SS (Slave Select, выбор ведомого) имеет основным назначением включение или выключение ведомого устройства сигналом от ведущего (от МК).
При активном (низком) уровне сигнала SS:
- Схемотехника ведомого устройства находится в активном состоянии.
- Вывод MISO в режиме «выход».
- Тактовый сигнал SCK от ведущего воспринимается ведомым, вызывает считывание на входе MOSI значений передаваемых от ведущего битов и сдвиг регистра ведомого.
При пассивном (высоком) уровне сигнала SS тактовый сигнал SCK и сигнал MOSI не оказывают никакого воздействия на ведомое устройство.
В простейших вариантах использования SPI сигнал SS может не употребляться. В других, более сложных периферийных устройствах сигнал SS не только используется, но выполняет еще и дополнительные функции, и этот вопрос будет обсуждаться далее.
Временная диаграмма сигналов
Возможно несколько вариантов диаграммы. Один из них изображен на рис. 2, а другие будут рассмотрены далее. Опишем диаграмму подробно.

До начала передачи пакета, левее момента времени А сигнал SS на выходе ведущего в высоком состоянии рис. 2д), ведомый неактивен, его выход MISO в отключенном состоянии, а входы ведомого MOSI и SCK не воспринимают сигналов, формируемых ведущим. Тактовый сигнал на выходе ведущего в этот период имеет низкий уровень.
Для активации ведомого ведущий переводит в активное (низкое) состояние сигнал SS выбора ведомого (момент времени A). Ведомый включается, его вход тактирования способен воспринимать тактовый сигнал, а вывод MISO переходит в режим выхода. Тактовые импульсы пока еще не начались, выходные сигналы на линях данных MOSI и MISO теперь отражают значения бита, который будет первым передан другому абоненту (интервал времени от A до 1).
Через некоторое время ведущий начинает формирование пакета сдвиговых импульсов рис. 2а), сигнал SCK. Перепады тактового сигнала вызывают сдвиг содержимого сдвиговых регистров ведущего и ведомого, а также захват новых значений битов после сдвига. Моменты сдвига и захвата должны быть разнесены во времени, поэтому эти действия выполняются в интерфейсе SPI по разным перепадам тактовых импульсов. Диаграмма изображена в предположении, что захват производится по нарастанию тактового сигнала (по нечетным перепадам на рисунке), соответствующие моменты времени отмечены также на рис. 2б), а сдвиг в регистрах по спаду (четные перепады). Таким образом, порядок событий при действии каждого тактового импульса можно описать как «захват, затем сдвиг» (Latch, then Shift).
После окончания обмена пакетами (правее перепада 16-тактовой последовательности) выходной сигнал на каждой из линий данных MOSI и MISO отражает значение бита, который был передан первым. Передача пакета завершается снятием сигнала SS на выходе ведущего (момент B), что деактивирует ведомого абонента. Через некоторое время возможно начало передачи следующего пакета (момент С).
Сигнал SS может формироваться на выходе ведущего разными способами. В некоторых МК он формируется аппаратно: после того как будет программно выполнена запись передаваемого байта в регистр данных передатчика, выходной сигнал SS автоматически переключается в низкий уровень, а по окончании пакета возвращается в исходное неактивное значение (высокий). Если в ведущем устройстве отсутствует аппаратно реализованное формирование сигнала SS, его формируют программно, используя для этого выход параллельного порта общего назначения. Однако при работе с некоторыми периферийными устройствами приходится формировать сигнал SS программно даже при наличии аппаратного формирователя. Примеры будут приведены позже.
На этом рассмотрение базовых свойств интерфейса SPI заканчиваем, а более подробное их обсуждение продолжим на примерах использования.
Простейший пример использования SPI
Рассмотрим простой пример использования интерфейса SPI для увеличения количества линий дискретного вывода (параллельных портов) в МК, например, для управления группой светодиодов либо семисегментным ЖК-индикатором. Для этого в качестве ведомого можно взять обычный регистр сдвига, например 74HC164. Такой восьмиразрядный регистр имеет последовательный вход данных, вход тактирования (сдвига) и восемь параллельных выходов. Отдельный последовательный выход данных в этом регистре отсутствует, но для этого можно использовать выход старшего разряда D7. Схема подключения показана на рис. 3. В ней использованы только две из четырех линий интерфейса SPI.

Схемотехника микросхемы 74HC164 такова, что как восприятие нового значения входного сигнала MOSI, так и сдвиг (в результате которого изменяются состояния параллельных выходов D7, …, D0) происходит по нарастанию тактового сигнала SCK. Таким образом, использовав два вывода (MOSI и SCK) можно получить дополнительно восемь цифровых выходов в системе.
Почти во всех микроконтроллерах с интерфейсом SPI линии этого интерфейса мультиплексированы с выводами параллельных портов общего назначения. Данный факт позволяет использовать незадействованные выводы микроконтроллера MISO и SS для других целей. Но этот же факт требует от программиста не забыть переконфигурировать соответствующие выводы параллельных портов для их использования в SPI.
Последовательное включение ведомых
При необходимости увеличения количества выходов можно соединить n регистров 74HC164 последовательно в цепочку, которая образует 8× n-разрядный сдвиговый регистр и предоставит 8× n выходов. На рис. 4 показано, как это выглядит для n = 2.

Для загрузки этого составного сдвигового регистра новым содержимым придется передать через SPI последовательно n байтов. Недостаток такого решения состоит в том, что во время передачи цепочки битов через многоразрядный сдвиговый регистр состояния его выходов будут переключаться, однако для управления набором светодиодов или многоразрядным семисегментным индикатором это вполне допустимо.
Аналогично можно подключить к МК через интерфейс SPI одну или несколько ИМС регистров сдвига типа 74HC299, имеющих двунаправленные параллельные выводы, что даст дополнительное количество двунаправленных линий ввода/вывода.
Периферийные микросхемы с интерфейсом SPI могут быть устроены сложнее, нежели рассмотренные сдвиговые регистры, и требовать определенной последовательности сигналов SCK и MOSI на своих входах. Это относится:
- к полярности тактовых импульсов (или иначе, к уровню сигнала, которого требует на входе SCK периферийная микросхема в промежутках между передачами пакетов),
- а также к порядку событий «захват и сдвиг».
По этой причине в спецификациях интерфейса SPI различают четыре режима работы [14], диаграммы для этих режимов изображены на рис. 5.

Буквы S и L над графиками обозначают соответственно Shift (сдвиг) и Latch (захват). Рассмотренная ранее диаграмма соответствует Mode 0. Считается, что наиболее употребительны Mode 0 и Mode 3.
Для выбора в ведущем устройстве (в МК) одного из режимов, различающихся полярностью тактовых импульсов и их «фазой» (порядком действий), в одном из периферийных регистров подсистемы SPI обычно есть два управляющих бита: CPOL (полярность) и CPHA (фаза) приведенные обозначения битов и обозначения режимов являются широко употребительными. Периферийные устройства (ведомые) чаще всего поддерживают единственный режим, и перед началом обмена ведущий (МК) должен быть настроен на этот режим.
Обратим внимание читателя на то, что в рассмотренном выше примере работы с обычным регистром сдвига одинаково пригоден любой из этих четырех режимов.
Возможные топологии систем связи на базе интерфейса SPI
Простейший случай: к ведущему подключен единственный ведомый, и необходим двусторонний обмен. В этом случае структура межсоединений может использовать трехпроводную схему (рис. 6).

На вход выбора SS на ведомом может быть постоянно подан активный (низкий) уровень, в то время как выход SS ведущего не используется вовсе и может быть задействован как вывод параллельного порта.
Интерфейс SPI позволяет подключить к одному ведущему несколько ведомых устройств, причем это может быть сделано различными способами. Первый из них позволяет реализовать радиальную структуру связи («звезда»), его принято считать основным вариантом использования интерфейса SPI. Соответствующая конфигурация соединений показана на рис. 7 (заимствован из [6]).

Как видно на рисунке, для обмена более чем с одним ведомым ведущий должен формировать соответствующее количество сигналов выбора ведомого SS. Это как раз тот случай, когда сигналы SS приходится формировать программно, поскольку аппаратно в ведущем формируется не более одного сигнала SS. Если требуется обеспечивать обмен всегда только между ведущим и лишь одним из ведомых, программа на ведущем должна в промежутках между передачами данных держать все сигналы SS в неактивном (высоком) состоянии, а для обмена с одним из ведомых переводить в активный (низкий) уровень соответствующий сигнал SS (отсюда и название «выбор ведомого» Slave Select). Выводы данных ведомых MISO соединены параллельно, но не «мешают» друг другу, поскольку находятся в отключенном состоянии, а перед началом обмена лишь один из этих выходов (на выбранном ведомом) переходит в активный режим. Обеспечение такого положения дел требует от программиста внимательности.
Однако может возникнуть желание в некоторых приложениях использовать «широковещательную» передачу, при которой данные, передаваемые ведущим, воспринимаются и используются одновременно несколькими (может быть, всеми) ведомыми. Подобный режим возможен без опасности возникновения электрического конфликта на линии MISO в случае, если не требуется передавать данные из ведомых в ведущее устройство, тогда обратные линии данных из ведомых просто отсутствуют.
Если в качестве ведомых в рассматриваемой структуре используются тоже МК, в которых имеется возможность программно управлять режимом выходов MISO, то можно организовать широковещ ательную передачу и при наличии обратного канала (линии MISO). Для этого программы, работающие на микроконтроллерах ведомых, должны постоянно держать выводы MISO в отключенном состоянии, при этом возможен режим широковещательной передачи от ведущего. Если же требуется получение данных от одного из ведомых, ведущий может сообщить ему об этом в широковещательном режиме, послав пакет с командным кодом-идентификатором, распознав который, один из ведомых должен перевести свой вывод MISO в активное состояние, после чего возможен двусторонний обмен данными между ведущим и выбранным ведомым. По окончании двустороннего обмена ведущий должен вернуть выбранного ведомого в исходное состояние. Иными словами, для получения такой возможности разработчику придется сконструировать некий протокол обмена, надстроенный над диаграммами SPI, в котором некоторые значения байтов (или их последовательностей) играют роль команд для ведомых МК. Этот вопрос будет рассмотрен более подробно в следующей статье цикла при обсуждении организации симметричной магистрали с несколькими ведущими на базе SPI.
Второй способ, позволяющий соединить одного ведущего абонента с несколькими ведомыми, это структура «кольцо» (иногда эту структуру называют «цепочкой» или каскадным включением, в английской терминологии используется название Daisy-Chain) [6]. Эта структура изображена на рис. 8 (заимствован из [6]).

В ней для активации одновременно нескольких ведомых используется единственный сигнал SS, а выводы данных всех абонентов соединены последовательно и образуют замкнутую цепь (кольцо). При передаче пакета от ведущего этот пакет получает первый ведомый, который, в свою очередь, транслирует свой пакет следующему ведомому, и т. д., наконец, последний в цепи ведомый передает свой пакет ведущему. Для того чтобы пакет от ведущего достиг определенного ведомого, ведущий должен выдать еще несколько пакетов. Вариант этой структуры (с незамкнутым кольцом) уже обсуждался (рис. 4).
Некоторые периферийные микросхемы с интерфейсом SPI проектируются специально для использования в цепочечных конфигурациях. Пример таких микросхем цифро-аналоговые преобразователи AD5444 и AD5446 фирмы Analog Devices [15]. Их структура изображена на рис. 9.

Интерфейс этих приборов, совместимый с SPI, содержит 16-разрядный сдвиговый регистр с последовательным входом данных SDIN (MOSI), последовательным выходом данных SDO (MISO), входом тактирования сдвига SCLK (SCK) и входом управления SYNC. Три первых вывода по своим функциям полностью аналогичны выводам SPI (они указаны в скобках). Наличие выхода сдвигового регистра SDO позволяет подключить к МК (ведущему) несколько микросхем ЦАП по цепочечной структуре. Захват значения на входе регистра ведомого AD5444/6 происходит по спаду сигнала SCLK, изменение сигнала на этом входе (сдвиг выходного регистра ведущего) должен происходить по нарастанию SCLK. Такая последова тельность действий соответствует Mode 1 (рис. 5). Длина передаваемого в микросхему ЦАП пакета составляет 16 битов, из них два старших выполняют управляющие функции, а последующие 14 битов (в AD5446) или 12 битов (в AD5444) представляют значение отсчета, преобразуемое в напряжение. У программиста есть возможность переключить режим работы SPI в ведомом AD544x, задав значение старших двух битов пакета равным 11, в результате чего ведомый AD544x переключится в Mode 2, захват входного сигнала будет происходить по нарастанию сигнала SCLK.
А вот вход SYNC (SS) выполняет одновременно несколько функций. Во-первых, он низким уровнем активирует в микросхеме ЦАП функцию восприятия сигналов входной линии данных SDIN (MOSI) и линии тактирования SCLK (SCK). Кроме того, по окончании передачи пакета в микросхемы ЦАП переход в высокий уровень сигнала SYNC инициирует передачу полученного 16-битового пакета во входной буфер схемотехники ЦАП (что приведет к появлению нового значения напряжения на аналоговом выходе ЦАП синхронно во всех ведомых), а кроме того, отключает питание от интерфейсных цепей для уменьшения мощности, потребляемой микросхемой ЦАП.
Таким образом, штатный режим работы с цепочкой микросхем ЦАП предполагает установку активного уровня сигнала SYNC (SS), по которому включается питание интерфейсной схемотехники в ЦАП, затем последовательную передачу нужного количества 16-разрядных посылок с учетом порядка включенных в цепочку ведомых (при этом изменения выходных напряжений ЦАП не происходит) и, наконец, выключение активного сигнала SYNC, по которому изменятся одновременно выходные напряжения всех ЦАП в цепочке. Сигнал SYNC должен сохраняться активным (низким) без переключений до окончания передачи всех посылок.
Еще ряд примеров использования SPI
И в случае радиальной схемы с широковещанием, и в последнем примере с цепочечным подключением ЦАП дополнительные возможности были получены в результате наличия и использования высокоуровневого протокола, предполагающего передачу многобайтовых посылок. В примере с широковещанием разработка такого протокола должна выполняться прикладным программистом, в то время как при использовании ИМС AD5444/AD5446 этот протокол специфицирован в их техническом описании.
Широко распространенный отладочный интерфейс JTAG также представляет собой пример реализации высокоуровневого протокола поверх SPI. JTAG предполагает соединение нескольких контролируемых устройств (ведомых) в кольцо и наличие в этом кольце единственного ведущего (JTAG-хоста) [6, 17, 18]. Длины посылок, используемые в JTAG, могут быть достаточно большими, однако их размер кратен 8 битам.
Рассмотрим еще один пример, в котором передача данных осуществляется только в обратном направлении от ведомого к ведущему, а сигнал SS выполняет дополнительную функцию запуск операции в периферийном устройстве.
Фирма Maxim 1 выпускает периферийные микросхемы MAX1240/1241 12-битовые АЦП с интерфейсом SPI [12]. Структурная схема устройства изображена на рис. 10.

Для подключения к МК через SPI в микросхеме имеются три вывода: вход тактирования SCLK (SCK), вход выбора кристалла CS (SS) и выход последовательных данных DOUT (MISO). Таким образом, в этом примере линия данных MOSI не используется, и соответствующий вывод в ведомом устройстве отсутствует. Временная диаграмма сигналов и внутренних состояний периферийной микросхемы АЦП изображена на рис. 11 (заимствован из [12]).

Исходно при неактивном (высоком) уровне сигнала CS выход данных DOUT находится в отключенном (высокоимпедансном) состоянии.
По спаду сигнала CS из ведущего МК в ведомом MAX1240/1241 происходит:
- захват входного аналогового сигнала на встроенном устройстве выборки/хранения УВХ;
- запуск процесса аналого-цифрового преобразования с одновременным переходом сигнала DOUT в низкий уровень.
По окончании (через 7,5 мкс) процесса АЦ преобразования УВХ переходит из состояния «хранение» (HOLD) в состояние «выборка» (TRACK), а сигнал DOUT в высокий уровень: последнее сигнализирует микроконтроллеру о готовом результате.
После этого ведущий МК может начать (немедленно или через некоторое время) считывание результата АЦ преобразования путем подачи последовательности тактовых импульсов на линию SCLK. Для его получения ведущий должен инициировать передачу двух байтов из ведомого. В них будет передано 16 битов, из которых первые 12 представляют результат, а последние четыре (нуля) должны быть просто отброшены. На диаграмме показано, что для повторения измерения ведущий должен снять активный уровень сигнала SS на предопределенное время (не менее 0,24 мкс), после чего процесс вновь можно запустить переключением сигнала SS в активный (низкий) уровень.
В этом примере сигнал CS (SS) выполняет в ведомом MAX1240/1 несколько функций:
- активирует внутреннюю схемотехнику SPI и выводит из отключенного состояния выход сигнала DOUT (MISO);
- запускает процесс аналого-цифрового преобразования в АЦП. Следует обратить внимание на то, что в течение времени, пока происходит АЦ-преобразование, сигнал SS должен иметь активное значение (низкий уровень), но сдвиговые такты должны отсутствовать. Это возможно лишь при программном управлении сигналом SS в ведущем устройстве.
Отдельно нужно сказать о сигнале SHDN в микросхемах MAX1240/MAX1241. Он предназначен для перевода периферийной микросхемы в режим энергосбережения. Для этой цели можно было бы использовать SS, однако внутренней схемотехнике преобразователей напряжения (для АЦП) требуется некоторое время для выхода на режим (около 4 мкс). Разработчики микросхемы могли бы реализовать внутреннюю задержку, но они предпочли использовать дополнительный управляющий сигнал. Это оправдано тем, что при необходимости непрерывного преобразования SHDN нужно включить лишь единожды, а запуск АЦП производить многократно. Для управления сигналом SHDN можно использовать выход порта общего назначения.
Что должна делать программа в ведущем (в МК)?
Вот какой может быть последовательность действий, выполняемая микроконтроллером в последнем примере, если его подсистема SPI имеет стандартную длину пакета 8 битов:
- Установить высокий уровень сигнала SHDN (программно).
- Подождать не менее 4 мкс (выход на режим преобразователей напряжения для АЦП).
- Установить низкий уровень сигнала SS (программно).
- Убедиться, что сигнал DOUT принял значение лог. 0 (программно или по прерыванию).
- Проверять состояние сигнала DOUT (признак окончания АЦ-преобразования) до тех пор, пока этот сигнал не переключится в лог. 1 (программно или по прерыванию).
- Инициировать передачу байта из периферийной микросхемы. Частота следования тактовых импульсов не должна превышать 2,1 МГц.
- Дождаться окончания приема первого байта (программно или по прерыванию).
- Прочитать и сохранить принятый первый байт.
- Инициировать передачу второго байта.
- Дождаться окончания приема второго байта (программно или по прерыванию).
- Прочитать и сохранить второй байт.
- Установить высокий уровень сигнала SS для того, чтобы в будущем можно было без задержек запустить следующее измерение.
- При необходимости немедленно выполнить еще одно измерение, установить низкий уровень сигнала SS (время нахождения сигнала SS в высоком уровне между двумя циклами измерения должно быть не меньше 0,24 мкс).
- Из полученных двух байтов взять первые 12 битов и записать их в переменную, предназначенную для результата.
Как видим, последовательность достаточно длинная, и нагрузка на МК оказывается значительной, если хочется выполнять измерения с частотой, близкой к максимальной.
И под конец еще более сложный пример ведомого устройства. Фирма Atmel производит микросхемы Flash-памяти с интерфейсом SPI [19]. Рассмотрим особенности подключения микросхемы AT45DB161B с организацией 2M×8 бит. На рис. 12 изображена структурная схема устройства с указанием всех внешних выходов.

Сигналы SI (MOSI), SO (MISO), SCK (SCK), CS (SS) образуют интерфейс, совместимый с SPI. Обмен с внутренним массивом Flash осуществляется через два буфера размером (512+16) байт. Внутреннее состояние «микросхема занята выполнением операции» либо «операция закончена, микросхема свободна» отражается состоянием сигнала RDY/BUSY. При выполнении длительных операций состояние этого сигнала можно анализировать программно, либо использовать механизм аппаратных прерываний.
Особенностью микросхемы Flash-памяти является то, что при обмене используются многобайтовые пакеты переменной длины. Первый байт каждого пакета является командой, а последующие байты содержат параметры или записываемые данные. Переход сигнала CS в активный (низкий) уровень отмечает начало пакета, а возврат сигнала CS в высокий уровень конец пакета. Часть пакетов, предназначенных для чтения данных из Flashпамяти, имеют переменную длину. Структура заголовка команд чтения/записи изображена на рис. 13.

Как видно на рис. 13, первый байт содержит команду (код операции), а следующие три байта два параметра: адрес страницы в Flash-массиве и адрес байта в странице, с которого требуется осуществить запись либо чтение. Параметры не выровнены по границам байтов, следовательно, заголовок должен быть сформирован программистом заранее, до начала передачи пакета.
Последующие байты пакета в командах записи содержат записываемую информацию, а в командах чтения не используются. Пример диаграммы для команды записи приведен на рис. 14.

Как видно на рис. 14, записываемые байты следуют в пакете за заголовком, их количество может быть различным. По окончании пакета ведущий должен снять активный уровень сигнала CS, и это запустит внутренний процесс копирования содержимого буфера в массив Flash.
Диаграмма для операции чтения из Flashпамяти приведена на рис. 15.

После окончания заголовка на линии SI микросхема выполняет (достаточно долго) операцию чтения, а ведущий должен продолжать сдвиги до тех пор, пока микросхема не закончит чтение и не начнет возвращать прочитанное по линии SO. Между сдвигами отдельных байтов допускаются промежутки. Это означает, что, запустив «длинную» операцию, ведущий (микроконтроллер) может некоторое время не производить обменов через SPI, а выполнять другие действия, единственное условие состоит в том, что до окончания операции должен оставаться активным (низким) сигнал CS.
Поскольку длительность доступа к массиву Flash может быть значительной, микросхема допускает разделение операции на два этапа. Временные диаграммы процессов на линиях SPI для этого варианта действий приведены на рис. 16.

На первом выдается команда чтения из массива Flash в буфер, которая может выполняться в ведомом весьма долго, но командный пакет содержит всего четыре байта (верхние диаграммы), после чего сигнал CS может быть снят и ведущий получит возможность производить обмены с другим ведомым. После того как выполнение первой команды в микросхеме Flash будет закончено, вторая команда (нижние диаграммы) может произвести чтение из буфера, которое выполнится без ожидания.
Для того чтобы МК мог «узнать» об окончании длинной операции, микросхема AT45DB161 имеет специальный выход RDY/BUSY#, который можно либо опрашивать программно, либо использовать как источник запроса аппаратного прерывания.
Таким образом, мы видим, что в данном случае над интерфейсом SPI надстроен достаточно сложный протокол, для его реализации ведущий должен иметь возможность формировать пакеты произвольной длины, в которых сигнал CS (SS) сохраняет свое активное значение.
Микросхемы AT45DB161B имеют (предоставляют пользователю) еще одну интересную возможность, а именно: выбирать режим работы интерфейса (сочетание полярности и фазы тактовых импульсов), не используя дополнительных линий. В каждом пакете схемотехника микросхемы анализирует состояние сигнала CSK в момент перехода сигнала CS в активный (низкий) уровень. Если уровень сигнала SCK низкий, микросхема настраивается на работу в режиме 0, если же высокий в режиме 3 (рис. 17), моменты настройки отмечены жирными стрелками.

Рассмотренные примеры ведомых позволяют сформулировать определенные требования к структуре и функциям устройства, выполняющего роль ведущего. Чаще всего это подсистема SPI в составе МК.
О том, какой может быть организация ведущего абонента SPI, пойдет речь в следующей статье цикла.