Составители:
234
принятый в сдвиговый регистр, но не записанный в SBUF, следующий байт
будет безвозвратно утерян.
Контроллер последовательного порта может работать в одном из четырех
режимов (один синхронный и три асинхронных), различающихся скоростями
обмена (бод) и количеством передаваемых/принимаемых бит:
• Режим 0 (синхронный): данные передаются и принимаются через RxD,
TxD является синхронизирующим (выдает импульсы
сдвига). Скорость
в этом режиме фиксирована (1/12 частоты тактового генератора).
• Режим 1 (8 бит данных, асинхронный, переменная скорость).
Передаются 10 бит: старт-бит, 8 бит данных (SBUF) и стоп-бит.
• Режим 2 (9 бит данных, асинхронный, фиксированная скорость).
Передаются 11 бит: старт-бит, 8 бит (SBUF), бит TB8/RB8
(посылка/прием соответственно) и 1 стоп-бит. Биты TB8 и RB8
содержатся в регистре SCON (биты 3
и 2 соответственно), первый
устанавливается программно, а второй содержит 9-й бит принятой
комбинации. С помощью них можно организовать, например, контроль
четности или обмен с двумя стоп-битами.
• Режим 3 (9 бит данных, асинхронный, переменная скорость). То же, что
и режим 2, только скорость обмена переменная.
В режиме 1 и 3 используются Таймер 0 и/или Таймер 1 для
настройки
скорости обмена.
Б.3.3 Организация буферизированного последовательного ввода-вывода в
стенде SDK-1.1
В микроконтроллере ADuC812 прерывание от последовательного канала
имеет номер 4, адрес-вектор 0x23 и генерируется контроллером
последовательного порта во время установки флага TI или RI. Чтобы разрешить
это прерывание, нужно установить биты ES и EA регистра IEN0.
Управление обработчику прерывания передается тогда, когда UART либо
готов к передаче
очередного байта (TI=1), либо принял байт из канала (RI=1).
При использовании этой схемы появляется проблема посылки первого байта.
Пусть прикладная программа желает послать байт, когда очередь WFIFO
пуста и в порт данные не записывались длительное время (TI=0). Так как
обработчик прерываний, обслуживающий очередь, вызывается только при
установленных флагах RI или TI, прикладной программе придется либо самой
записать первый байт в SBUF (начав тем самым процесс передачи), либо,
записав байты для передачи в очередь WFIFO, искусственно установить флаг TI
(вызвав тем самым обработчик, который обслужит очередь). Проблема
разрешима, однако при ее решении необходимо учитывать, что TI также
сброшен, когда контроллер занят посылкой байта, даже если очередь (WFIFO)
пуста (посылка последнего байта в
очереди).
Страницы
- « первая
- ‹ предыдущая
- …
- 233
- 234
- 235
- 236
- 237
- …
- следующая ›
- последняя »
