Интерфейс SPI

Рассмотрим особенности архитектуры современных микроконтроллерных систем, оснащенных последовательным периферийным интерфейсом SPI.

 

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

 

Обычно при аппаратной реализации интерфейса SPI он доступен программисту через четыре регистра SFR.

 

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

 

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

 

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

Отдельный сигнал выбора ведомого устройства NSS (Slave Select signal) используется для выбора ведомого устройства при осуществлении обмена данными.

 

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

Если интерфейс запрограммирован как ведущий, он может работать на максимальной скорости передачи данных (бит/с), равной половине тактовой частоты.

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

Подразумевается, что источником синхронизации в обоих случаях является системный генератор тактовой частоты.

 

Существует еще один особенный режим, когда ведущий должен только передавать данные ведомому (полудуплексный режим) и не должен принимать данные от ведомого.

В этом случае максимальная скорость передачи составляет одну четвертую от системной тактовой частоты при синхронном режиме работы.

 

Интерфейс SPI имеет четыре сигнальные линии - MOSI, MISO, SCK и NSS.

Линия MOSI (Master-Out, Slave-In) - выходная линия данных ведущего интерфейса и входная линия данных ведомого интерфейса. Из названия следует, что линия предназначена для передачи данных от ведущего (master) интерфейса (или узла сети) к ведомому (slave) интерфейсу (или узлу сети).

Линия MISO (Master-In, Slave-Out) - входная линия данных ведущего интерфейса и выходная линия данных ведомого.

Линия предназначена для передачи данных от ведомого интерфейса к ведущему. Данные передаются байтами побитно, начиная со старшего бита.

Следует помнить, что вывод MISO ведомого интерфейса находится в высокоимпедансном состоянии, если ведомый интерфейс не выбран по линии NSS.

Линия NSS (Slave Select) - линия выборки ведомого; предназначена для выборки (низким логическим уровнем) ведомого интерфейса ведущим.

Линия SCK (Serial Clock) - выходная линия тактовых импульсов ведущего узла и входная линия тактовых импульсов ведомого.

Используется для синхронизации передачи данных между ведущим и ведомым интерфейсами по линиям MOSI и MISO.

 

Интерфейс SPI содержит четыре SFR регистра:

• SPI0DAT - регистр данных;

• SPI0CKR - регистр управления скоростью;

• SPI0CFG - регистр конфигурации;

• SPI0CN - регистр управления шиной SPI.

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

 

FSCLK = 0,5хSYSCLK/(SPI0CKR+1).

 

Из приведенной формулы следует, что максимальная тактовая частота интерфейса SPI может быть равной половине системной тактовой частоты в режиме ведущего (мастера).

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

Третий регистр SPI0CFG содержит биты СКРНА (SPI Clock Phase) - управления фазой тактирования и СКРОL (SPI Clock Polarity) - управления полярностью тактирующих импульсов. Эти биты позволяют выбрать фазу и полярность импульсов тактирования.

 

В базовой версии сети на базе интерфейсов SPI только один интерфейс может быть ведущим.

Интерфейс устанавливается в режим ведущего установкой флага MSTEN (Master Enable Flag) - бита SPI0CN.1.

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

Ведущий интерфейс немедленно побитно сдвигает данные и выдает их на линию MOSI в сопровождении тактовых импульсов на линии SCK.

После завершения передачи устанавливается флаг SPIF (SPI0CN.7).

 

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

Длина передачи (число передаваемых битов) может быть задана битами SPIFRS в регистре конфигурации SPI0CFG (SPI Configuration Register).

 

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

Данные, полученные от ведомого интерфейса, заменяют данные в регистре данных ведущего интерфейса. Этот регистр дважды буферизирован на ввод, но не на вывод.

Если интерфейс SPI не настроен как ведущий, он будет работать в режиме ведомого.

 

Несмотря на то, что базовая версия интерфейса SPI разработана для микроконтроллерных систем с одним ведущим, возможен режим сети со многими ведущими.

В системе со многими ведущими ядро может определить, свободна ли шина, путем опроса флага SLVSEL (SPI0CN.2) перед тем, как установить флаг MSTEN (т.е. определить интерфейсу режим ведущего) и инициализировать обмен.

 

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

В базовом варианте интерфейса SPI регистр конфигурации SPI0CFG содержит также биты ВС2-ВС0 (SPI Bit Count), индицирующие номер текущего передаваемого бита и биты SPIFRS2-SPIFRS0 (SPI Frame Size), определяющие размер фрейма (длины передаваемого слова).

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

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

• MSTEN (Master Mode Enable) - бит разрешения режима ведущего;

• NSSIN (NSS Instantaneous Pin Input) - бит, индицирующий состояние входа NSS в момент чтения;

• RXBMT (Receive Buffer Empty) - бит, индицирующий, что регистр чтения пуст;

• SLVSEL (Slave Selected Flag) - бит состояния ведомого;

• SPIBSY (SPI Busy) - бит занятости интерфейса SPI, в некоторой степени заменяет биты SPI Bit Count базового интерфейса;

• SRMT (Shift Register Empty) - бит, индицирующий освобождение сдвигового регистра данных.

Приведенные биты позволяют диагностировать интерфейс при шинной организации системы со многими ведущими.

 

Четвертый регистр SPI0CN - регистр управления интерфейса SPI. Он имеет ряд битов управления, общих как для базовой, так и для расширенной версий:

• МОDF (Mode Fault Flag) - флаг ошибки режима, индицирующий несоответствие назначенного режима (бита ведущего MSTEN = 1) и состояния входа NSS = 0;

• RXOVRN (Receive Overrun Flag) - бит, индицирующий случай, при котором начат прием следующего байта при непрочитанном предыдущем, т. е. бит индицирует рассинхронизацию чтения;

• WCOL (Write Collision Flag) - флаг рассинхронизации записи, устанавливаемый в случае, если совершена попытка записи байта в регистр во время незавершенной передачи предыдущего байта;

• SPIF (SPI Interrupt Flag) - флаг прерывания интерфейса SPI, устанавливающийся аппаратно после завершения передачи;

• SPIEN (SPI Enable) - бит разрешения работы интерфейса SPI.

Кроме этого базовый интерфейс имеет ряд битов, которые в расширенном интерфейсе были переведены в регистр конфигурации SPI0CFG:

- ТХВSY (Transmit Busy Flag) - бит занятости, эквивалентный новому биту SPIBSY (SPI Busy),

а также биты SLVSEL и MSTEN (описание регистра конфигурации SPI0CFG выше).

 

Расширенный интерфейс SPI имеет конфигурирующие биты NSSMD1-NSSMD0 (Slave Mode Select) - биты выбора режима ведомого интерфейса:

- трехпроводный режим ведущего или ведомого;

- четырехпроводный режим ведомого или режим со многими ведущими (NSS всегда в режиме входа);

- четырехпроводный режим одного ведущего.

Таким образом, очевидно основное отличие расширенного интерфейса SPI от базового.

В расширенном варианте предусмотрена работа шины SPI в многоконтроллерном режиме, что выразилось в расширении средств диагностики ошибок и возможности управления сигналом NSS.

 

Основная архитектура шины SPI для базового варианта интерфейса приведена на рис. 1.

 

 

Рисунок 1

 

Это так называемая классическая четырёхпроводная структура.

Один ведущий в ней управляет несколькими (N) ведомыми.

Все ведомые подключены параллельно на линиях SCLK, MISO и MOSI шины SPI.

 

Выборка ведомого происходит с помощью одной из линий портов ввода-вывода, которая соединяется с входом NSS соответствующего ведомого.

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

 

В качестве периферийных микросхем может быть использован ряд современных микросхем, оснащенных интерфейсом SPI - таймеров реального времени RТС, аналого-цифровых преобразователей АDС, цифро-аналоговых преобразователей DАС, различных микросхем памяти и т. п.

 

6.3.2. Двунаправленный синхронный интерфейс I2C

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

 

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

Этот недостаток отсутствует у интерфейса I2C.

Он был первоначально разработан фирмой Philips в конце 1970-х годов специально для того, чтобы обеспечивать такой способ подключения периферийных устройств к микропроцессорам, который не требовал бы использования традиционных шин адреса, данных и управления, а кроме того, позволял бы нескольким микропроцессорам работать с одними и теми же периферийными устройствами (multimastering).

 

Интерфейс I2C использует всего две линии - они именуются SCL (Serial Clock) и SDA (Serial Data).

Первая предназначена для передачи синхроимпульсов (они формируются тем устройством, которое в настоящий момент передает данные), а вторая - для передачи самих данных и команд, управляющих этим процессом.

 

Обе линии имеют открытый коллектор (как и во многих других случаях, когда необходимо, чтобы к одной линии могло подключаться несколько различных устройств), поэтому требуют подключения "подтягивающих" рёзисторов сопротивлением 1-10 кОм.

 

В обмене информацией по шине I2C всегда принимают участие два устройства - ведущее (master, задатчик) и ведомое.

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

 

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

 

Рис. Подключение устройств к контроллеру I2C

 

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

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

 

Перед началом процесса передачи задатчик устанавливает напряжение низкого уровня сначала на линии SDA, а затем на линии SCL.

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

Затем начинается передача данных от ведущего устройства к ведомому (slave) или наоборот, но в любом случае источником синхроимпульсов является задатчик. Данные фиксируются приемником по заднему фронту синхроимпульсов.

 

В конце передачи ведущее устройство прекращает генерацию синхроимпульсов; в результате на линии SCL благодаря "подтягивающему" резистору устанавливается напряжение высокого уровня; после этого отключается передатчик, из-за чего устанавливается высокий уровень на линии SDA - иными словами, повторяется ситуация, обратная той, что наблюдалась перед началом передачи.

 

Передача данных производится начиная со старшего бита; при этом используются обычные логические уровни микросхем ТТЛ/КМОП.

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

Для этого приемник должен выставить на линии SDA сигнал низкого уровня.

Перед посылкой очередного бита сигнал низкого уровня действует на обеих линиях.

 

В некоторых случаях бит подтверждения передается высоким уровнем сигнала, даже если прием прошел успешно.

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

 

Минимальная скорость передачи по интерфейсу I2C ничем не ограничена. И передатчик, и приемник могут при необходимости замедлять процесс обмена на неопределенное время.

Задатчик делает это, удерживая сигнал низкого уровня на линии SCL после приема или передачи предыдущего бита.

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

Но существуют две максимальные скорости передачи.

В так называемом стандартном режиме это 100 Кбит/с (частота синхроимпульсов 100 кГц), а в быстром режиме - 400 Кбит/с (частота синхроимпульсов 400 кГц).

 

Формат команд, используемых для управления процессом передачи данных по интерфейсу I2C.

Адрес получателя данных задается семью битами.

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

 

Для того чтобы ведущими на шине могли быть различные устройства, необходим какой-либо протокол разрешения коллизий (конфликтов).

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

 

Конфликты разрешаются благодаря тому, что на линии с открытым коллектором подача сигнала высокого уровня реализуется на самом деле простым отключением активного устройства (вспомните о "подтягивающих" резисторах).

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