При записи информация поступает в первый регистр (регистр передатчика TXB), а при чтении берется из другого (регистр приемника RXB). И при чтении, и при записи данных используется один регистр, что облегчает процесс программирования.
О том, что байт полностью пришел в регистр UDR, нам указывает прерывание по завершении приема, которое вызывается сразу же после того, как приемник обрабатывает все поступившие в него биты.
Так как передача идет медленно, то бездумно посылать новые данные в регистр UDR нельзя – необходимо дождаться окончания передачи предыдущего байта. О том, что UDR пуст и готов к приему нового байта сигнализирует бит UDRE, он же вызывает аппаратное прерывание по опустошению буфера.
Все настройки приемопередатчика хранятся в регистрах конфигурации UCSRA, UCSRB, UCSRC, скорость передачи данных задается регистровой парой UBRRH:UBRRL.
Регистр
UCSRxA
(USART
(s
– потому что еще и синхронным может
быть) Control
and
Status
Register)
RXCn (Receive Complete) и TXCn (Transmit Complete) – флаги прерывания по приему и передачи данных, соответственно. UDERn (USART Data Register Empty) – по опустошению данных (сигнализирует что регистр UDR пуст и в него можно записывать байт), сбрасывается он аппаратно после записи новой порции данных в UDR, при этом генерируется соответствующее прерывание.
RXCn устанавливается в единицу, когда принимаемый байт запишется в регистр UDR для последующего чтения, а TXCn – после прохождения последнего стоп-бита и отсутствия новых данных в регистре UDR, т.е. после окончания передачи всех битов. Также одновременно с этими влагами вызывается прерывание (если оно было разрешено). Сбрасываются эти флаги на аппаратном уровне – принимающий после чтения данных из регистра UDR, передающие при переходе на соответствующее прерывание, либо программным образом (запись логической единицы).
Следующие три бита – всякие проверки (мы их не используем). (Bit 4 - FE: Ошибка кадра. Данный бит устанавливается в состояние 1 при обнаружении условий ошибочного приема кадра, т.е. когда стоповый бит входящего символа в состоянии 0. Бит FE очищается при приеме стопового бита с логическим уровнем 1. Bit 3 - DOR: Переполнение данных. Бит DOR устанавливается в состояние 1 при обнаружении условий переполнения, т.е. когда байт уже находящийся в регистре UDR, не считан перед пересылкой нового байта из сдвигового регистра приема. Бит DOR буферирован, что означает, что он будет оставаться установленным, пока не будут считаны правильные данные из UDR. Бит DOR очищается (сбрасывается в 0) когда данные приняты и пересланы в UDR. Bits 2 - РЕ: Ошибка контроля четности. Бит РЕ устанавливается в 1, если данных, находящихся в буфере приемника, выявлена ошибка контроля четности. При отключенном контроле четности бит постоянно равен 0.)
Бит U2Xn (Double the USART Transmission Empty) – бит удвоения скорости передачи данных при работе в асинхронном режиме. Его надо учитывать при расчете значения в регистровой паре UBRRH:UBRRL.
MPCM: Режим мультипроцессорного обмена. Если флаг равен 1, то ведомый МК ожидает приема кадра, содержащего адрес. Кадры, не содержащие адреса устройства, игнорируются.
Регистр UCSRxB
Основную роль играют биты RXEN (Receiver Enable) и TXEN (Transmitter Enable) – при записи в них логической единицы осуществляется разрешение приема и передачи, соответственно. (лучше сразу все разрешить).
RXCIEn (RX Complete Interrupt Enable) – осуществляет разрешение прерывания по завершению приема данных.
TXCIE (TX Complete Interrupt Enable) – осуществляется разрешение прерывания по завершению передачи данных.
UDRIEn (UART DATA Register Empty Interrupt Enable) – осуществляется разрешение прерывания по опустошению регистра передачи данных UDR.
Следующий бит (UCSZn2,1,0) – один в регистре В, два других в С. Эти три бита определяют количество бит данных, которые мы передаем в нашем пакете (надо выставить так, чтобы передавали 8 бит). Оставшиеся биты если надо передать больше. (Bit 1 - RXB8: Прием 8-разрядных данных. Используется в 9 разрядных данных. Является девятым битом данных принятого символа. Этот разряд должен быть прочитан до прочтения данных UDR. Bit 0 - TXB8: Передача 8-разрядных данных. При использовании 9 разрядных посылок данных содержимое этого разряда является старшим разрядом передаваемого слова. Значение должно быть занесено в этот разряд до загрузки байта данных в регистр UDR.)
Регистр UCSRxC
В этом регистре мы выбираем необходимый протокол передачи данных.
UMSELn (UART Mode Select) – задаем формат передачи – синхронный или асинхронный (00 – асинхронный, 01 – синхронный, 11 – SPI).
UPMn1:0 (UART Parity Mode) – установка проверки на четность, по умолчанию в оба бита записаны логические нули, передача данных ведется без проверки на четность. (10 – четный, 11 – нечетные)
USBSn (UART Stop Bit Select) – определяет количество стоповых битов (0 – 1 стоповый бит, 1 – 2 стоповых бита).
UCSZn1:0 (UART Character Size) – уже упоминался выше. Определяет количество передаваемых битов данных – от 5 до 9.
UCSZn0 |
UCSZn1 |
UCSZn2 |
Количество бит |
0 |
0 |
0 |
5 |
0 |
0 |
1 |
6 |
0 |
1 |
0 |
7 |
0 |
1 |
1 |
8 |
1 |
1 |
0 |
зарезервировано |
1 |
1 |
1 |
9 |
UCPOLn – полярность нашего тактового сигнала (для синхронной передачи). Определяет момент выдачи и считывания данных на выводах модуля USART.
Скорость передачи данных
Регистровая пара UBRRH:UBRRL. Старший (H) использует всего 4 бита. Число разбиваем на две части и записываем в регистры.
Вычисляется по следующей формуле:
Нижняя для удвоенной скорости.
fOSC – тактовая частота, на которой работает наш мк (без предделителя и всего такого).
BAUD – требуемая скорость.
Скорость выбираем по следующей табличке. Указана в битах в секунду. Чем выше скорость, тем больше ошибка рассинхронизации, поэтому на высоких скоростях целесообразно использовать специализированные кварцы (с неравными значениями).
| 05_Холера |
| 10.4. Исследование регистров |
| 1112 |
| 12 |
| 1568 |
| 1673 |
| 17 |
| 1703 |
| 2.2. Практическая работа к теме |
| 2091 |