35230

Программный сброс контроллера UART


Подскажите, можно ли сбросить UART программным способом и перевести его в исходный режим?

Да, такая возможность есть путём программирования регистров контроллера UART в исходное состояние.

При использовании следующей последовательности контроллер UART переходит в исходное состояние:
1)    Запрещение прерываний и запросов DMA в регистрах IMSC и DMACR.
2)    Запрещение работы приёмопередатчика в регистре CR.
3)    Ожидание завершения последней транзакции в течение времени, необходимого для передачи одного символа.
4)    Если FIFO выключено, то включение FIFO в регистре LCR_H путём установки бита FEN для сброса буфера приёмника и передатчика.
5)    Сброс FIFO приёмника и передатчика путём сброса бита FEN регистра LCR_H, при этом требуется запрограммировать последовательно регистры IBRD, FBRD и LCR_H значением 0x0000.
6)    Сброс флагов ошибок в регистре RSR_ECR.
7)    Сброс флагов запросов прерываний в регистре ICR.
8)    Установка оставшихся регистров значениями по сбросу в соответствии с таблицей «Обобщенные данные о регистрах устройства» - регистры ILPR, CR и IFLS.

В данном случае необходимо учитывать одну особенность контроллера UART: если до программного сброса буфер FIFO приёмника был переполнен, то флаг переполнения OE в регистре DR будет установлен только когда в FIFO приёмника освободилось место и был принят новый символ (спецификация 1986ВЕ9x, пункт 28.5.7 Бит переполнения буфера). Таким образом контроллер UART хранит информацию о событии переполнения и устанавливает флаг OE в регистре DR только при принятии нового символа. Если новый символ будет принят после программного сброса, то бит OE будет установлен, сообщая о том, что ранее было переполнение.

Чтобы сбросить информацию о событии переполнения, вместо пункта 4 требуется выполнить следующую последовательность действий, которая выполняет фиктивную отправку символа:
4.1)    Отключение выводов UART RX и TX путём перевода выводов в аналоговый режим, при этом для предотвращения случайных наводок требуется, чтобы на данных выводах были включены резисторы подтяжки к питанию.
4.2)    Если FIFO выключено, то включение FIFO в регистре LCR_H путём установки бита FEN для сброса буфера приёмника и передатчика.
Если FIFO включено, то выключение FIFO в регистре LCR_H путём сброса бита FEN для сброса буфера приёмника и передатчика.
4.3)    Разрешение работы UART в режиме шлейфа (RX замкнут на TX) путём установки бит UARTEN и LBE в регистре CR.
4.4)    Отправка символа, чтобы после приёма при чтении регистра DR бит OE установился, сообщая о том, что ранее было переполнение и потеря принимаемых символов.
4.5)    Ожидание окончания передачи/приёма (бит BUSY в регистре FR) и считывание регистра DR.
4.6)    Запрещение работы приёмопередатчика UART в регистре CR.
4.7)    Включение выводов UART RX и TX путём перевода выводов в цифровую функцию.

В этом случае контроллер UART переходит в исходное состояние, при этом бит переполнения OE также оказывается сброшенным.

Пример проекта для среды Keil приведён в конце статьи. Данный пример сделан для работы на отладочной плате для МК K1986ВЕ92QI, на микросхеме приёмопередатчика требуется замкнуть RX и TX для создания петли. Программный сброс осуществляется с помощью функции "UART_SoftReset()". Если определено макроопределение "RESET_FLAG_OE", то дополнительно сбрасывается флаг переполнения OE в регистре DR.

Файлы для скачивания

Документация

Теги

Был ли ответ полезным?