Реальные приемопередатчики UART являются более сложными устройствами, позволяющими, например, передавать данные различной разрядности, а также обеспечивающие обнаружение различных ошибок. При этом, разумеется, усложняется структура соответствующих регистров управления и состояния. Тем не менее в основе
Рис. 12.22.
Основными элементами модуля USART являются сдвиговые регистры приема и передачи, а также связанные с ними буферные регистры и регистры состояния, Для разрешения работы всего модуля USART необходимо установить бит SPEN регистра состояния приемника RCSTA (RCSTA[7]) в 1. Оба вывода RC6 и RC7, использующиеся соответственно для передачи и приема данных, должны быть сконфигурированы как входы[162].
Передача
Работа передатчика разрешается установкой бита TXEN регистра состояния передатчика TXSTA (TXSTA[5]). Для передачи слова данных необходимо записать его в регистр передатчика TXREG, откуда он будет перегружен в сдвиговый регистр и побитно передан с вывода ТХ. Если требуется работать с 9-битными данными, то битТХ9 (TXSTA[6]) должен быть установлен в 1, а девятый бит данных необходимо записать в 0-й бит того же регистра перед загрузкой младших восьми битов в регистр TXREG. Если сдвиговый регистр передачи не пуст, т. е. передача предыдущего слова еще не закончена, то новое значение останется в буфере TXREG и будет перегружено в сдвиговый регистр только после завершения передачи.
Первый бит регистра состояния TXSTA отображает состояние сдвигового регистра передатчика, тогда как флаг прерывания TXIF, расположенный в регистре PIR1, автоматически устанавливается в 1 при опустошении буфера TXREG (при его готовности к загрузке новых данных). Если это прерывание требуется в программе, необходимо установить соответствующий бит маски TXIE регистра PIE1 (PIE1 [4]); см Рис. 7.5 на стр. 223. Флаг ТХIF автоматически сбрасывается при записи в регистр TXREG, поэтому нет необходимости вручную обнулять его в процедуре опроса или в обработчике прерывания.
Прием
После обнаружения на выводе RX старт-бита последующие восемь или девять битов задвигаются в сдвиговый регистр приемника, откуда после завершения приема перегружаются в 2-уровневый буферный регистр RCREG, независимо от того, что в этот момент происходит в секции передатчика. Причем принятые данные сохраняются в регистре верхнего уровня, а содержимое последнего автоматически перегружается в регистр нижнего уровня при условии, что в нем отсутствуют данные, ожидающие считывания. При появлении в этом регистре данных устанавливается флаг прерывания от приемника RCIF, который может использоваться для генерации прерывания при установленном бите маски RCIE регистра PIE1 (а также установленных битах GIE и PEIE). При чтении регистра флаг RCIF автоматически сбрасывается. Если при этом в регистре верхнего уровня находились очередные данные, они перегружаются в регистр младшего уровня, и флаг RCIF устанавливается снова.
Если в момент приема очередного слова данных 2-уровневый буфер приемника окажется полон, то устанавливается флаг