Прием посылок с 9 битами данных



 

Если используется передача 9 бит данных (UCSZ=7), то непосредственно перед чтением младшего байта из UDR необходимо считать значение 9-го бита данных RXB8 в регистре UCSRB. Данное правило также относится к флагам статуса FE, DOR и UPE: сначала опрашиваем состояние UCSRA, а только затем считываем данные из UDR. Данное ограничение связано с тем, что принимаемые данные буферизуются вместе с флагами статуса, поэтому, считывание регистра UDR приводит к изменению состояния приемного буфера FIFO и, следовательно, связанные со считанными данными биты TXB8, FE, DOR и UPE будут потеряны.

 

Ниже приведены примеры функций для организации приема 9 бит данных с флагами статуса.

 

Пример кода на Ассемблере (1)

USART_Receive:

; Ожидание окончания приема данных

sbis UCSRA, RXC

rjmp USART_Receive

; Опрос статусных бит и 9-го бита данных перед чтением данных из буфера

in r18, UCSRA

in r17, UCSRB

in r16, UDR

; Если ошибка, то возврат -1

andi r18,(1<<FE)|(1<<DOR)|(1<<UPE)

breq USART_ReceiveNoError

ldi r17, HIGH(-1)

ldi r16, LOW(-1)

USART_ReceiveNoError:

; Выделение 9-го бита данных перед выходом

lsr r17

andi r17, 0x01

ret

 

Пример кода на Си (1)

unsigned int USART_Receive( void )

{

unsigned char status, resh, resl;

/* Ожидание окончания приема данных */

while ( !(UCSRA & (1<<RXC)) );

/* Опрос статусных бит и 9-го бита данных перед чтением данных из буфера */

status = UCSRA;

resh = UCSRB;

resl = UDR;

/* Если ошибка, то возврат -1 */

if ( status & (1<<FE)|(1<<DOR)|(1<<UPE) )

return -1;

/* Выделение 9-го бита данных перед выходом */

resh = (resh >> 1) & 0x01;

return ((resh << 8) | resl);

}

 

Прим. 1: В примере предполагается, что подключен файл специфических заголовков. Для регистров ввода-вывода, которые расположены в области памяти расширенного ввода-вывода необходимо заменить инструкции "IN", "OUT", "SBIS", "SBIC", "CBI" и "SBI" на инструкции, осуществляющие доступ к расширенной памяти ввода-вывода. Обычно это инструкции "LDS" и "STS" в сочетании с "SBRS", "SBRC", "SBR" и "CBR".

 

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

 

Флаг и прерывание по завершению приема

 

Приемник УСАПП имеет один флаг, который индицирует состояние приемника.

Флаг завершения приема (RXC) сигнализирует о наличии несчитанных данных в приемном буфере. Данный флаг равен 1, если имеются несчитанные данные, и равен 0, если буфер приемника свободен (т.е. не содержит каких-либо несчитанных данных). Если приемник отключается (RXEN = 0), то приемный буфер будет сброшен и флаг RXC примет нулевое значение.

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

 

Флаги ошибок приемника

Приемник УСАПП имеет три флага ошибок: ошибка посылки (кадра) FE, переполнение данных DOR и ошибка паритета UPE. Данные флаги входят в состав регистра UCSRA. Общим свойством данных флагов является то, что они хранятся в приемном буфере вместе с той посылкой данных, для которой они отражают состояние ошибок. С учетом этого, необходимо следить, чтобы флаги ошибок считывались из регистра UCSRA перед чтением данных из приемного буфера (UDR), т.к. после чтения из UDR изменяется состояние буфера. Другим сходством флагов ошибок является невозможность программно повлиять на их состояние. Однако, в целях совместимости с УСАПП последующих микроконтроллеров во время записи регистра UCSRA в позициях флагов ошибок необходимо указывать нулевые значения. Ни один из флагов ошибок не может вызвать прерывание.

Флаг ошибки посылки (кадра) FE индицирует состояние первого стоп-бита сохраненной в приемном буфере посылки. Флаг FE равен 0, если стоп-бит имел корректное значение (лог. 1), и равен 1, если некорректное, т.е. 0. Данный флаг может использоваться для выявления условия разсинхронизации, обрыва связи и манипуляции над протоколом связи. Флаг FE не изменяется при установке бита USBS в регистре UCSRC, т.к. приемник игнорирует все стоп-биты за исключением первого. Для совместимости с последующими микроконтроллерами в позиции данного бита необходимо указывать 0 во время записи в регистр UCSRA.

Флаг переполнения данных (DOR) сигнализирует о потере данных из-за переполнения приемного буфера. Переполнение данных возникает, если приемный буфер заполнен (две посылки), в сдвиговом регистре ожидает считывания только что принятая посылка и обнаружен новый старт-бит. Если флаг DOR установлен, то значит одна или более последовательных посылок потеряны между последним и следующим считанными значениями из UDR. Для совместимости с будущими микроконтроллерами в позицию данного бита необходимо всегда записывать лог.0 во время записи в регистр UCSRA. Флаг DOR сбрасывается, если принятая посылка была успешно перемещена из сдвигового регистра в приемный буфер.

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

Отключение приемника

В отличие от передатчика, отключение приемника происходит незамедлительно. При этом, принимаемые данные будут потеряны. После отключения (т.е. когда RXEN =0) приемник далее не поддерживает альтернативные настройки вывода порта RxD. Приемный буфер FIFO сбрасывается после отключения приемника, следовательно, оставшиеся в нем данные будут потеряны.

Описание регистров УСАПП

Регистр данных УСАПП - UDRn

Разряд 7 6 5 4 3 2 1 0  
 

RXBn[7:0]

UDRn (чтение)
 

TXBn[7:0]

UDRn (запись)
Чтение/запись Чт./Зп. Чт./Зп. Чт./Зп. Чт./Зп. Чт./Зп. Чт./Зп. Чт./Зп. Чт./Зп.  
Исх. значение 0 0 0 0 0 0 0 0  

 

Буферные регистры данных передатчика и приемника УСАППn расположены по одному и тому же адресу в области ввода-вывода, обозначенной как регистр данных УСАППn или UDRn. Если выполнять запись по адресу регистра UDRn, то записываемые данные помещаются в буферный регистр данных передатчика TXBn. По аналогии, при чтении регистра UDRn извлекается содержимое буферного регистра данных приемника RXBn.

При использования 5-, 6- или 7-битных форматов данных передатчик игнорирует, а приемник устанавливает нулевые значения неиспользуемых разрядов.

Запись в буфер передатчика можно выполнять, если установлен флаг UDREn в регистре UCSRAn. Данные записанные в UDRn при сброшенном флаге UDREn будут игнорированы передатчиком УСАППn. Если выполнена запись в приемный буфер и при этом работа передатчика была разрешена, то после освобождения сдвигового регистра передатчик загрузит в него значение из буферного регистра. После этого выполняется передача данных на выводе TxDn. Приемный буфер организован как двухуровневый буфер FIFO (первый пришел - последний вышел). Буфер FIFO изменяет свое состояние, если выполнено чтение из приемного буфера. Вследствие такой организации буфера необходимо следить, чтобы по данному адресу не использовались инструкции "чтение-модификация-запись" (SBI и CBI). Также нужно быть внимательным при использовании инструкций тестирования бита (SBIC и SBIS), т.к. их выполнение может также изменить состояние буфера FIFO.


Дата добавления: 2018-05-13; просмотров: 250; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!