Подписаться на получение новых статей на почту:

UART/USART (УАПП) в AVR. Регистры управления. Шаг №40

Всем привет. В прошлой статье мы с Вами довели до рабочего состояния логгер, а точнее контроллер сбора данных, а именно запись на sd-карту температуры и влажности по времени, используя файловую систему PetitFatFs, с возможностью сохранения данных после выключения/включения карты. А также корректировка времени с помощью кнопок.

Далее, как я и писал в статье № 31 (план действий), научимся передавать данные по UART. Так как цель нашего проекта это изучение прикладного программирования, то рассмотрим данный протокол, и пример его использования по передаче данных между двумя микроконтроллерами. После рассмотрения примера приступим к передаче данных на ПК используя преобразователь UART- USB, который мы рассмотрели в статье №8.

Что же такое UART? Это Universal Asynchronous Receiver Transmitter (Универсальный асинхронный приемо-передатчик) либо кратко УАПП. Основная его задача – это преобразовать передаваемые данные в последовательный код. Данный протокол является одним из старейших, и был придуман в США для передачи телеграфных сообщений. С того времени данный протокол стал прародителем протоколов семейства UART, например всем известный RS-232 либо COM порт, токовая петля, RS-485, LIN, IrDA (инфракрасный порт)и т.п.

Передача данных происходит по одному биту в равные промежутки времени, что определяется скоростью в бодах либо битрейт (бит в секунду). Хочется отметить, что бод (S)и длительность бита (T, секунд) связаны соотношением T=1/S. Существует общепринятый ряд стандартных скоростей: 300, 600, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200, 460800, 921600 бод.

Для контроля информации и уменьшения рассинхронизации в передаваемый поток вставляются синхронизирующие метки: один стартовый и один или два стоповый бит (рисунок ниже). В нерабочем (пассивном состоянии) вход/выход интерфейса = 1. Стартовый бит = 0. При перепаде из 1 в 0 отсчитывает от него временный промежуток в половину длительности бита и если по истечению времени = 0, то приемник начинает работу. Значение стоп-бита = 1. Для формирования интервала используется тактирование. Точность источника должна быть такой, чтобы сумма погрешностей (приемника и передатчика) установки временного интервала от начала стартового импульса до середины стопового импульса не превышала половину битового интервала.

Посылка UART(кадр)

Поскольку синхронизирующие биты занимают часть битового потока, то результирующая пропускная способность UART не равна скорости соединения. Например при 8-битной посылке данных, без бита четности, и с 1 стоповым битом, синхронизирующие биты занимают 20 % потока, т.е. при физической скорости 115200 бод битовая скорость данных = 92160 бит /с или 11520 байт/с.

Данный протокол непригоден для коммутации длинных соединений в виду низкой помехозащищенности, а также он работает в пределах одного устройства. Поэтому были разработаны выше описанные протоколы на основе UART.

Структурная схема модуля UART/USART AVR

По передаче UART делится на дуплексную передачу(одновременно и передача и прием ), полудуплексная связь(не одновременная передача в обе стороны), симплексная связь(передача только в одну сторону).

Основные рабочие линии без аппаратного управления это RXD (прием) и TXD (передача). Микроконтроллеры AVR, также не обошли стороной данный протокол и имеют встроенный модуль UART/USART (Рисунок слева), буква S говорит о том что протокол может быть синхронным с использованием синхронизирующего вывода XCK, а также он дополнен схемой формирования и контроля четности. Модули USART в асинхронном режиме совместим с UART, за небольшим различием в работе буферного блока приемника. Также хочется отметить что в UART посылка может 8 или 9 бит, в USART от 5 до 9 бит. Данные модули обнаруживают в МК : переполнение, ошибки кадрирования и неверный старт бит. Все то что зарисовано серым на структурной схеме выше, присутствует в USART и отсутствует в UART.

Как видно из схемы модуль управляется тремя регистрами управления UCSRA, UCSRB, UCSRC в случае модуля USART. И двумя UCSRA, UCSRB в случае UART. Рассмотрим каждый из них.

Регистр UCSRA

RXC TxC UDRE FE DOR PE U2X MPCM
R R/W R R R R R R

Где RXC- Флаг завершения приема . Устанавливается в 1 при наличии не прочитанных данных в буфере приемника. Сбрасывается аппаратно после опустошения буфера. Если разряд RXCIE регситра UCSRB установлен то при установке флага генерируется запрос на прерывание «прием завершен».

TxC – Флаг завершения передачи. Устанавливается в 1 после передачи всех разрядов посылки из сдвигового регистра передатчика, если в UDR не было загружено новых данных. Если TXCIE (UCSRB) установлен, то при установки флага генерируется прерывание «передача завершена». Сбрасывается аппаратно и программно при записи в него 1.

UDR – Флаг опустошения регистра данных. Устанавливается в 1 при пустом буфере передатчика. Если UDRIE (UCSRB) установлен то генерируется запрос на прерывание «регистр данных пуст». Сбрасывается аппаратно при записи в регистр данных.

FE – флаг ошибки кадрирования. Устанавливается в 1 при обнаружении стоп-бита = 0. Сбрасывается при приеме стоп бита = 1.

DOR – Флаг переполнения. Для USART устанавливается в 1, если в момент обнаружения нового старт- бита в сдвиговом регистре приемника находится последнее принятое слово, а буфер приемника полон. В UART устанавливается в 1, если новый кадр будет помещен в сдвиговый регистр до того как из регистра данных будет считано предыдущее слово. Флаг сбрасывается при пересылке принятых данных из сдвигового регистра приемника в буфер.

PE – Флаг контроля четности, устанавливается в 1, если в данных находящихся в буфере приемника, выявлена ошибка контроля четности. При отключенном контроле всегда равен 0.

U2X – удвоение скорости обмена. Если этот разряд установлен в 1, коэффициент деления предделителя контроллера скорости передачи уменьшается с 16 до 8. Удваивается тем самым скорость асинхронного обмена. Используется только при асинхронном режиме.

MPCM – Режим мультипроцессорного обмена. Если в 1 то ведомый мк ожидает приема кадра, содержащего адрес. Кадры не содержащие адрес – игнорируются.

Регистр UCSRB

RXCIE TXCIE UDRIE RXEN TXEN UCSZ RXB8 TXB8
R R/W R/W R/W R/W R/W R R/W

Где RXCIE – Разрешение прерывания по завершению приема. Если = 1 то при установке RXC генерируется прерывание «прием завершен».

TXCIE – Прерывание по завершению передачи.

UDRIE – Прерывание при очистке регистра данных.

RXEN – Разрешение приема. При установке в 1 разрешается работа приеника и переопределяется функционирование вывода RXD. При сбросе разряда работа приемника запрещается , буфер сбрасывается. Значение флагов TxC, DOR,FE становятся недействительными.

TXEN – разрешение передачи. Если разряд сбросится во время передачи, выключение передатчика произойдет только после завершения передачи.

UCSZ2 – Формат посылок. Для задания размера слов данных. Задается разрядами UCSZ1:0.

RXB8 – 8-й разряд принимаемых данных. При использовании 9-разрядных слов данных этот разряд содержит значение старшего разряда принятого слова. Если используется USART, содержимое этого разряда должно быть считано до прочтения регистра данных UDR.

TXB8 – 8-й разряд передаваемых данных. Требуемое значение должно быть занесено в этот разряд до байта данных в UDR.

Регистр UCSRC

URSEL UMSEL UPM1 UPM0 USBS UCSZ1 UCSZ0 UCPOL
R/W R/W R/W R/W R/W R/W R/W R/W
0 0 0 0 0 1 1 0

URSEL – Определяет в какой из регистров производится запись. Если 1 то обрашается к UCSRC. Если 0 — UBRRH.

UMSEL – Режим работы USART. Если 0 то асинхронный режим, 1 — синхронный.

UPM1, UPM0 – режим работы схемы контроля и формирования четности.

USBS – Если 0 — передатчик посылает 1 стоп – бит, 1 – 2 стоп бита Для приемника содержимое разряда безразлично.

UCSZ1, UCSZ0 – Формат посылок. Совместно с UCSZ2 определяют количество разрядов данных в посылках.

UCPOL – полярность тактового сигнала. Определяет момент выдачи и считывнаия данных на выводах модуля. Используется только при работе в синхронном режиме. В асинхронном режиме = 0.

UCPOL
Выдача данных на вывод TXD
Считывание данных с вывода RXD
0
Спадающи фронт XCK
Нарастающий фронт XCK
1
Нарастающий фронт XCK
Спадающи фронт XCK

Теперь вернемся к схеме модуля и рассмотрим блок тактирования(рис. выше). Как видите отличие обоих модулей состоит только в синхронизаторе, который используется для синхронного режима. Для обоих режимов общим является контроллер скорости передачи, который задает скорость приема и передачи данных, также является делителем тактовой частоты, где коэффициент деления задается в 12-разрядном регистре UBRR. В некоторых моделях, а именно в ATmega8, с которым мы будем эксперементировать, данный регистр располагается по одному адресу с регистром управления (UCSRC), который мы рассмотрим ниже. По этому при чтении, при первом обращении, сначала возвращается значение регистра UBRRH, которое ожжет быть от 0 до 4095. При повторном — UCSRC. При этом прерывания при такой последовательности должны быть запрещены. На рисунке ниже пример значений регистра UBRR, которые позволяют получить стандартные передачи и велечины ошибок.

Значения регистра UBRR в AVR

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

Скорость = Fck/16 (UBRR+1) , при асинхроннм режиме и U2X =0

Скорость = Fck/8 (UBRR+1) , при асинхроннм режиме и U2X =1

Скорость = Fck/2 (UBRR+1) , при асинхроннм режиме и U2X =0 (Режим ведущего)

Где Fck – тактовая частотота

U2X – разряд регист UCSRA, который рассмотрели выше.

Рекомендуется использовать значение регистра,при которых получаемая скорость передачи отличается от требуемого значения меньше чем на 0,5 %. В синхронном режиме в качестве ведомого скорость приема и передачи определяется частотой сигнала, поступаюбщего на вывод XCK. Частота должна удовлетворять Fxck< Fosc/4, т.к. сигнал XCK сначала синхронизтрруется с тактовой частотой МК, а затем проходит через детектор фронтов.

Формат кадра.

Выше в начале статьи мы рассморели рисунок посылки, это одно и тоже. Т.е. кадр это совокупность информации – передаваемых данных и проверочных битов. Кадр начинается со старшего бита, за которым следует младший разряд слова данных. После старшего разряда слова данных следует один или два стоп бита. Если включается бит четности, то он вставляется между старшим разрядом слова данных и первым стоп битом. Итак, как мы и говорили выше кадр настраивается разрядами регистров UCSRB и UCSRC. Ниже таблица управдения размером кадра.

UCSZ2 UCSZ1 UCSZ0 Размер слова данных
0 0 0 5 разрядов
0 0 1 6 разрядов
0 1 0 7 разрядов
0 1 1 8 разрядов
1 1 1 9 разрядов

Формат кадра в UART определяется флагом CHR9.

И еще одна таблица управление контроллем четности:

UPM1 UPM0 Режим работы
0 0 Выключен
0 1 Зарезервировано
1 0 Включена проверка на чтность(even parity)
1 1 Включена проверка на нечетность () odd parity)

Значение бита четности получается путем выполнения операции «Исключающее ИЛИ» над всеми разрядами передаваемого слова данных. Если используется проверка на нечетность полученный резльтат инвертируется.

В принципе на этом все. Здесь мы познакомились с основами протокола UART и рассмотрели основные настройки встоенного модуля UART/USART. В следующей статье мы с Вами рассмотрим прием, передачу данных по данному интерфейсу между двумя МК, протестируем в протеусе и в железе, передадим информацию от одного мк к другому и выведем информацию на дисплей. На этом все. Всем пока.

Просмотрено 2782 раз.

Я на Google+

Добавить комментарий

Ваш e-mail не будет опубликован.

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Subscribe without commenting