Академический Документы
Профессиональный Документы
Культура Документы
Передача данных
через UART
Почти каждый микроконтроллер имеет на борту универсальный последовательный
интерфейс — UART. AVR тут не исключение и поддерживает этот протокол в полном
обьеме полностью аппаратно. По структуре это обычный асинхронный
последовательный протокол, то есть передающая сторона по очереди выдает в линию 0
и 1, а принимающая отслеживает их и запоминает. Синхронизация идет по времени —
приемник и передатчик заранее договариваются о том на какой частоте будет идти
обмен. Это очень важный момент! Если скорость передатчика и приемника не будут
совпадать, то передачи может не быть вообще, либо будут считаны не те данные.
Протокол
Вначале передатчик бросает линию в низкий уровень — это старт бит. Почуяв что
линия просела, приемник выжидает интервал Т1 и считывает первый бит, потом через
интервалы Т2 выковыриваются остальные биты. Последний бит это стоп бит.
Говорящий о том, что передача этого байта завершена. Это в самом простом случае.
В конце байта, перед стоп битом, может быть и бит четности. Который получается если
поксорить между собой все биты, для контроля качества передачи. Также может быть
два стопа, опять же для надежности. Битов может быть не 8, а 9. О всех этих параметрах
договариваются на берегу, до начала передачи. Самым же популярным является 8 бит,
один старт один стоп, без четности.
Причем с самим протоколом можно не заморачиваться — все реализовано аппаратно.
Разве что захочется завести второй UART, тогда придется делать его программно.
Аппаратная часть
Ну тут все просто, соединяем крест-накрест приемник с передатчиком и готово.
У AVR есть регистр UDR это UART Data Register (в некоторых контроллерах он может
зваться UDR0 или еще как нибудь похоже). На самом деле это два разных регистра, но
имеют один адрес. Просто на запись попадает в один (регистр передатчика), а на чтение
берет из другого (регистр приемника). Таким образом достаточно просто пихать данные
в этот регистр и они улетят приемнику, и, наоборот, считывать их оттуда по приходу.
О том, что байт пришел в регистр UDR нам скажет прерывание по завершению приема,
которое вызывается сразу же, как приемник засосет в себя все биты (обычно 8, но
может быть и 9, в зависимости от настройки).
Так что постоянно следить за UART вручную не нужно, все обслуживание можно
повесить на прерывания и он сам будет все делать. Можно в памяти организовать
буфер и туда тупо пихать данные, а на прерывании по опустошению UDR следить за тем
есть ли что в буфере и если есть — отправлять.
Настройка UART
Все настройки приемопередатчика хранятся в регистра конфигурации. Это UCSRA,
UCSRB и UCSRС. А скорость задается в паре UBBRH:UBBRL.
Досконально все расписывать не буду — на это есть даташит. Напишу лишь то, что
жизненно необходимо.
Регистр UCSRA
Тут нам интересны только биты RXC и TXC это флаги завершения приема и передачи,
соответственно. RXC встанет когда непрочитанный байт вылезет в регистр UDR, а TXC
встает когда последний стоп-бит прошел, а новое значение в UDR не поступило. Т.е.
после прохода всех байтов.
Биты UDRE сигнализирует о том, что регистр UDR приемника пуст и в него можно пихать
новый байт. Сбрасывается он аппаратно после засылки в UDR какого либо байта. Также
генерируется прерывание «Регистр пуст»
Бит U2X — это бит удвоения скорости при работе в ассинхронном режиме. Его надо
учитывать при расчете значения в UBBRH:UBBRL
Регистр UCSRB
Тут в первую очередь это биты RXEN и TXEN — разрешение приема и передачи. Стоит
их сбросить как выводы UART тут же становятся обычными ножками I/O.
Регистр UCSRC
Самый прикол тут — это бит селектора URSEL дело в том, что по неизвестной причине
создаетели решили сэкономить байт адреса и разместили регистры UCSRC и UBRRH в
одной адресном пространстве. А как же определять куда записать? А по старшему биту!
Поясню на примере. Если мы записываем число у которого седьмой бит равен 1, то оно
попадет в UCSRC, а если 0 то UBRRH. Причем этот бит есть не во всех AVR в новых
моделях его нет, а регистры имеют разные адреса. Так что надо смотреть в даташите
этот момент — есть там бит URSEL или нет.
Остальные биты задают число стопов, наличие и тип контроля четности. Если оставить
все по дефолту то будет стандартный режим. Надо только выставить формат посылки.
Делается это битами UCSZ0, UCSZ1 и UCSZ2 (этот бит тусуется в регистре UCSRB).
Для стандартной 8ми битной посылки туда надо записать две единички.
Скорость обмена.
Тут все зависит от пары UBBRx
Где:
XTAL — рабочая тактовая частота контроллера.
baudrate — требуемая скорость (я люблю 9600 :) — чем медленней тем надежней. 9600
в большинстве случаев хватает)
Ошибки передачи
К сожалению мир наш не идеален, поэтому возможны ошибки при приеме. За них
отвечают флаги в регистре UCSRA