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

(UxSTA <4>) показывает состояние регистра UxRSR. Бит состояния RIDLE - это бит только для чтения, который устанавливается, когда приёмник простаивает (то есть, регистр UxRSR пуст). Никакая логика прерывания не привязана к этому биту, так пользовательское приложение должно опросить этот бит, чтобы определить, простаивает ли UxRSR.

Бит URXDA (UxSTA <0>) указывает, имеет ли получающийся буфер данные или пуст. Этот бит установлен пока есть не менее одного символа, который читается из буфера получателя. URXDA – бит только для чтения.

Рисунок 10 отображает блок-схему приёмника UART

7.4 Настройка приёмника UART

Используйте следующие шаги при настройки приема:

1. Инициализировать регистр UxBRG для соответствующей baud rate (см.раздел 3 ГЕНЕРАТОР baud rate модуля UART).

2. Установить количество информационных разрядов, количество Стоповых битов, и выбор четности, заполняя биты PDSEL <1:0> (UxMODE <2:1>) и STSEL (UxMODE <0>).

3. Если нужно получать прерывания от передатчика, то установить служебный бит UxRXIE в соответствующем регистре управления разрешением прерывания (IEC).

Определите приоритет прерывания для прерывания приёмника, используя служебные биты UxRXIP <2:0> в соответствующем регистре управления приоритетами прерывания (IPC). Также, выберите режим прерывания приёмника записывая биты UTXISEL <1:0> (UxSTA <7,6>).

4. Включить модуль UART, установив бит UARTEN (UxMODE <15>).

5. Генерирование прерывания, будет зависеть от параметров настройки служебного бита URXISEL <1:0>.

Если прерывания отключены, пользовательское приложение может опросить бит URXDA. UxRXIF бит должен быть сброшен в подпрограмме обработки прерывания приёмника UART.

6. Читать данные из буфера приёмника.

Если производится 9 битная передача данных, то читайте слово; иначе, читайте байт. Бит состояния URXDA

(UxSTA <0>) будет установлен всякий раз, когда данные доступны в буфере.

В примере 3 приведён типовой код программы для настройки приёма UART.

Рисунок 11. Приём UART

Обратите внимание:Эта временная диаграмма показывает 2 символа, полученные на входее UxRX.

Рисунок 12. UART Прием с переполненным буфером

Обратите внимание:Эта временная диаграмма показывает получение 6 символов без чтения пользоватлем данных из буфера. 5-ый полученный символ находится в принимающем сдвиговым регистре. Ошибка переполнения происходит в начале 6-ого символа.

Пример 3 типовой код программы для настройки приёма UART.

#define FCY 40000000

#define BAUDRATE 9600

#define BRGVAL ((FCY/BAUDRATE)/16)-1

intmain(void)

{

// Конфигурируем генератор микроконтроллера для работы на частоте 40Mhz

// Fosc= Fin*M/(N1*N2), Fcy=Fosc/2

// Fosc= 8M*40(2*2)=80Mhz для 8M входных тактов

PLLFBD=38; // M=40

CLKDIVbits.PLLPOST=0; // N1=2

CLKDIVbits.PLLPRE=0; // N2=2

OSCTUN=0; // Настраиваем FRC генератор, если используется FRC

RCONbits.SWDTEN=0; // Отключаем сторожевой таймер

while(OSCCONbits.LOCK!=1) {}; // Wait for PLL to lock

U1MODEbits.STSEL = 0; // 1 стоп бит

U1MODEbits.PDSEL = 0; // без чётности, 8-информационных бит

U1MODEbits.ABAUD = 0; // Auto-Baud Отключаем

U1MODEbits.BRGH = 0; // Низкоскоростной режим

U1BRG = BRGVAL; // BAUD Rate настраиваем на 9600

U1STAbits.URXISEL = 0; // Прерывание после приёма одного символа;

U1MODEbits.UARTEN = 1; // Enable UART

while(1)

{

char ReceivedChar;

/* проверяем ошибку приёмника */

if(U1STAbits.FERR == 1)

{

continue;

}

/* необходимо очистить ошибку переполнения, чтобы сохранять полученные символы UART */

if(U1STAbits.OERR == 1)

{

U1STAbits.OERR = 0;

continue;

}

/* получить информацию */

if(U1STAbits.URXDA == 1)

{

ReceivedChar = U1RXREG;

}

}

9. Использование UART для 9-ти битной коммутации

Приёмник UARTа может использоваться в 9-ти битном режиме работы для мультипроцессорной коммутации. С помощью бита ADDEN включается 9-ти битный режим работы, приёмник может игнорировать данные когда 9-ый бит данных является ‘0’. Эта особенность может использоваться в многопроцессорной среде.