Функционирование вывода SS
Подчиненный режим. После перевода SPI в режим подчиненного вывод SS всегда работает как вход. В этом случае SPI активизируется, если на вход SS подать низкий уровень, а вывод MISO становится выходом, если так установит пользователь. Все остальные выводы работают как входы. Если на вход SS подать высокий уровень, то все выводы станут входами и SPI перейдет в пассивное состояние, в котором блокируется прием входящих данных. Обратите внимание, что логика SPI сбрасывается, как только на вывод SS подается высокий уровень.
Вывод SS удобно использовать для пакетной/байтной синхронизации, что позволяет поддержать синхронность работы подчиненного счетчика бит и ведущего генератора синхронизации. Если на вывод SS подать высокий лог. уровень, то подчиненный SPI сбросит передающую и приемную логику и потеряет любые не полностью принятые данные в сдвиговом регистре.
Ведущий режим. Если SPI настроен как мастер (установлен бит MSTR в SPCR), то пользователь может задать желаемое направление вывода SS.
Если SS настроен на вывод, то он работает как обычная линия цифрового вывода и не оказывает влияния на систему SPI. Обычно он используется для управления выводом SS подчиненного SPI.
Если SS настроить как вход, то на нем должен присутствовать высокий логический уровень, чтобы гарантировать работу ведущего SPI. Если SPI настроен как мастер, у которого вывод SS настроен как вход, то подача на этот вход низкого уровня внешней схемой будет интерпретирована как перевод в подчиненный режим по запросу другого ведущего SPI, после чего начнется передача данных. Для того чтобы избежать конфликтной ситуации система SPI выполняет следующие действия:
1. SPI переводится в подчиненный режим сбросом бита MSTR в регистре SPCR. В результате SPI становится подчиненным, а MOSI и SCK конфигурируются как входы.
2. Устанавливается SPIF в SPSR и, если разрешено прерывание SPI и установлен бит I в регистре SREG, то выполняется процедура обработки прерывания.
Таким образом, если используется передача SPI в режиме мастера с управлением по прерываниям и предусмотрена возможность подачи низкого уровня на вход SS, то при генерации прерывания необходимо всегда проверять состояние бита MSTR. Если MSTR оказался сброшенным, то это означает, что SPI был переведен в подчиненный режим внешним устройством и пользователь должен предусмотреть возобновление ведущего режима SPI программным путем.
Регистр управления SPI - SPCR
Разряд | ||||||||
SPIE | SPE | DORD | MSTR | CPOL | CPHA | SPR1 | SPR0 | |
W/R | W/R | W/R | W/R | W/R | W/R | W/R | W/R | W/R |
Исходное значение |
Бит 7 – SPIE. Разрешение прерывания SPI. Если установлен флаг SPIF в регистре SPSR и установлен бит общего разрешения прерываний I в регистре SREG, то установка данного бита приведет к исполнению процедуры обработки прерывания по SPI.
Бит 6 – SPE. Разрешение SPI. Если в SPE записать 1, то разрешается работа SPI. Данный бит должен быть установлен, если необходимо использовать SPI независимо от того в каком режиме он будет работать.
Бит 5 – DORD. Порядок сдвига данных. Если DORD=1, то при передаче слова данных первым передается младший разряд. Если же DORD=0, то первым передается старший разряд.
Бит 4 – MSTR. Выбор ведущего/подчиненного. Если в данный бит записана 1, то SPI работает как ведущий (мастер), иначе (MSTR=0) как подчиненный. Если SS настроен как вход и к нему приложен низкий уровень, когда MSTR был равен 1, то бит MSTR автоматически сбрасывается и устанавливается флаг прерывания SPIF в регистре SPSR. Для возобновления ведущего режима SPI пользователь должен предусмотреть программную установку бита MSTR.
Бит 3 – CPOL. Полярность синхронизации. Если данный бит равен 1, то SCK имеет высокий уровень в состоянии ожидания. Если CPOL=0, то SCK имеет низкий уровень в состоянии ожидания (табл. 2.49).
Таблица 2.49. Результат действия CPOL
CPOL | Передний фронт | Задний фронт |
Нарастающий | Спадающий | |
Спадающий | Нарастающий |
Бит 2 – CPHA. Фаза синхронизации. Значение бита фазы синхронизации (CPHA) определяет по какому фронту SCK происходит выборка данных: по переднему или заднему (рис. 2.50).
Таблица 2.50. Результат действия бита CPHA
CPHA | Передний фронт | Задний фронт |
Выборка | Установка | |
Установка | Выборка |
Биты1, 0 - SPR1, SPR0. Биты 1 и 0 выбора частоты синхронизации SPI. Данные биты задают частоту синхронизации на выводе SCK в режиме мастера. SPR1 и SPR0 не оказывают никакого влияния в режиме подчиненного. Связь между частой SCK и частотой генератора синхронизации fosc показана в табл. 2.51.
Таблица 2.51. Связь между частотами SCK и генератора
SPI2X | SPR1 | SPR0 | Частота SCK |
fosc /4 | |||
fosc /16 | |||
fosc /64 | |||
fosc /128 | |||
fosc /2 | |||
fosc /8 | |||
fosc /32 | |||
fosc /64 |
Формат регистра статуса SPI - SPSR
Разряд | ||||||||
SPIF | WCOL | - | - | - | - | - | SPI2X | |
W/R | R | R | R | R | R | R | R | W/R |
Исходное значение |
Бит 7 – SPIF. Флаг прерывания по SPI. Флаг SPIF устанавливается по завершении последовательной передачи. Прерывание генерируется в том случае, если установлен бит SPIE в регистре SPCR и разрешено общее прерывание. Если SS настроен как вход и к нему приложен низкий уровень, то, если SPI находился в режиме мастера, также установится флаг SPIF. SPIF сбрасывается аппаратно при переходе на соответствующий вектор прерывания. Альтернативно, бит SPIF сбрасывается при первом чтении регистра статуса SPI с установленным флагом SPIF, а также во время доступа к регистру данных SPI (SPDR).
Бит 6 – WCOL. Флаг повторной записи. Бит WCOL устанавливается, если выполнена запись в регистр данных SPI (SPDR) во время передачи данных. Бит WCOL (а также бит SPIF) сбрасывается при первом чтении регистра статуса SPI с установленным WCOL, а также во время доступа к регистру данных SPI.
Биты 5..1 – Res. Зарезервированные биты. В ATmega128 данные биты не используются и всегда считываются как 0.
Бит 0 - SPI2X. Удвоения скорости SPI. При установленном бите скорость работы SPI (частота SCK) удвоится, если SPI находится в режиме мастера. Это означает, что минимальный период SCK будет равен двум периодам синхронизации CPU. Если SPI работает как подчиненный, то работа SPI гарантирована только на частоте fosc/4 или менее.
Регистр данных SPI – SPDR.
Разряд | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
W/R | W/R | W/R | W/R | W/R | W/R | W/R | W/R | W/R |
Исходное значение | x | x | x | x | x | x | x | x |
Регистр данных SPI имеет доступ на чтение и запись и предназначен для обмена данными между файлом регистров (r0…r31) и сдвиговым регистром SPI. Запись в данный регистр инициирует передачу данных. При чтении данного регистра фактически считывается содержимое приемного буфера сдвигового регистра.
Режимы передачи данных. Комбинация бит CPHA и CPOL задает четыре возможных режима последовательной передачи данных. Форматы передачи данных для SPI представлены в таблице 2.52. Биты данных выводятся сдвигом и фиксируются на входе противоположными фронтами синхросигнала SCK, тем самым, гарантируя достаточное время на установление сигналов данных.
Таблица 2.52. Функциональные возможности CPOL и CPHA
Передний фронт | Задний фронт | Режим SPI | |
CPOL=0, CPHA = 0 | Выборка нарастающим фронтом | Установка данных падающим фронтом | |
CPOL = 0, CPHA = 1 | Установка данных нарастающим фронтом | Выборка падающим фронтом | |
CPOL = 1, CPHA = 0 | Выборка падающим фронтом | Установка данных нарастающим фронтом | |
CPOL = 1, CPHA = 1 | Установка данных падающим фронтом | Выборка нарастающим фронтом |