Вы здесь

AVR151: Инициализация и использование интерфейса SPI

SPI with 1 master and 2 slaves

Оригинальное название: AVR151: Setup And Use of The SPI
Версия перевода: 2
Дата перевода: 28.09.2010
Точность перевода: Местами вольный

Оглавление

1. Введение

Данный документ описывает процесс инициализации и использования аппаратной реализации интерфейса SPI микроконтроллеров AVR. Большинство устройств AVR имеют в своем составе интерфейс SPI и могут быть сконфигурированы согласно этому документу. После изложения теоретических основ будет показан на практике процесс конфигурирования интерфейса SPI в режимах Master и Slave.

Интерфейсы в режиме ведущего и ведомого

Рисунок 1. Интерфейсы в режиме ведущего и ведомого

2. Общее описание SPI

Интерфейс SPI позволяет осуществлять высокоскоростную синхронную передачу данных между микроконтроллером AVR и периферийными устройствами или между несколькими микроконтроллерами AVR. В большинстве случаев этот интерфейс имеет второе назначение — он используется для внутрисхемного программирования (ISP). Более подробно этот вопрос рассмотрен в документе AVR910.

Взаимодействие между двумя устройствами SPI всегда осуществляется между устройством в режиме Master (далее по тексту «ведущий») и устройством в режиме Slave (далее по тексту «ведомый»). В отличие от некоторых периферийных устройств, таких как датчики, которые могут выступать только в роли ведомых, интерфейс SPI микроконтроллеров AVR может быть сконфигурирован как для работы в режиме ведущего, так и для работы в режиме ведомого. Режим работы интерфейса SPI микроконтроллера AVR определяется битом master (MSTR) регистра управления интерфейсом SPI (SPCR). Особое внимание следует уделить линии SS, подробнее о которой будет написано далее в разделе «Системы с несколькими ведомыми — функционирование линии SS».

В этой системе активным является ведущее устройство. Оно предоставляет тактовый сигнал, на основе которого осуществляется последовательная передача данных. Ведомое устройство не может генерировать тактовый сигнал, в следствие чего не может самостоятельно инициировать активность. Ведомое устройство просто принимает и отправляет данные в то время, когда ведущее устройство генерирует тактовый сигнал. Однако, ведущее устройство генерирует тактовый сигнал только при передаче данных. Это означает, что ведущее устройство для того, чтобы получить данные из ведомого устройства, должно послать данные ведомому устройству.

Примечание! Особенно запутанным это выглядит для «пассивной» периферии, такой как датчики. Не совсем очевидно, что для чтения данных с датчика необходимо послать датчику произвольные данные.

2.1 Передача данных между ведущим и ведомым

Взаимодействие между ведущим и ведомым контроллером AVR показано на рисунке 1, на котором изображено два идентичных устройства. Левое устройство сконфигурировано как ведущее (Master), правое как ведомое (Slave). Линии MISO, MOSI и SCK одного устройства соединены с соответствующими линиями другого устройства. Направление этих линий определяется режимом, в котором работает устройство. Так как смещение бита от ведущего к ведомому и от ведомого к ведущему устройству происходит одновременно с тактовым импульсом, 8-ми битные сдвигающие регистры каждого устройства могут быть рассмотрены как один 16-ти битный регистр с циклическим сдвигом. Это означает, что обмен между ведущим и ведомым устройствами осуществляется в течении 8-ми тактовых импульсов (каждое устройство одновременно производит запись и чтение бита).

Рассматриваемая система обладает одинарной буферизацией в направлении передачи и двойной буферизацией в направлении приема. Это влияет на обработку данных в следующих случаях:

  1. Новый байт, предназначенный для передачи, не должен записываться в регистр данных (SPDR) (иначе говоря, сдвиговый регистр) до того момента, пока текущая операция передачи (сдвига) не будет завершена.
  2. Полученный байт записывается в буфер приемника сразу после завершения передачи.
  3. Данные из буфера приемника должны быть прочитаны до завершения следующей операции передачи данных, иначе принятые данные будут утеряны.
  4. Чтение регистра SPDR возвращает данные из буфера приемника.

После завершения передачи данных в статусном регистре интерфейса SPI (SPSR) устанавливается флаг прерывания (SPIF). Это приведет к генерации прерывания, если разрешены прерывания SPI, а так же разрешены прерывания глобально.

2.2 Выводы SPI

SPI содержит четыре сигнальных линии. Это линия генератора сдвига (SCK), линия «Выход ведущего вход ведомого» (Master Out Slave In или MOSI), линия «Вход ведущего выход ведомого» (Master In Slave Out или MISO) и линия выбора ведомого с низким активным уровнем (SS). Когда SPI включен, направление передачи данных на выводах SCK, MOSI, MISO и SS изменяется в соответствии со следующей таблицей.

Таблица 2.1 Выводы SPI

Вывод Направление в режиме ведущего Направление в режиме ведомого
MOSI Определяется пользователем Вход
MISO Вход Определяется пользователем
SCK Определяется пользователем Вход
SS Определяется пользователем Вход

Из таблицы видно, что автоматически инициализируются только входные линии. Выходные линии должны быть явно инициализированы программой. Это сделано с целью избежать повреждения портов.

2.3 Системы с несколькими ведомыми — функционирование вывода SS

Линия выбора ведомого SS играет центральную роль в конфигурировании SPI. В зависимости от режима, в котором работает устройство, и настройки этой линии, она может использоваться для активирования и деактивирования устройств.

В режиме ведущего вывод SS, если он сконфигурирован как вход, должен удерживаться в высоком состоянии. Низкий уровень на этой линии переключит SPI в режим ведомого устройства и аппаратура выполняет следующие действия:

  1. Бит MSTR регистра управления SPI (SPCR) будет сброшен, а система перейдет в режим ведомого. Направления линий будут установлены согласно таблице 2.1.
  2. Будет установлен флаг прерывания SPI (SPIF) регистра состояния SPI (SPSR). Если разрешены прерывания глобально и разрешены прерывания от SPI, будет выполнен соответствующий обработчик прерывания.

Выше описанное используется в системах с несколькими ведущими для исключения случая, когда к шине SPI одновременно получают доступ два устройства в режиме ведущего. Если линия сконфигурирована как выход, она может использоваться для любых целей, в том числе и не относящихся к SPI.

Примечание! В тех случаях, когда контроллер AVR настроен на работу в режиме ведущего и не может быть гарантировано, что между двумя передачами на линии SS будет оставаться высокий логический уровень, перед передачей нового байта необходимо проверять бит MSTR. После того, как бит MSTR был сброшен в следствии установки на линии SS логического нуля, для повторного активирования режима ведущего надо снова установить бит MSTR.

В режиме ведомого линия SS всегда является входом. Когда на ней устанавливается низкий уровень, SPI активируется, а линия MISO становится выходом (если её так сконфигурирует пользователь). Все остальные линии являются входами. Когда на линии SS устанавливается высокий логический уровень, все линии работают как входы, а SPI находится в пассивном режиме, то есть не принимает входные данные. В таблице 2.2 показано функционирование вывода SS.

Примечание! В режиме ведомого при установке высокого уровня на линии SS логика SPI сбрасывается. Установка высокого уровня на линии SS во время передачи данных приведет к немедленному прекращению передачи и приема данных, а принятые и переданные данные следует считать утерянными.

Таблица 2.2 Обзор функционирования линии SS

Режим Конфигурация линии SS Уровень SS Описание
Ведомый Всегда вход Высокий Ведомый деактивирован (не выбран)
Низкий Ведомый активирован (выбран)
Ведущий Вход Высокий Ведущий активирован (выбран)
Низкий Ведущий деактивирован, переведен в режим ведомого
Выход Высокий Ведущий активирован (выбран)
Низкий

Как показано в таблице 2.2 линия SS в режиме ведомого всегда работает как вход. Низкий уровень на этой линии активирует SPI устройство, в то время как высокий уровень деактивирует этот интерфейс. На рисунке 2.1 показана система с одним ведущим и несколькими ведомыми устройствами, на микроконтроллере AVR, сконфигурированном в режиме ведущего и линией SS, сконфигурированной как выход. Количество ведомых устройств, которые можно подключить к системе, ограничено только количеством линий ввода/вывода, которые можно задействовать под генерирование сигнала выбора ведомого.

Система с несколькими ведомыми

Рисунок 2.1 Система с несколькими ведомыми

Возможность подключения нескольких устройств к одной шине SPI основана на том, что одновременно могут взаимодействовать между собой только одно ведущее и только одно ведомое устройство. Линии MISO, MOSI и SCK всех остальных ведомых устройств находятся в третьем состоянии (сконфигурированы как входы с высоким импедансом с отключенными подтягивающими резисторами). Следует избегать некорректной реализации (например, когда активно более одного ведомого устройства одновременно), которая может привести к конфликту, в результате которого может произойти защелкивание CMOS. Чтобы избежать защелкивания можно применить резисторы номиналом от 1 до 10 килоом, подключив их последовательно выводам SPI. Однако это сказывается на максимальной скорости передачи данных, так как возрастает емкость на выводах интерфейса.

Для однонаправленных устройств SPI требуется линия с тактовым сигналом и одна линия данных. Какую из линий использовать, MISO или MOSI, зависит от назначения устройства. Например, простые датчики только передают данные (смотри устройство S2 на рисунке 2.1), а цифро-аналоговые преобразователи, как правило, только принимают данные (смотри устройство S3 на рисунке 2.1).

2.4 Временные диаграммы SPI

SPI имеет четыре режима работы, нумеруемые в этом документе от 0 до 3. Эти режимы главным образом контролируют способ тактирования ввода/вывода SPI. Настройка осуществляется двумя битами в регистре управления SPI (SPCR). Полярность тактовых импульсов определяется битом CPOL, который позволяет установить в качестве активного уровня высокий или низкий. Бит выбора фазы тактовых импульсов (CPHA) позволяет выбрать один из двух принципиально разных форматов передачи данных. Для обеспечения надлежащей связи между ведущим и ведомым оба устройства должны работать в одинаковых режимах. Это условие может потребовать перенастройку ведущего устройства согласно требованиям различных ведомых устройств.

Биты CPOL и CPHA определяют различные режимы SPI, приведенные в таблице 2.3. Поскольку эти режимы не стандартизированы и по разному называются в другой литературе, к инициализации SPI следует подходить особенно тщательно.

Таблица 2.3 Настройка режимов SPI

Режим SPI CPOL CPHA Фронт сдвига Фронт захвата
0 0 0 Нисходящий Восходящий
1 0 1 Восходящий Нисходящий
2 1 0 Восходящий Нисходящий
3 1 1 Нисходящий Восходящий

Полярность тактовых импульсов не влияет на формат передачи данных. Переключение этого бита приводит к инвертированию тактового сигнала (был активным высокий уровень, станет низкий). А вот установка фазы тактовых импульсов выбирает один из двух различных таймингов передачи данных, которые более подробно описаны в следующих двух главах. В этих главах подразумевается, что линии MOSI и MISO ведущего устройства подключены к соответствующим линиям ведомого устройства. На каждой временной диаграмме приводятся данные как для ведущего, так и для ведомого устройства. Линия SS ведомого устройства выполняет функцию выбора ведомого устройства. Состояние линии SS для ведущего устройства на временных диаграммах не показано. Она должна быть настроена как выход, или, если она настроена как вход, на ней должен постоянно присутствовать высокий логический уровень.

2.5 A.) CPHA = 0, CPOL = 0 (режим 0) и CPHA = 0, CPOL = 1 (режим 1)

Временная диаграмма передачи данных для SPI в случае, если бит CPHA равен нулю, показана на рисунке 2.2. Для линии SCK приведено два графика, один для случая, когда бит CPOL равен нулю, второй для CPOL, равного единице.

Формат передачи данных для CPHA = 0

Рисунок 2.2 Формат передачи данных для CPHA = 0

Когда SPI настроен на работу в режиме ведомого, передача начинается в момент падения уровня на линии SS. Это активирует интерфейс SPI ведомого устройства и выводит самый старший бит байта, находящегося в регистре данных SPI (SPDR), на линию MISO. Фактически, передача данных начинается после записи программой ведущего устройства данных в регистр SPDR. Это сопровождается генерированием тактовых импульсов. В случае, когда бит CPHA равен нулю, сигнал SCK остается нулевым в течении первой половины первого цикла SCK (смотри рисунок 2.2). Это гарантирует, что данные на входных линиях как ведущего, так и ведомого устройства стабилизировались. Данные с входных линий считываются по фронту импульса на линии SCK при переходе из неактивного состояния в активное (восходящий фронт, если бит CPOL сброшен, нисходящий фронт, если бит CPOL установлен). Фронт импульса на линии SCK при переходе из активного состояния в неактивное (нисходящий фронт, если бит CPOL сброшен, восходящий фронт, если бит CPOL установлен) вызывает сдвиг передаваемых данных на один бит и вывод данных на линии MOSI и MISO.

После восьми тактов передача завершается. В обоих устройствах, в ведущем и в ведомом, устанавливается флаг генерации прерывания SPI (SPIF), а полученные данные пересылаются во входной буфер.

2.6 B.) CPHA = 1, CPOL = 0 (режим 2) и CPHA = 1, CPOL = 1 (режим 3)

Временная диаграмма передачи данных для SPI в случае, если бит CPHA равен единице, показана на рисунке 2.3. Для линии SCK приведено два графика, один для случая, когда бит CPOL равен нулю, второй для CPOL, равного единице.

Как и в предыдущем случае, ниспадающий фронт линии SS выбирает и активирует SPI ведомого устройства. В отличие от предыдущего случая, где бит CPHA сброшен, на этой стадии передача еще не начинается и ведомое устройство не выводит на линию MISO самый старший бит передаваемых данных.

Формат передачи данных для CPHA = 1

Рисунок 2.3 Формат передачи данных для CPHA = 1

Фактическая передача данных начинается после записи программой ведущего устройства данных в регистр SPDR, что повлечет за собой генерирование тактовых импульсов. Первый фронт сигнала SCK при переходе из неактивного состояния в активный (восходящий фронт, если бит CPOL сброшен, нисходящий фронт, если бит CPOL установлен) приводит к выводу на линии самого старшего бита из регистра данных SPDR как ведущим, так и ведомым устройством. Как показано на рисунке 2.3, задержка в половину цикла SCK отсутствует (в отличие от режимов 0 и 1). Уровень на линии SCK изменяется сразу после начала цикла SCK. Данные с входных линий считываются по фронту импульса на линии SCK при переходе из активного состояния в неактивное (нисходящий фронт, если бит CPOL сброшен, восходящий фронт, если бит CPOL установлен).

После восьми тактов передача завершается. В обоих устройствах, в ведущем и в ведомом, устанавливается флаг генерации прерывания SPI (SPIF), а полученные данные пересылаются во входной буфер.

2.6.1 Соображения по поводу высокоскоростной передачи

Устройства, работающие с высокой частотой системного тактового генератора способны взаимодействовать с модулями SPI на скорости до половины частоты системного тактового генератора. При этом требуется соблюдать особые временные задержки, совпадающие на ведущем и ведомом устройствах. Следующие две диаграммы показывают распределение по времени для двух микроконтроллеров AVR, один из которых работает в режиме ведущего, второй в режиме ведомого, а в качестве режима SPI выбран режим 0 и 1. Точные значения времени, указанные на диаграммах, зависят от конкретного устройства и не рассматриваются в этом документе. Тем не менее принцип функционирования, рассмотренный ниже, применим для всех устройств.

Временная диаграмма для режима ведущего

Рисунок 2.4 Временная диаграмма для режима ведущего

Минимальное время тактового сигнала состоит из времен «1» и «2». Значение «1» определяет период сигнала SCK. Значение «2» определяет длительность высокого/низкого логического уровня тактового сигнала. Максимальное время восходящего и нисходящего фронта определяется значением «3». Это основное значение, которое необходимо проверить при сопряжении микроконтроллера AVR с ведомым устройством.

Важными так же являются время стабилизации «4» и время выдержки «5». Эти значения определяют, за какое время до фронта тактового импульса ведомое устройство должно вывести на линию валидные данные и как долго эти валидные данные должны оставаться на линия после фронта тактового импульса.

Время «6» (Out to SCK) определяет, за какое минимальное время до фронта такового импульса ведущее устройство установит валидные данные. Это время должно быть сравнимо со временем стабилизации «4» ведомого.

Время «7» (SCK to Out) определяет максимальное время, в течении которого микроконтроллер AVR должен вывести следующий бит данных. А время «8» (SCK to Out high) определяет минимальный временной интервал, в течении которого на линии MOSI будет оставаться валидный последний бит данных до того, как SPI вернется в ждущее состояние.

В принципе, диаграмма состояний для режима ведомого аналогична рассмотренной выше диаграмме состояний для режима ведущего. Так как теперь ведущий и ведомый поменялись ролями, требования к временным интервалам так же поменялись местами. Минимальные временные интервалы для режима ведущего здесь является максимальными, и наоборот.

Временная диаграмма для режима ведомого

Рисунок 2.5 Временная диаграмма для режима ведомого

2.7 Конфликты при передаче через SPI

Коллизии записи возникают в том случае, если во время передачи данных была произведена запись в регистр SPDR. В связи с тем, что этот регистр имеет одинарную буферизацию при передаче, запись в регистр SPDR во время передачи данных привела бы к тому, что вновь записанные в него данные попадут непосредственно в сдвигающий регистр SPI. Поскольку такая операция записи могла бы повредить передаваемые в текущий момент данные, генерируется ошибка «коллизия записи» путем установки бита WCOL регистра SPSR. При этом операция записи в регистр выполнена не будет, а начатая ранее передача данных через SPI будет продолжена как ни в чем не бывало.

Коллизии записи, как правило, возникают на ведомом устройстве, так как ведомое устройство не контролирует момент начала передачи. А вот ведущее устройство знает, когда идет передача данных. В связи с этим, ведущее устройство не должно создавать коллизий записи, хотя логика SPI позволяет обнаружить эту ошибку как в режиме ведущего, так и в режиме ведомого.

2.8 Эмуляция SPI

При эмулировании SPI с использованием аппаратного эмулятора ICE200 необходимо учитывать, что периферия на этом эмуляторе не останавливается на точках останова, а продолжает работать с той же скоростью.

При эмулировании SPI с использованием аппаратного эмулятора ICEPRO временные задержки могут быть менее точными, чем на реальном устройстве. Это вызвано более длинными внутренними сигнальными линиями ICEPRO, что является платой за гибкость и возможность модернизации.

2.9 Инициализация SPI

Конфигурирование SPI в режиме ведущего показано на двух примерах. В первом примере реализовано управление взаимодействием через SPI с использованием опроса флагов прерываний. Во втором примере показана реализация управления взаимодействием через SPI с использованием прерываний.

Взаимодействие между двумя устройствами AVR показано на примере пересылки строки «Text String» от устройства, сконфигурированного как ведущее к устройству, сконфигурированному как ведомое. Полученные символы сравниваются с ожидаемыми, а результат теста выводится в порт D. Эти примеры отлично подходят для реализации на двух отладочных платах, таких как STK500.

Во всех приведенных здесь примерах SPI сконфигурирован для работы в режиме 0 с передачей самого старшего бита первым. Это достигается установкой битов CPOL, CPHA и DORD регистра SPCR в ноль. С помощью этого же регистра включается SPI путем установки бита SPE. Частота SCK определена как CK/4 для первого примера и для второго примера на ассемблере. Для второго примера на языке C эта частота определена как CK/16.

При сравнении конфигураций SPI в разных примерах основное внимание следует уделять значению бита MSTR (выбор режима ведущий/ведомый) и значению бита включения прерываний SPI (SPIE).

Примечания!

  1. Так как оба примера демонстрируют передачу данных между одним ведущим и одним ведомым, проверка перед каждой передачей данных того, что бит MSTR установлен, не производится. Эта проверка требуется для систем с несколькими ведущими.
  2. Несмотря на то, что установка бит выбора тактовой частоты в ведомом режиме не имеет эффекта, она гарантирует, что частота системного генератора (CK) ведомого устройства по крайней мере в четыре раза выше тактовой частоты SPI (SCK).
  3. Необработанные прерывания SPI очищаются путем обращения к регистрам SPSR и SPDR.

Два файла, приложенных к этому документу, содержат исходный код для приведенных примеров на языке программирования C.

Для запуска этого кода подключите две отладочные платы STK500 как показано на рисунке 2.6. Этот код написан для микроконтроллера ATmega162, однако может быть скомпилирован под любой микроконтроллер, имеющий аппаратный SPI, PORTA, PORTB и PORTD.

Подключение оборудования

Рисунок 2.6 Подключение оборудования

2.9.1 Пример 1 — Взаимодействие с SPI методом опроса

2.9.1.1 Сторона ведущего

Если прерывания использовать не планируется, необходимо сконфигурировать модуль SPI и соответствующие выводы. В данном случае важно настроить линию SS как выход. Это необходимо сделать до включения SPI в режиме ведущего. В противном случае модуль SPI может мгновенно переключиться в режим ведомого (если на линии SS окажется низкий уровень). В случае работы SPI в режиме ведомого эта линия всегда должна быть настроена как вход (смотри рисунок 2.7). Использование метода опроса позволяет получить более быстрое взаимодействие с SPI. По этой причине метод опроса наиболее часто используют в режиме ведущего.

Опрашивающий ведущий — инициализация Опрашивающий ведущий — передача

Рисунок 2.7 Опрашивающий ведущий — инициализация и передача

2.9.1.2 Сторона ведомого

При инициализации AVR в режиме ведомого порядок инициализации регистров не имеет значения. Линия MISO должна быть определена как выход, а все остальные линии будут сконфигурированы автоматически при включении SPI (смотри таблицу 2.8). Для перевода SPI в режим ведомого необходимо присвоить биту MSTR значение ноль. В этом случае биты выбора тактовой частоты SPR0 и SPR1 игнорируются, так как передача ведется синхронно.

Остальные настройки конфигурационного регистра SPI (SPCR) аналогичны настройкам в ведущем режиме. Этого достаточно для успешного взаимодействия между двумя устройствами.

Опрашивающий ведомый — инициализация Опрашивающий ведомый — передача

Рисунок 2.8 Опрашивающий ведомый — инициализация и передача

2.9.2 Пример 2 — Взаимодействие с SPI через прерывания

В режиме ведущего взаимодействие с SPI через прерывания имеет смысл в том случае, если тактовая частота SCK генерируется путем деления частоты системного тактового генератора на большой коэффициент (например, 64 или 128). В этом случае процессор может выполнять другие вычисления, а не ждать приема/передачи следующего байта. В режиме ведомого устройство не знает, когда была начата передача данных, а реализация взаимодействия с SPI через прерывания гарантирует, что устройство отреагирует своевременно и коллизий записи не возникнет.

2.9.2.1 Сторона ведущего

Инициализация SPI происходит аналогично предыдущему примеру. Так же, как и в предыдущем примере, в режиме ведущего сначала линия SS настраивается как выход, и только потом включается SPI. Прерывания SPI включаются путем установки бита SPIE регистра SPCR.

Управляемый прерываниями ведущий — инициализация Управляемый прерываниями ведущий — инициализация и передача Управляемый прерываниями ведущий — передача

Рисунок 2.9 Управляемый прерываниями ведущий — инициализация и передача

2.9.2.2 Сторона ведомого

Ведомый не знает, когда ведущий начнет новую передачу. Прерывания являются отличным способом для обработки подобных неопределенных событий, а так же это стандартный способ для реализации SPI в режиме ведомого.

В этом примере основная программа оповещается об ошибках передачи и завершении передачи.

Управляемый прерываниями ведомый — инициализация Управляемый прерываниями ведомый — передача Управляемый прерываниями ведомый — инициализация и передача

Рисунок 2.10 Управляемый прерываниями ведомый — инициализация и передача

Tags: 
AVR, SPI