Рис. 11.4. Транзакции на шине SMI: a — запись, б — чтение
В общем случае каждой транзакции должна предшествовать преамбула Pre — не менее 32 тактов нахождения MDIO
на высоком уровне. Собственно транзакция начинается с условия Start — вывода контроллером битовой последовательности «01», за которым следует двухбитная команда Cmd
: «10» — чтение или «01» — запись. Далее контроллер передает 5-битный адрес устройства ( PhyAd
), за которым следует 5-битный номер регистра ( RegAd
). После этого следует двухбитный «пируэт» (turnaround) ТА
для перехода к передаче данных. При операции записи «пируэт» сводится к передаче контроллером последовательности «10», а затем он передает 16 бит данных ( WData
) для записи в регистр. При чтении с начала «пируэта» контроллер отпускает линию MDIO
, а на время второго бита отозвавшееся адресованное устройство устанавливает на этой линии нуль, что используется для определения факта ответа. В следующие 16 тактов устройство передает считанные данные ( RData
) контроллеру.
Преамбула нужна только для приведения интерфейсной части устройств в исходное состояние (после подачи питания); если питание устройством не терялось, то последующие транзакции могут выполняться и без преамбулы. Имеется также нюанс в «пируэте»: для некоторых устройств второй его бит оказывается лишним — он сбивает синхронизацию данных на 1 такт.
Интерфейс SPI (Serial Peripheral Interface), он же Microwire, — трехпроводный синхронный с раздельными линиями входных и выходных данных — применяется для связи микроконтроллеров с периферийными микросхемами и микросхемами памяти. С его помощью программируются многие микросхемы программируемой логики (например, FPGA фирмы Altera), применяемые в различных узлах ПК и периферии. По сравнению с I²C интерфейс SPI обеспечивает более высокую скорость передачи данных. Частота синхронизации может достигать 5 МГц (зависит от подключаемых устройств); при этом за каждый такт синхронизации одновременно может и передаваться, и приниматься очередной бит данных. В основном варианте использования предполагается, что интерфейс соединяет одно ведущее устройство с одним или несколькими ведомыми устройствами. Интерфейс может применяться и для обмена между несколькими микроконтроллерами, допуская наличие на шине нескольких ведущих устройств, но протокол предоставления доступа не стандартизован. Ниже рассматривается работа интерфейса с одним ведущим устройством. В интерфейсе используются 3 обязательных сигнала:
♦ SCK
(Serial Clock) — синхросигнал, которым ведущее устройство стробирует каждый бит данных;
♦ MOSI
(Master Output Slave Input) — выходные данные ведущего устройства и входные данные ведомого устройства;
♦ MISO
(Master Input Slave Output) — входные данные ведущего устройства и выходные данные ведомого устройства.
Кроме того, может использоваться сигнал выбора ведомого устройства SS#
(Slave Select, или CS#
— Chip Select): ведомое устройство должно реагировать на сигналы интерфейса и генерировать выходные данные на линии MISO только при низком уровне этого сигнала; при высоком уровне выход MISO
должен переводиться в высокоимпедансное состояние. С помощью сигналов SS#
, раздельно формируемых ведущим устройством для каждого из ведомых устройств, ведущее устройство может выбирать партнером в транзакции одно из ведомых. При этом получается гибридная топология соединений: по сигналам SCK
, MOSI
и MISO
— топология шинная, по SS#
— звездообразная (центр — ведущее устройство).
Возможен и иной способ общения ведущего устройства с несколькими ведомыми устройствами с чисто шинной топологией. Здесь сигнал SS#
для выбора устройств не используется, но ведомые устройства все время «слушают» шину, ожидая специальной адресной посылки в начале транзакции. Опознав свой адрес, устройство отрабатывает дальнейшие протокольные посылки, и теперь ему разрешается выводить данные на линию MISO
до конца текущей транзакции. Однако этот вариант требует довольно сложной логики поведения ведомого устройства.
Данные передаются старшим битом вперед. Устройства различных производителей могут использовать разные режимы обмена (SPI Mode 0…SPI Mode 3), различающиеся фазой и полярностью синхросигналов. Рис. 11.5 иллюстрирует передачу и прием байта в различных режимах. Заметим, что в любом режиме входные и выходные данные стробируются по разным перепадам синхроимпульсов. Кроме того, есть варианты в использовании сигнала SS#
. В первом варианте (он и представлен на рисунке) для ведомого устройства признаком начала транзакции является спад сигнала SS#
, а завершения — его подъем. Во втором варианте начало транзакции определяется по первому фронту (спаду) SCK
, а сигнал SS#
может иметь низкий уровень постоянно. Второй вариант иногда предпочитают для простейшего двухточечного интерфейса с единственным ведущим устройством и единственным ведомым устройством, когда нет опасения потери синхронизации. Микроконтроллеры с аппаратным портом SPI, как правило, имеют возможность программного выбора режима. Форматы транзакций зависят от устройств, но общая идея такова: ведущее устройство по линии MOSI
посылает код операции и адресную информацию для устройства; затем следуют данные. В операции записи они передаются ведущим устройством по той же линии, в операции чтения устройство их посылает по линии MISO
. На время всей транзакции ведущее устройство сохраняет активное состояние линии SS#
, число требуемых синхроимпульсов зависит от формата команды.
Читать дальше