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

1. Если UTXISEL <1:0> = 00, то флаг UxTXIF устанавливается, когда символ передан из буфера передатчика в передающий сдвиговый регистр (UxTSR). Это подразумевает не менее одного свободного уровня в буфере передатчика.

2. Если UTXISEL <1:0> = 01, то флаг UxTXIF устанавливается, когда перемещён последний символ из регистра UxTSR. Это подразумевает, что весь передают операции, закончены.

3. Если UTXISEL <1:0> = 10, то флаг UxTXIF устанавливается, когда символ передан из регистра UxTSR и передающий буфер пуст.

Бит UxTXIF будет установлен когда модуль впервые включается. Пользовательское приложение должно очистить бит UxTXIF  в ISR.

Допускается переключение между двумя режимами Interrupt в течение операции.

Обратите внимание:Когда бит UTXEN установлен, флаг UxTXIF будет также установлен если

UTXISEL <1:0> =00, так как переданный буфер еще не полон (можно перемещать данные для передачи в регистр UxTXREG).

В то время как флаг UxTXIF, указывает состояние UxTXREG регистра, бит TRMT (UxSTA <8>) показывает состояние UxTSR. Бит состояния TRMT - бит только для чтения, который установлен когда UxTSR пуст. Никакая логика прерывания не привязана к этому биту, так что пользовательское приложение должно опросить этот бит чтобы определить пуст ли UxTSR.

5.3 Настройки для передатчика UART

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

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

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

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

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

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

5. Разрешить передачу, установив бит UTXEN (UxSTA <10>), который также установит флаг UxTXIF.

Необходимо сбросить флаг UxTXIF в программе. Флаг UxTXIF будет устанавливаться при условиях, которые описываются битами UTXISEL <1:0>.

6. Загрузить данные в регистр UxTXREG (начинается передача).

Если осуществляется 9-ти битная передача, то загрузите слово. Если используется передача 8-ми битная, загрузите байт. Данные могут быть загружены в буфер, пока бит состояния UTXBF (UxSTA <9>) не установлен (свидетельствует о том, что буфер полный.

Обратите внимание: бит UTXEN не должен быть установлен, пока бит UARTEN не был установлен; иначе передачи UARTа не будут осуществляться

В примере 2 представлен типовой код, который настраивает UART для передачи.

Рисунок 5. Передача 8-ми или 9-ти битных данных

Рисунок 6. Противовключённая передача (Back-to-Back)

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

Пример 2: UART Передача с Прерываниями

#defineFCY 40000000

#define BAUDRATE 9600

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

unsigned int i;

int main(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