ATmega328: USART в режиме SPI Печать
Добавил(а) microsin   

Основные возможности:

• Полный дуплекс, трехпроводный, синхронный обмен данными
• Работа только в режиме главного устройства (Master)
• Поддерживаются все 4 режима работы SPI (Mode 0, 1, 2 и 3)
• Можно передавать первым или младший (LSB), или старший (MSB) бит данных
• Работа с использованием очереди (двойная буферизация)
• Генератор скорости с высокой разрешающей способностью
• Работа на высокой скорости (fXCKmax = fCK/2)
• Гибкая система прерываний

Блок универсального синхронного и асинхронного приемника и передатчика USART (Universal Synchronous and Asynchronous serial Receiver and Transmitter) может работать в режиме, совместимом с master SPI.

Установка обоих бит UMSELn1:0 в лог. 1 разрешает работу USART в логике MSPIM (аббревиатура расшифровывается как Master SPI mode). В этом режиме работы управляющая логика SPI master получает прямое управление над аппаратурой USART. Эти аппаратные ресурсы включают регистры сдвига и буферы передатчика и приемника, а также генератор скорости (baud rate generator). Работа генератора бита четности и блока его проверки, а логика восстановления данных и тактов, логика управления RX и TX в этом режиме отключаются. Логика управления USART RX и TX заменяется общей логикой управления обменом SPI. Однако логика управления выводами и генерации прерываний идентична для обоих режимов работы (USART и SPI).

Адреса регистров I/O остаются для обоих режимов одинаковыми. Однако функциональность некоторых управляющих регистров при использовании MSPIM меняется.

На рисунке в качестве примера показаны ножки USART (RXD, TXD, XCK) микроконтроллера ATmega328P в корпусе DIP28, которые могут использоваться как SPI.

ATmega328 DIP28 SPI USART pinout

[Генерация тактов]

Логика генерации тактов создает базовую тактовую частоту для передатчика и приемника. Для режима USART MSPIM поддерживается использование только внутренней тактовой частоты и выдача выходного тактового сигнала наружу (т. е. работа только в режиме главного устройства, SPI master). В регистре направления DDRx бит для вывода XCKn (условно обозначим номер этого бита DDR_XCKn) должен быть установлен в лог. 1 (чтобы он работал как выход), чтобы корректно работал режим USART MSPIM. Желательно установить бит DDR_XCKn до разрешения работы USART в режиме MSPIM (т. е. до установки в лог. 1 битов TXENn и RXENn).

Генерация тактов в режиме MSPIM идентична режиму генерации тактов в USART synchronous master mode. Так что скорость (baud rat) или настройка UBRRn может быть вычислена по той же формуле, см. таблицу 21-1:

Таблица 21-1. Выражения для вычисления настройки регистра скорости (Baud Rate Register).

Режим
Выражение для
вычисления скорости
Выражение для вычисления
значения UBRRn
Синхронный, Master           fOSC
BAUD = -----------
       2*(UBRRn+1)
          fOSC
UBRRn = -------- - 1
         2*BAUD

Примечание: baud rate (скорость бит) определена в битах на секунду (bps).

BAUD Baud rate (в битах/сек, bps)
fOSC частота системного тактового генератора (System Oscillator clock frequency)
UBRRn содержимое регистров UBRRnH и UBRRnL (0-4095)

[Режимы фрейма данных SPI Data и диаграммы]

Имеются 4 комбинации фазы и полярности XCKn (используется в качестве сигнала SCK интерфейса SPI) по отношению к последовательным данным. Эти комбинации задают формат фрейма (режим 0, 1, 2 и 3), что определяется управляющими битами UCPHAn и UCPOLn. Диаграммы времени обмена данными показаны на рис. 21-1. Передаваемые биты данных выдвигаются наружу, и входные данные защелкиваются на приеме в противоположных перепадах тактов XCKn, гарантируя достаточное время для стабилизации данных. Функционал битов UCPOLn и UCPHAn суммарно показан в таблице 21-2. Обратите внимание, что если поменять эти биты во время происходящего обмена повредит формируемые и принимаемые фреймы данных.

Таблица 21-2. Как работают биты UCPOLn и UCPHAn.

UCPOLn UCPHAn SPI Mode Начальный перепад Завершающий перепад
0 0 0 Выборка сигнала (по нарастанию уровня) Установка сигнала (по спаду уровня)
0 1 1 Установка сигнала (по нарастанию уровня) Выборка сигнала (по спаду уровня)
1 0 2 Выборка сигнала (по спаду уровня) Установка сигнала (по нарастанию уровня)
1 1 3 Установка сигнала (по спаду уровня) Выборка сигнала (по нарастанию уровня)

AVR USART SPI UCPHAn UCPOLn data diagrams

Рис. 21-1. Диаграммы времени обмена данными для разных настроек UCPHAn и UCPOLn.

[Форматы фрейма данных]

Последовательный фрейм для режима MSPIM определяет передачу одного символа, состоящего из 8 бит данных. Режим USART MSPIM имеет 2 допустимых формата фрейма:

• 8-битные данные с первым старшим битом (MSB идет первым)
• 8-битные данные с первым младшим битом (LSB идет первым)

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

Биты UDORDn в регистре UCSRnC устанавливают формат фрейма, используемый USART в режиме MSPIM. Приемник и передатчик используют одну и ту же настройку. Обратите внимание, что смена установки в любом из этих битов повредят передаваемый и принимаемый в настоящий момент фреймы.

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

Инициализация USART MSPIM. USART в режиме MSPIM инициализируется перед тем, как может произойти любой обмен данными. Процесс инициализации обычно состоит из установки скорости (baud rate), установки режима главного устройства (установкой в лог. 1 бита DDR_XCKn), установки формата фрейма и разрешении передатчика и приемника. Незавимомо может работать только передатчик. Для функционирования USART с управлением по прерываниям во время процедуры инициализации должен быть сброшен флаг глобального разрешения прерываний (бит I в регистре SREG), чтобы временно запретить прерывания.

Примечание: чтобы гарантировать немедленную инициализацию выхода XCKn, регистр скорости (baud-rate register, UBRRn) должен быть обнулен в момент разрешения передатчика. В контрасте с нормальным режимом работы USART, регистр UBRRn должно быть записано нужное значение после того, как передатчик разрешен, но перед началом первой передачи. Установка UBRRn в ноль перед разрешением передатчика не обязательна, если инициализация выполняется сразу после сброса, потому что сброс автоматически обнуляет UBRRn.

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

Ниже даны простые примеры кода инициализации USART (на ассемблере и на C, с эквивалентным функционалом). Примеры подразумевают управление потоком данных по опросу (без использования прерываний). Скорость задается как параметр функции настройки. Для кода на ассемблере подразумевается, что параметр baud rate сохранен в регистровой паре r17:r16.

Пример кода на ассемблере:

USART_Init:
   clr r18
   out UBRRnH,r18
   out UBRRnL,r18
; Настройка ножки порта XCKn как выхода, разрешение режима Master:
   sbi XCKn_DDR, XCKn
; Установка режима MSPIM и режима 0 для данных SPI:
   ldi r18, (1 << UMSELn1)|(1 << UMSELn0)|(0 << UCPHAn)|(0 << UCPOLn)
   out UCSRnC,r18
; Разрешить приемник и передатчик:
   ldi r18, (1 << RXENn)|(1 << TXENn)
   out UCSRnB,r18
; Настройка baud rate.
; ВНИМАНИЕ: скорость (Baud Rate) должна быть установлена
; после разрешения передатчика!
   out UBRRnH, r17
   out UBRRnL, r18
   ret

Пример кода на языке C:

void USART_Init( unsigned int baud )
{
   UBRRn = 0;
   /* Настройка ножки порта XCKn как выхода, разрешение режима Master: */
   XCKn_DDR |= (1<<XCKn);
   /* Установка режима MSPIM и режима 0 для данных SPI: */
   UCSRnC = (1 << UMSELn1)|(1 << UMSELn0)|(0 << UCPHAn)|(0 << UCPOLn);
   /* Разрешить приемник и передатчик: */
   UCSRnB = (1 << RXENn)|(1 << TXENn);
   /* Настройка baud rate.
      ВНИМАНИЕ: скорость (Baud Rate) должна быть установлена
      после разрешения передатчика! */
   UBRRn = baud;
}

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

Для регистров ввода/вывода, находящихся в расширенной области адресного пространства AVR (extended I/O map), инструкции IN, OUT, SBIS, SBIC, CBI и SBI должны быть заменены на инструкции, которые позволяют получить доступ в эту область. Обычно инструкции LDS и STS комбинируются с SBRS, SBRC, SBR и CBR.

[Обмен данными]

Использование USART в режиме MSPIM требует разрешения передатчика, т. е. бит TXENn в регистре UCSRnB установлен в лог. 1. Когда передатчик разрешен, обычная работа порта GPIO на выводе TxDn переназначается, и эта ножка становится выходом последовательных данных передатчика. Разрешение приемника является не обязательным, и это осуществляется установкой в лог. 1 бита RXENn в регистре UCSRnB. Когда приемник разрешен, обычное функционирование вывода порта GPIO на выводе RxDn переназначается, и этот вывод становится входом последовательных данных приемника. В обоих случаях сигнал XCKn будет использован как такты синхронизации обмена данными и для приемника, и для передатчика.

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

Примечание: чтобы поддерживать входной буфер в состоянии синхронности с количеством переданных байт данных, регистр UDRn должен быть прочитан при каждой отправке байта. Работа входного буфера идентична обычному режиму работы USART, т. е. если произойдет переполнение, то последний принятый символ будет потерян, в буфере не будут находиться данные, которые пришли первыми. Это означает, что если надо передать 4 байта, сначала байт 1, потом байты 2, 3 и 4, и регистр UDRn не был прочитан после завершения всех передач, то принятый байт 3 будет потерян, и не будет принят байт 1.

Следующие примеры кода показывают простой обмен данными через USART в режиме MSPIM, базируясь на опросе флага опустошения регистра данных (Data Register Empty, UDREn) и флага завершения приема (Receive Complete, RXCn). USART должен быть инициализирован перед использованием функции обмена. Для кода на ассемблере подразумевается, что данные для передачи сохраняются в регистре R16, и принятые данные доступны в том же самом регистре (R16) после возврата из функции.

Функция просто ждет, пока буфер передачи не опустошится, путем проверки флага UDREn, перед тем, как можно загрузить новые данные для передачи. Затем функция ждет появления данных в буфере приема, путем проверки флага RXCn, перед тем, как может быть прочитано из буфера принятое значение.

Пример кода на ассемблере:

USART_MSPIM_Transfer:
; Ожидание опустошения буфера передачи.
   in r16, UCSRnA
   sbrs r16, UDREn
   rjmp USART_MSPIM_Transfer
; Поместить данные (r16) в буфер для отправки данных:
   out UDRn,r16
; Ожидание принятых данных.
USART_MSPIM_Wait_RXCn:
   in r16, UCSRnA
   sbrs r16, RXCn
   rjmp USART_MSPIM_Wait_RXCn
; Получить и вернуть через R16 принятые данные:
   in r16, UDRn
   ret

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

Пример кода на языке C:

unsigned char USART_Receive( void )
{
   /* Ожидание опустошения буфера передачи. */
   while ( !( UCSRnA & (1 << UDREn)) );
   /* Поместить данные (r16) в буфер для отправки данных: */
   UDRn = data;
   /* Ожидание принятых данных. */
   while ( !(UCSRnA & (1 << RXCn)) );
   /* Получить и вернуть через R16 принятые данные: */
   return UDRn;
}

Флаги передатчика и приемника, и прерывания. Флаги RXCn, TXCn и UDREn, и соответствующие прерывания в режиме USART MSPIM идентичны из функционированию в обычном режиме USART. Однако флаги состояния ошибки приемника (receiver error status flags FE, DOR и PE) не используются и всегда читаются как 0.

Запрет передатчика или приемника. Запрет передатчика или приемника в режиме USART MSPIM идентичен запрету в обычном режиме функционирования USART.

[Сравнение AVR USART MSPIM и AVR SPI]

USART в режиме MSPIM полностью совместим с AVR SPI в следующих аспектах:

• Диаграммы сигналов режима Master.
• Функциональность бита UCPOLn идентична функционалу бита CPOL SPI.
• Функциональность бита UCPHAn идентична функционалу бита CPHA SPI.
• Функциональность бита UDORDn идентична функционалу бита DORD SPI.

Однако, поскольку режим USART MSPIM задействует ресурсы USART, то использование USART в режиме MSPIM несколько отличается в сравнении с режимом SPI. В дополнение к различиям в битах управляющих регистров, и в том, что в USART MSPIM возможна работа только как Master, также есть следующие отличия между режимами USART MSPIM и обычным SPI:

• USART MSPIM включает буферизацию передатчика (двойную). У SPI нет буфера.
• Приемник режима USART MSPIM включает дополнительный уровень буфера.
• Флаг SPI WCOL (Write Collision, коллизия записи) отсутствует в режиме USART MSPIM.
• Не поддерживается двойная скорость SPI (SPI2X). Однако того же самого эффекта можно достичь настройкой UBRRn.
• Время обработки прерывания отличается.
• Управление выводами отличается, поскольку в режиме USART MSPIM поддерживается только функционирование Master.

Сравнение выводов USART в режиме MSPIM и выводов SPI показано в таблице 21-3.

Таблица 21-3. Сравнение выводов USART MSPIM и SPI.

USART
MSPIM
SPI Комментарий
TxDn MOSI Только как выход режима Master
RxDn MISO Только как вход режима Master
XCKn SCK Функционал одинаковый
- ~SS Не поддерживается в режиме USART MSPIM

[Описание регистров]

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

Регистр данных USART.

AVR UDRn

Функция и описание бит регистра данных USART (UDRn) в режиме MSPIM идентичны работе USART в обычном режиме.

Регистр буфера передачи данных (USART Transmit Data Buffer Register) и регистр буфера приема данных (USART Receive Data Buffer Register) используют тот же самый адрес I/O, который называется регистром данных USART (USART Data Register, или UDRn). Регистр буфера передачи (Transmit Data Buffer Register, TXB) будет местом назначения данных, которые записаны по адресу регистра UDRn. Чтение по адресу регистра UDRn вернет содержимое регистра буфера приема данных (Receive Data Buffer Register, RXB).

Буфер передачи может быть записан только когда установлен флаг UDREn в регистре UCSRnA. Данные, записанные в UDRn, когда не установлен флаг UDREn, будут игнорироваться передатчиком USART. Когда данные записываются в буфер передачи, и разрешен передатчик, передатчик загрузит данные в данные в регистр сдвига передачи, когда регистр сдвига пуст. Тогда данные будут последовательно передаваться через вывод TxDn.

Буфер приема состоит из двухуровневого FIFO. FIFO будет менять свое состояние независимо от того, как происходит обращение к буферу приема. Из-за такого поведения буфера приема не используйте инструкции Read-Modify-Write (SBI и CBI) по адресу регистра UDRn. Будьте осторожны, когда используете инструкции проверки бит (SBIC и SBIS), поскольку они также будут менять состояние FIFO.

Регистр A управления и статуса USART.

AVR UCSRnA

Bit 7 – RXCn: USART Receive Complete

Этот бит флага устанавливается, когда имеются не прочитанные данные в буфере приема, и очищается, когда буфер приема пуст (т. е. когда в нем не содержится не прочитанных данных). Если приемник запрещен, то буфер приема сбрасывается и бит RXCn будет постоянно читаться как 0. Флаг RXCn может использоваться для генерации прерывания завершения приема (Receive Complete interrupt, см. описание бита RXCIEn).

Bit 6 – TXCn: USART Transmit Complete

Этот флаг устанавливается, когда полный фрейм в регистре сдвига передачи (Transmit Shift Register) выдвинулся наружу и в настоящий момент в буфере передачи (UDRn) нет новых данных для передачи. Флаг TXCn автоматически очищается, когда выполняется прерывание завершения передачи (transmit complete interrupt), или этот бит может быть очищен записью в него лог. 1. Флаг TXCn может генерировать прерывание завершения передачи (Transmit Complete interrupt, см. описание бита TXCIEn).

Bit 5 – UDREn: USART Data Register Empty

Флаг UDREn показывает, готов ли буфер передачи (UDRn) к получению новых данных. Если UDREn читается как лог. 1, то буфер передачи пуст, и таким образом готов к записи новых данных. Флаг UDREn может генерировать прерывание опустошения регистра данных (Data Register Empty interrupt, см. описание бита UDRIE). UDREn устанавливается после сброса, чтобы показать готовность передатчика.

Bit 4:0 – биты, зарезервированные в режиме MSPIM

Когда USART в режиме MSPIM, эти биты зарезервированы для будущего использования. Для совместимости с будущими моделями микроконтроллеров в эти биты нужно записать нули, когда записывается регистр UCSRnA.

Регистр B управления и статуса USART.

AVR UCSRnB

Bit 7 – RXCIEn: RX Complete Interrupt Enable

Запись этого бита в лог. 1 разрешает прерывание по флагу RXCn. Прерывание завершения приема (USART Receive Complete interrupt) будет генерироваться только если бит RXCIEn установлен в лог. 1, установлен в лог. 1 флаг глобального разрешения прерываний (Global Interrupt Flag, I-бит в регистре SREG), и установлен бит RXCn в регистре UCSRnA.

Bit 6 – TXCIEn: TX Complete Interrupt Enable

Запись этого бита в лог. 1 разрешает прерывание по флагу TXCn. Прерывание завершения передачи (USART Transmit Complete interrupt) будет генерироваться только если бит TXCIEn записан в лог. 1, установлен в лог. 1 флаг глобального разрешения прерываний (Global Interrupt Flag, I-бит в регистре SREG), и установлен бит TXCn в регистре UCSRnA.

Bit 5 – UDRIE: USART Data Register Empty Interrupt Enable

Запись этого бита в лог. 1 разрешает прерывание по флагу UDREn. Прерывание опустошения регистра данных (Data Register Empty interrupt) будет генерироваться только если записан в лог. 1 бит UDRIE, установлен в лог. 1 флаг глобального разрешения прерываний (Global Interrupt Flag, I-бит в регистре SREG), и установлен бит UDREn в регистре UCSRnA.

Bit 4 – RXENn: Receiver Enable

Запись этого бита в лог. 1 разрешает работу приемника USART в режиме MSPIM. Приемник, будучи разрешенным, переназначит обычное функционирование ножки порта для сигнала RxDn. Запрет приемника сбросит содержимое буфера приема. Если в режиме MSPIM разрешить только приемник (например установкой RXENn=1 и TXENn=0), то это не будет иметь никакого смысла, потому что только передатчик управляет формированием тактов бит, и поддерживается только функционирование Master.

Bit 3 – TXENn: Transmitter Enable

Запись этого бита в лог. 1 разрешает работу передатчика USART. Передатчик, будучи разрешенным, переназначит обычное функционирование ножки порта для сигнала TxDn. Запрет передатчика (запись в TXENn лог. 0) не будет эффективным, пока происходит текущая и отложенная передача, т. е. пока регистр сдвига передачи (Transmit Shift Register) и регистр буфера передачи (Transmit Buffer Register) содержат данные для передачи. Когда передатчик запрещен, он больше не будет переназначать поведение ножки порта TxDn.

Bit 2:0 – биты, зарезервированные в режиме MSPIM

Когда USART в режиме MSPIM, эти биты зарезервированы для будущего использования. Для совместимости с будущими моделями микроконтроллеров в эти биты нужно записать нули, когда записывается регистр UCSRnB.

Регистр C управления и статуса USART.

AVR UCSRnC

Bit 7:6 – UMSELn1:0: USART Mode Select

Эти биты выбирают режим работы USART, как показано в таблице 21-4 (описание работы USART в обычном режиме см. в даташите). Режим MSPIM разрешается, когда оба бита UMSELn установлены в лог. 1. Биты UDORDn, UCPHAn и UCPOLn могут быть установлены теми же самыми операциями записи, когда разрешается режим MSPIM.

Таблица 21-4. Настройки битов UMSELn.

UMSELn1 UMSELn0 Режим работы
0 0 Асинхронный USART
0 1 Синхронный USART
1 0 Зарезервировано
1 1 Master SPI (MSPIM)

Bit 5:3 – биты, зарезервированные в режиме MSPIM

Когда USART в режиме MSPIM, эти биты зарезервированы для будущего использования. Для совместимости с будущими моделями микроконтроллеров в эти биты нужно записать нули, когда записывается регистр UCSRnC.

Bit 2 – UDORDn: Data Order

Когда этот бит установлен в лог. 1, младший бит данных (LSB) будет передан первым. Когда этот бит сброшен в лог. 0, будет сначала передан старший бит данных (MSB). Для подробностей см. раздел, где описаны форматы фрейма.

Bit 1 – UCPHAn: Clock Phase

Настройка бита UCPHAn определяет, в какой момент будут считываться данные - по лидирующему перепаду тактов XCKn (начальный перепад), или по завершающему (последнему) перепаду XCKn. За подробностями обратитесь к описанию режимов данных в разделе "Режимы фрейма данных SPI Data и диаграммы".

Bit 0 – UCPOLn: Clock Polarity

Настройка бита UCPOLn определяет полярность тактов XCKn. Комбинации настроек бит UCPOLn и UCPHAn определяют, как передаются и принимаются данные по отношению к тактовому сигналу, т. е. используемый формат фрейма. За подробностями обратитесь к описанию режимов данных в разделе "Режимы фрейма данных SPI Data и диаграммы".

Пара регистров, отвечающих за настройку скорости передачи и приема.

AVR UBRRnL UBRRnH

Функция и описание этих бит в режиме MSPIM совпадает с описанием, когда USART работает в своих обычных режимах.

Bit 15:12 – зарезервировано

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

Bit 11:0 – UBRR[11:0]: USART Baud Rate Register

Эти биты определяют содержимое 12-битного регистра, который задает скорость передачи (USART baud rate). Регистр UBRRnH содержит 4 старших бита, и регистр UBRRnL содержит 8 младших бит скорости передачи USART. Если изменить значение этих бит "на лету", когда осуществляется текущая передача и прием фрейма, то эти фреймы будут испорчены. Запись в UBRRnL приведет к немедленному обновлению прескалера, определяющего скорость USART.

[Ссылки]

1. AVR151: настройка и использование SPI.
2. ATmega328: SPI.
3. Интерфейс SPI.