Раздел: Документация
0 ... 160 161 162 163 164 165 166 ... 195 писи в регистр UCSRA (UCSR/*A) сбрасывать соответствующие этим флагам биты записываемого значения в 0. Для индикации состояния приемника в модулях USART используется флаг прерывания «прием завершен» RXC (RXCaj) регистра UCSRA (UCSRajA). Этот флаг устанавливается в 1 при наличии в буфере приемника непрочитанных данных и сбрасывается в 0 при опустошении буфера (после считывания всех находящихся в нем данных). Выключение приемника осуществляется сбросом бита RXEN (RXENaj) регистра UCSRB (UCSRrtB). В отличие от передатчика, приемник выключается сразу же после сброса бита, а значит, кадр, принимаемый в этот момент, теряется. Кроме того, при выключении приемника очищается его буфер, т. е. теряются также все непрочитанные данные. При выключенном приемнике вывод RXD (RXDaj) может использоваться как контакт ввода/вывода общего назначения. Пример подпрограммы приема по интерфейсу USART приведен ниже. Как и в предыдущем примере, здесь используется опрос флага прерывания. Пример на ассемблере USART Receive: ; Ждать загрузки данных в буфер приемника sbis UCSRA, RXC гjmp USART Receive ; Прочитать 9-й бит данных и флаги состояния in rl8,UCSRA in rl7,UCSRB ; Прочитать младший байт данных in rl6,UDR ; В случае ошибки вернуть -1 andi rl8, (1«FE) I (l«DOR) I (1«UPE) breq no error ldi rl7,HIGH(-l) ldi rl8,LOW(-l) no error: ; Выделить 9-й бит данных lsr rl7 andi rl7,0x01 ret Пример на Си 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) I (1«D0R) I (1«UPE) ) return -1; /* Выделить 9-й бит данных */ resh = (resh»l) & 0x01; return ((resh«8) I resl); } Собственно прием всех битов кадра осуществляется по-разному, в зависимости от режима работы модуля. При работе модуля USART в синхронном режиме состояние вывода RXD (RXDaj) считывается по одному из фронтов сигнала ХСК (ХСКя). Если бит UCPOL (UCPOLaj) регистра UCSRC (UCSRajC) сброшен в 0, считывание состояния вывода происходит по спадающему фронту сигнала ХСК (XCK/z), если же установлен в 1 — по нарастающему фронту сигнала. Другими словами, считывание данных с вывода RXD (RXDaj) и их выдача на вывод TXD (TXDn) происходят по противоположным фронтам (см. Рис. 13.6). Для обеспечения приема в асинхронном режиме работы используются схемы восстановления тактового сигнала и данных. Схема восстановления тактового сигнала предназначена для синхронизации внутреннего тактового сигнала, формируемого контроллером скорости передачи, и кадров, поступающих на вывод RXD (RXDaj) микроконтроллера. Схема восстановления данных осуществляет считывание и фильтрацию каждого бита принимаемого кадра. Схема восстановления тактового сигнала осуществляет опрос входа приемника с целью определения старт-бита кадра. Частота опроса зависит от состояния бита U2X (ШХя) регистра UCSRA (UCSRuA). В обычном режиме (при ШХя = 0) частота опроса в 16 раз превышает скорость передачи данных, а в ускоренном режиме (при U2X = 1) — в 8 раз. Обнаружение изменения сигнала на выводе RXD (RXDa?) с лог. 1 (режим ожидания) на лог. О интерпретируется как возможное появление переднего фронта старт-бита. После этого в нормальном режиме проверяется значение 8-й, 9-й и 10-й выборок входного сигнала, а в ускоренном режиме — 4-й, 5-й и 6-й выборок (Рис. 13.7, а). Если значение хотя бы двух выборок из указанных равно лог. 1, старт-бит считается ложным (помеха), а приемник переходит к ожиданию следующего изменения входного сигнала с лог. 1 на лог. 0. В противном случае считается, что обнаружен старт-бит новой последовательности, с которым синхронизируется внутренний тактовый сигнал приемника. После этого начинает работать схема восстановления данных. Решение о значении принятого бита принимается также по результатам 8-й, 9-й и 10-й (4-й, 5-й и 6-й) выборок входного сигнала (Рис. 13.7, б). Состоянием бита считается логическое значение, которое было получено, по меньшей мере, в двух из трех выборок. Процесс распознавания повторяется для всех битов принимаемого кадра, включая первый стоп-бит. RxD Отсчет (U2X = 0) Отсчет (U2X = 1) JDLE Старт-бит Бит 0 t \М t tt t tJLLlt t t t t t t t t 001 234567 8 i 9 i 101 11 12 13 14 15 16 1 2 3 t t1 X777X t t t 1 0123 [T] Ш Ш 7812 Отсчет (U2X = 0) Отсчет (U2X=1) x /7-ЙбиТ X At 1t t tttttt t t t t t t 1 2 3 4 5 6 7 В I 9 i 101 11 12 13 14 15 16 1 t t ±tj~± t t t 123 Ш [T] [T] 781 6) Puc. 13.7. Распознавание битов кадра: a — старт-бит; б — остальные биты Из сказанного следует, что старт-бит нового кадра может передаваться сразу же после последней выборки, используемой для определения значения бита. В обычном режиме работы формирование старт-бита может начаться в момент А, а в ускоренном режиме — в момент В (Рис 13.8). Момент С, обозначенный на рисунке, определяет максимальную длительность стоп-бита. Отсчет (U2X = 0) Отсчет (U2X = 1) (В) Стоп-бит- А) нМ ! t t t ttttt t t 1 2 3 4 5 6 7 i 8 i 9 i 10 1 o>1 0/1 0>1 I I ± А А 1 0/1 (C) 0 ... 160 161 162 163 164 165 166 ... 195
|