Лабораторная по UART с прерываниями

advertisement
Лабораторная работа по UART (часть1).
Предполагается, что лабораторная работа по таймерным прерываниям уже была
выполнена и слушатели познакомились с параллельными портами и с организацией
обработки прерываний.
Асинхронный последовательный интерфейс UART (RS232C)
Для лучшего понимания настроек подсистемы последовательного интерфейса далее
описаны основные принципы асинхронной последовательной передачи данных,
используемые в интерфейсе UART.
Как мы знаем, интерфейс UART производит преобразование из последовательной в
параллельную форму данных, принятых от периферийного устройства или из модема и
преобразование из параллельной в последовательную форму данных, поступивших от
процессора. При передаче по последовательному интерфейсу используется асинхронный
протокол, который поддерживает различную длину данных, стоповые биты и режимы
генерации бита четности, выбираемые с помощью регистра конфигурации COMCON.
Исходно, интерфейс RS232C предназначался для двунаправленного соединения двух
абонентов в соответствии со структурой, изображенной на рис.
Абонент1
Абонент2
Tx1
Rx2
Rx1
Tx2
Каждый абонент содержит два устройства: передатчик и приемник. На рисунке
использованы общепринятые обозначения: Tx (от англ. Transmitter) – для выхода
передатчика и Rx (от англ. Receiver) – для входа приемника.
Передатчик и приёмник одного абонента способны работать независимо один от другого.
Это означает, что при работе передатчика Tx1 происходят изменения сигнала на входе
Rx2 другого абонента, которые активируют приемник Rx2. В это же время пара связанных
устройств Rx2Tx2 может как работать, так и находиться в покое.
Данные по каждой из линий передаются последовательно, бит за битом, причем время
передачи каждого бита ( и обратная величина - частота следования интервалов
постоянства сигнала) определяется настройкой тактового генератора передатчика.
Передатчик формирует в линию значения последовательных битов синхронно с
формируемой его генератором тактовой последовательностью. Приемник, в котором
тактирование производится той же частотой, может анализировать значения сигнала в
линии, руководствуясь собственной тактовой последовательностью, если она будет
сфазирована с тактовой последовательностью передатчика другого абонента.
Фазирование осуществляется следующим образом. Передача в соответствии со
спецификацией RS232C происходит пакетами (кадрами, фреймами) небольшой длины.
Перед началом пакета сигнал в линии соответствует логической 1. В начале пакета всегда
должен присутствовать стартовый бит со значением 0. Начало стартового бита в
передатчике совпадает с состоянием 0000 его СД16. Схемотехника приемника выявляет
наличие в линии перепада 10, соответствующего началу стартового бита, и по этому
событию формирует сигнал сброса своего СД16, в результате чего его состояние также
становится равным 0000, т.е. состояния СД16 в передатчике и приемнике оказываются
синхронизированными. Это позволяет приемнику определять моменты времени, которые
наиболее удалены от границ битового интервала, и в которые наиболее безопасно
выполнять считывание значения передаваемого бита.
Спецификация RS232C предусматривает после стартового бита наличие от 5 до 8
информационных битов (их количество может быть установлено программно), затем
необязательный контрольный бит, а в конце пакета – стоповый интервал, в котором
значение сигнала должно быть равно логической 1 (т.е. как перед началом стартового
бита). Длительность стопового интервала программист может выбрать равным 1, либо 1.5
(только для формата с 5-ю информационными битами), либо 2-м битовым интервалам.
Таким образом, длина пакета может составлять от 7 до 12 битовых интервалов.
Перед началом передачи данных как для передатчика так и для приемника следует
(одинаково) настроить следующие параметры пакета:
а) частота следования битовых интервалов
б) количество информационных битов
в) длина стопового интервала
г) отсутствие или наличие контрольного бита
д) если контрольный бит разрешен, правила его использования.
Диаграммы асинхронной передачи
Подсистема передатчика UART может находиться в трех состояниях:
1) буферный и сдвиговый регистры свободны, передача не происходит, программа может
записывать в передатчик новое слово для передачи;
2) сдвиговый регистр занят и идет передача, буферный регистр свободен, программа
может записать в него следующее слово;
3) сдвиговый и буферный регистры заняты, идет передача, программа должна дождаться
окончания передачи слова и освобождения буферного регистра.
Поэтому для сигнализации о состоянии передатчика в UART используются два флага:
TEMT (Transmitter Empty) и THRE (Transmitter Holding Register Empty) - см. описание
регистра COMSTA0.
Подсистема приемника UART может находиться в трех состояниях:
1) буферный регистр пуст, программе читать нечего, в это же время сдвиговый регистр
может как находиться в покое, так и принимать очередное слово;
2) принято предыдущее слово и скопировано в буферный регистр приемника, сдвиговый
регистр может как находиться в покое, так и принимать следующее слово, программа
может читать содержимое буферного регистра, и должна успеть это сделать до того, как
сдвиговый регистр закончит принимать следующее слово;
3) буферный регистр содержит принятое слово, которое программа не успела прочитать, а
сдвиговый регистр закончил прием следующего слова и скопировал его в буферный
регистр – ранее принятое слово будет потеряно. Это состояние называется
«переполнением» (overrun или overflow).
Для выявления этих состояний в подсистеме UART микроконтроллера ADuC70xx
используются два флага: DR (Data Ready) и OE (Overrun Error) – см. описание регистра
COMSTA0.
Часть 1. Intro - UART
Мы будем работать с передатчиком UART в режиме симулятора.
Для этого откроем программу Intro_UART.
Порядок действий в программе при задании частоты следования битовых интервалов
следующий:
1) Разрешить доступ к регистрам делителя DL– установкой в «1» бита 7 (DLAB) в
регистре COMCON0.
2) Записать два байта (заранее вычисленного) делителя в регистры COMDIV0 (младший)
и COMDIV1 (старший).
3) Сбросить бит DLAB и одновременно задать формат пакета в регистре COMCON0.
Частота передачи данных и значения DL приведены в табл. №36 для случая нормальной
частоты передачи, а также с помощью делителя частоты с дробным коэффициентом
деления, который позволяет в сочетании с нормальным генератором тактовых импульсов
передачи данных более широкий диапазон частот тактирования с меньшей погрешностью.
Регистры UART СОМТХ (передачи), СОМRX (приема) и COMDIV0 (делитель) имеют
общий адрес и доступ к ним осуществляется установкой и сбросов защелки DLAB.
В стр. 32-36 идет настройка приема/передачи через параллельный порт 1, настройка
скорости приема\передачи, настройка формата пакета, бита четности.
Стр. 32: входы/выходы параллельного порта конфигурируются на UART: SIN и SOUT.
Стр. 33: старший бит COMCON0 – в 1 – открываем защелку для установления частоты.
Стр. 34: записываем DL, взятую из таблицы 48 (стр. 92) в регистр COMDIV0.
Стр. 36: в регистре COMCON0 формируем пакет.
На стр. 42 запускается подпрограмма OutByte. cI равна в стр. 38 0х20, т.е. пробелу, перед
использованием в функции при вызове она инкрементится, т.е. будет равна уже не
пробелу, а «!». Когда она дойдет до «я», она сбросится в 32 (0х20), в старое значение.
В стр. 46 – задержка, чтобы мы могли видеть, как вводятся символы, не слишком быстро.
Заглянем в ф-цию OutByte. Стр. 62.
Опишем регистр состояния линии COMSTA:
Биты Имя поля Описание (функция)
7
--Reserved
6
TEMT
Transmitter Empty - Флаг опустошения сдвигового регистра передатчика.
Устанавливается автоматически по концу передачи слова. Сбрасывается
автоматически при копировании слова из буфера передатчика, если
последний не пуст.
5
THRE
Transmitter Holding Register Empty Флаг устанавливается при
копировании содержимого буфера передатчика в сдвиговый регистр и
сигнализирует о том, что можно поместить в буфер следующее слово.
Сбрасывается при записи слова в буфер.
4
BI
Флаг ошибки (обрыва) линии. Устанавливается аппаратно, если линия
SIN находится в состоянии Low дольше, чем время передачи байта.
Сбрасывается автоматически после чтения регистра COMSTA0.
3
FE
Флаг ошибки формата. Устанавливается аппаратно при неверном
значении стоп-бита. Сбрасывается автоматически после чтения регистра
COMSTA0
2
PE
Флаг ошибки чётности. Устанавливается по аппаратному обнаружению
неверного бита чётности. Сбрасывается автоматически после чтения
регистра COMSTA0
1
OE
Overrun Error - Флаг ошибки перезаписи. Устанавливается аппаратно,
если очередной принятый байт затирает предыдущий до того, как тот
был считан. Сбрасывается автоматически после чтения регистра
COMSTA0.
0
DR
Data Ready - Флаг готовности данных. Устанавливается аппаратно по
концу приёма байта. Сбрасывается автоматически при считывании
буфера приёмника.
В стр. 64 содержимое регистра COMSTA логически умножается на 0х40, тем самым мы
анализируем 6-й бит регистра. Если он равен 1 (не сброшен), то буфер пуст. В цикле,
таким образом, мы ждем, когда бит будет сброшен, это означает, что в регистр
передатчика COMTX можно записать первый байт. (Точно так же, как и 6-й бит, можно
анализировать 5-й бит, бит окончания сдвига в регистре передатчика.) Дальше – задержка
на передачу первого байта.
Если мы запустим программу, то увидим, как она будет печатать символы в окошке
UART.
Итак, в первой части работы по UART мы
1. научились управлять частотой передачи данных
2. научились переключаться с помощью защелки DLAB из регистров COMDIV в
регистры COMTX и COMRX.
3. научились формировать параметры пакета
4. научились анализировать регистр статуса COMSTA
5. научились передавать через регистр COMTX.
Теперь давайте перейдем на режим работы с реальным устройством. Для этого мы
подключаем кабель UART к USB компьютера и анализируем, к какому COM-порту
подключен UART. Допустим, это СОМ17.
Запускаем Гипертерминал, переходим в KEIL на работу с реальным устройством.
Гипертерминал спрашивает название подключения, затем через что подключаемся.
Надо указать COM17. Тогда программа выдаст настройки подключения, надо
установить те же настройки, что были у нас в UART: 8 битов, нет четности, 1 стоп бит,
9600 скорость.
При запуске программы в окне Гипертерминала будут видны все те же символы, что
были в окне UART.
Индивидуальные задания.
В индивидуальных заданиях даны различные величины скоростей передачи. На стр. 63
руководства по ADUC 7020 приведена формула расчета константы DL, которую надо
занести в регистр COMDIV0 для получения нужной скорости. В расчетах участвует
CD – core divider, который легче всего установить уже в startup.c в закладке
Configuration wizard. Открыв окно PLL setup, мы можем поменять CD.
Формат пакета устанавливаем в 0-1 бите COMCON0. Если нет проверки четности, то
бит 3-й COMCON0=0, если есть проверка четности, то равен 1. Тогда имеет значение
4-го бита COMCON0. Если идет проверка на четность – то 4-й бит=1, если на
нечетность -=0.
Контакты приемника и передатчика. Настраиваются в регистрах параллельного порта
GP_CON. Кроме того, необходимо переставить перемычки на плате, в соответствии со
схемой:
Вид на плату со стороны кресел. Левые контакты – P2.0 и P0.7. Правые – P1.1 и P1.0.
Необходимо правильно сконфигурировать GP_CON (один или несколько) и
перемычки на плате.
Download