Модуль Универсального Асинхронного Приёмо-передатчика (UART). Упрощённая блок схема модуля UART. Регистры управления, страница 10

9.1 UART в Петлевом Режиме (Loopback)

Установка бита LPBACK активизирует режим Loopback, в котором вывод UxTX является внутренне связанным со вводом UxRX. Когда микроконтроллер настроен для режима Loopback, вывод UxRX отсоединяется от внутренней логики UART. Однако, вывод UxTX все еще функционирует обычным образом.

Чтобы выбрать этот режим, сделайте следующее:

1. Настроить UART для нужного режима работы.

2. Разрешить передачу как определено в Допустить передаче как определено в5. Передатчик UART.

3. Установите LPBACK = 1 (UxMODE <6>), чтобы разрешить режим Loopback.

Режим Loopback зависит от битов UEN <1:0>, как показано в Таблице 1.

UEN<1:0>

Функция выводов при LPBACK = 1

00

UxRX вывод соединён с UxTX; вывод UxTX работает обычным образом; вывод UxRX игнорируется; UxCTS/UxRTS неиспользуется

01

Вывод UxRX соединён с UxTX; вывод UxTX работает обычным образом; UxRX игнорируется; UxRTS использует свои функции; UxCTS неиспользуется

10

Вывод UxRX соединён с UxTX; вывод UxTX работает обычным образом; UxRX игнорируется; UxRTS использует свои функции; вывод UxCTS связывается с выводом UxRTS; а сам вывод UxCTS игнорируется

11

Вывод UxRX соединён с UxTX; вывод UxTX работает обычным образом; UxRX игнорируется; BCLKx использует свои функции; UxCTS/UxRTS неиспользуются

Примечание 1: бит LPBACK должен быть установлен в‘1’только после активизации и настройки других битов связанных с модулем UARTа.

17.9.2 Поддержка Auto-Baud

Чтобы разрешить  микроконтроллеру определять baud rate  полученных символов, бит ABAUD должен быть активизирован. UART начнет автоматическое последовательное измерения baud rates всякий раз, когда получен бит Start, в то время как определение baud rate активизировано (ABAUD = 1). Вычисляется среднее значение скорости. Как только бит ABAUD установлен, значение счетчика BRG будет очищено и будет искать бит Start, который в этом случае, определен как задний фронт (высокий-к-низкому), сопровождаемый передним фронтом (низким-к-высокому).

После бита Start, auto-baud ожидает получения символа ASCII “U” ("55h") чтобы правильно рассчитать надлежащую битовую скорость (bit-rate). Измерение проводится и по низкому и по высокому времени, чтобы минимизировать любые эффекты, вызванные асимметрией входящего сигнала. На 5-ом переднем фронте на выводе UxRX сохраняет накопленное значение счётчика BRG с значением периода в регистр UxBRG. Бит ABAUD автоматически очищается. Если пользователь приложение очищает бит ABAUD до завершения последовательности автоопределения скорости, то поведение модуля может привести к неожиданным результатам. На рисунке 14 приведена последовательность обнаружения Auto-Baud.

Рисунок 14. Автоматическое вычисление baud rate  

Покудова происходит последовательная auto-baud, модуль UART находится в неактивном состоянии.

Прерывание UxRXIF устанавливается на 5-ом повышающем фронте UxRX, независимо от параметров настройки URXISEL <1:0>. FIFO приёмника не заполняется.

10. Работа UART в режиме DMA

На некоторых микроконтроллера dsPIC33F может быть использоваться режим DMA (прямой доступ к памяти), чтобы передавать данные между CPU и  UARTом без помощи CPU. Смотрите даташиты на конкретные микроконтроллеры, чтобы определить есть ли в вашем микроконтроллере режим DMA.

Если канал DMA связан с получателем UARTа, UART формирует запрос DMA каждый раз когда есть символ, готовый быть перемещенным с UARTа в оперативную память. DMA переместит данные из регистра UxRXREG в оперативную память и сформирует прерывание CPU после определённого количества переданных данных. Точно так же, если канал DMA  связан с передатчиком UARTа, UART будет формировать запрос DMA после каждой успешной передачи. После каждого запроса DMA, DMA передаёт новые данные в регистр UxTXREG и формирует прерывание CPU после определённого количества перемещённых данных. Так как каналы DMA однонаправлены, два канала DMA требуются если модуль UARTа используется и для приёма и для передачи. Каждый канал DMA должен быть инициализирован как показано в Таблице 2: