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.
При использовании следующей последовательности контроллер 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.
Файлы для скачивания
Документация
2.5.0 от 20.05.2024
2.8.0 от 26.07.2024
2.1.0 от 22.09.2021