Интерфейс SPI
Последовательный периферийный интерфейс SPI разработан, как полнодуплексный четырехпроводный интерфейс с шинной конфигурацией подключаемых узлов (устройств) для систем с одним главным узлом. Первоначальная базовая версия интерфейса SPI позволяет подключать к одному главному (или ведущему - Master) узлу несколько ведомых (Slave) узлов через общую шину. Отдельный сигнал выбора ведомого устройства NSS (Slave Select signal) используется для выбора ведомого устройства при осуществлении с ним обмена данными. Интерфейс SPI любого микроконтроллера может быть запрограммирован для работы как в качестве ведущего, так и в качестве ведомого узла.
Если интерфейс запрограммирован как ведущий, он может работать на максимальной скорости передачи данных (бит/сек), равной половине тактовой частоты. Если интерфейс запрограммирован для работы в качестве ведомого, его максимальная скорость в полнодуплексном режиме равняется одной десятой тактовой частоты. Подразумевается, что источником синхронизации в обоих случаях является системный генератор тактовой частоты. Если ведущий интерфейс вырабатывает SCK, NSS и последовательные входные данные асинхронно, максимальная скорость передачи должна быть меньше одной десятой тактовой частоты. Существует еще один особенный режим, когда ведущий должен только передавать данные ведомому (полудуплексный режим), и не должен принимать данные от ведомого. В этом случае максимальная скорость передачи составляет одну четвертую от системной тактовой частоты, при синхронном режиме работы. Интерфейс 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) - выходная линия тактовых импульсов ведущего узла и входная линия тактовых импульсов ведомого узла. Линия SCK используется для синхронизации передачи данных между ведущим и ведомым интерфейсами по линиям MOSI и MISO. В базовой версии сети на базе SPI интерфейсов только один интерфейс может быть ведущим. Интерфейс устанавливается в режим ведущего установкой флага MSTEN (Master Enable Flag) - бита SPI0CN.l. Если интерфейс установлен в режим ведущего, то запись байта данных в регистр данных SPI0DAT приводит к началу передачи. Ведущий интерфейс немедленно побитно сдвигает данные и выдает их на линию MOSI в сопровождении тактовых импульсов на линии SCK. После завершения передачи устанавливается флаг SPIF (SPIOCN.7). Если разрешены прерывания, выдается соответствующее прерывание. Кроме того, интерфейс может быть запрограммирован на выдачу от одного до восьми битов для осуществления связи с SPI приборами, имеющими различную длину слова. Длина передачи (количество передаваемых битов) может быть задана битами SPIFRS в регистре конфигурации SPIOCFG.[2:0] (SPI Configuration Register). Выше уже отмечалось, что интерфейс может работать в полнодуплексном режиме, это означает, что возможна одновременная передача данных по линиям MOSI от ведущего к ведомому, и MISO от ведомого к ведущему. Данные, полученные от ведомого интерфейса, заменяют данные в регистре данных ведущего интерфейса. Этот регистр дважды буферизирован на ввод, но не на вывод. Т.е. если в регистр данных SPI0DAT производится попытка записи данных во время передачи предыдущего байта, устанавливается флаг WCOL (SPIOCN.6) и попытка записи игнорируется. Таким образом, текущая передача данных продолжается непрерывно. Чтение из регистра данных SPI0DAT приводит к чтению приемного буфера. Если прием не закончен, устанавливается флаг RXOVRN (SPIOCN.4). Новые данные не передаются в регистр чтения, пока предыдущий принятый байт не будет прочитан. Очевидно, что при задержке чтения принятых байтов может произойти потеря данных. Если SPI интерфейс на настроен, как ведущий, он будет работать в режиме ведомого.
Не смотря на то, что базовая версия интерфейса SPI разработана для микроконтроллерных систем с одним ведущим, возможен все же режим сети со многими ведущими. Флаг MODF (SPIOCN.5 - Mode Fault flag) устанавливается в логическую единицу, если интерфейс определен как ведущий (MSTEN=1) и вывод NSS переведен в низкий логический уровень, т.е. SPI интерфейс пытаются использовать в качестве ведомого. Если при этом установлен флаг MODF, биты MSTEN и SPIEN в регистре управления SPI стираются автоматически аппаратно, переводя интерфейс в автономное состояние. Таким образом, в системе с многими ведущими ядро может определить свободна ли шина путем опроса флага SLVSEL (SPI0CN.2) перед тем, как установить MSTEN флаг (т.е. определить интерфейсу режим ведущего) и инициализировать обмен. Итак, интерфейса SPI содержит всего четыре SFR регистра:
1. SPI0DAT - регистр данных;
2. SPI0CKR - регистр управления скоростью;
3. SPI0CFG - регистр конфигурации;
4. SPI0CN - регистр управления шиной SPI.
Первые два регистра, назначение которых очевидно из названия, не представляют особого интереса при рассмотрении архитектурных особенностей интерфейса. Единственное, что следует отметить, так это то обстоятельство, что код, записываемый в регистр SPI0CKR - управления скоростью, позволяет определить скорость работы интерфейса SPI (частоту тактовых импульсов F SCLK) по следующей формуле: F SCLK = 0.5 * SYSCLK / (SPI0CKR +1) Из приведенной формулы следует, что максимальная тактовая частота SPI интерфейса может быть равной половине системной тактовой частоты в режиме ведущего (мастера). В режиме ведомого скорость передачи интерфейса SPI определяется тактовой частотой ведущего интерфейса SPI, т.е. мастера. Третий регистр - регистра конфигурации интерфейса - SPI0CFG. Этот регистр содержит биты CKPHA (SPI Clock Phase) - управления фазой тактирования, и CKPOL (SPI Clock Polarity) - управления полярностью тактирующих импульсов. Эти биты позволяют выбрать фазу и полярность импульсов тактирования. Теперь уместно заметить, что кроме первоначального базового интерфейса PSI во многих современных микроконтроллерах используется также и расширенный интерфейс PSI. В базовом варианте интерфейса SPI регистр конфигурации SPI0CFG содержит также биты: BC2- BC0 (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. Он имеет ряд битов управления, общих как для базовой, так и для расширенной версий: MODF (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: TXBSY (Transmit Busy Flag) - бит занятости, - эквивалентен новому биту SPIBSY (SPI Busy); а также биты SLVSEL и MSTEN (смотри выше описание регистра конфигурации SPI0CFG). Расширенный интерфейс SPI имеет следующие конфигурирующие биты: NSSMD1- NSSMD 0 (Slave Mode Select) –биты выбора режима ведомого интерфейса: 3-хпроводный режим ведущего или ведомого; 4-хпроводный режим ведомого или режим с многими ведущими (NSS – всегда в режиме входа); 4-хпроводный режим одного ведущего. Таким образом, очевидно основное отличие расширенного интерфейса SPI от базового. В расширенном варианте предусмотрена работа шины SPI в многоконтроллерном режиме, что выразилось в расширении средств диагностики ошибок и возможности управления сигналом NSS.

Рис.1. Архитектура 4х–проводной SPI шины с одним ведущим и несколькими ведомыми
Частным случаем предыдущей архитектуры является так называемая 3х-проводная структура, приведенная на рис.2. Ее отличие состоит в том, что ведомая микросхема постоянно выбрана, и следовательно, необходимость в четвертой линии интерфейса SPI отсутствует.

Рис.2. Архитектура 3х-проводной SPI шины с одними ведущим и ведомым.
Расширенный интерфейс позволяет организовать двухпроцессорную 4х-проводную архитектуру, приведенную на рис.3. В этом случае каждый из двух узлов может выполнять роль ведущего. На практике такая архитектура используется достаточно редко, ввиду алгоритмической сложности диагностики состояний коллизий (конфликтов, вызванных одновременной передачей на шину двух ведущих узлов). Более широко распространена более простая в понимании и диагностике конфликтов, так называемая архитектура с 4х-проводной «перекрестной» выборкой, приведенная на рис.4. В этом случае для выборки каждого из узлов используется линия ввода/вывода другого узла, работающая только на вывод, а не на ввод/вывод, как в предыдущей структуре.

Рис.3. Архитектура 4х–проводной SPI шины с двумя ведущим
Рис.4. Архитектура 4х–проводной SPI шины с двумя ведущим и «перекрестной» выборкой
Первоисточник: О. Николайчук Схемотехника, 2005 год
