Estoy intentando configurar UART0 en el launchpad TM4C123G. Todos mis registros de configuración son perfectos. Han sido escritos con los valores deseados. Pero de alguna manera, mi indicador de ocupado es siempre 1 después de la primera escritura en el registro de datos. Estoy usando el módulo UART0 en los pines PA0 y PA1. El código de inicialización se da a continuación.
void UART_Init(void){
SYSCTL_RCGCUART_R |= 0x01; // activate UART0
SYSCTL_RCGCGPIO_R |= 0x01; // activate port A
while((SYSCTL_PRGPIO_R&0x01) == 0){};
UART0_CTL_R &= ~UART_CTL_UARTEN; // disable UART
UART0_LCRH_R = (UART_LCRH_WLEN_8|UART_LCRH_FEN); // 8 bit word length (no parity bits, one stop bit, FIFOs)
UART0_IBRD_R = 43; // IBRD = int(80,000,000 / (16 * 115,200)) = int(43.40277)
UART0_FBRD_R = 26; // FBRD = int(0.40277 * 64 + 0.5) = 26
UART0_CTL_R |= UART_CTL_UARTEN; // enable UART
GPIO_PORTA_AFSEL_R |= 0x03; // enable alt funct on PA1-0
GPIO_PORTA_DEN_R |= 0x03; // enable digital I/O on PA1-0
// configure PA1-0 as UART
GPIO_PORTA_PCTL_R = (GPIO_PORTA_PCTL_R&0xFFFFFF00)+0x00000011;
GPIO_PORTA_AMSEL_R &= ~0x03; // disable analog functionality on PA
}
Los registros de configuración tienen los siguientes valores después de ejecutar la función anterior:
UART0_IBRD = 0x2B //43
UART0_FBRD = 0x1A //26
UART0_LCRH = 0x70
UART0_CTL = 0x301
Sólo el registro problemático es UART0_FR
. Debe tener un valor de 0x90 en todas las instancias, excepto durante la transmisión de datos. Pero incluso después de la transmisión, su bit de ocupado permanece 1, lo que dificulta cualquier transmisión.
Estoy escribiendo el registro UART0_DATA de la siguiente manera:
while((UART0_FR_R&UART_FR_TXFF) != 0); //While transmission FIFO is not full, stay here.
UART0_DR_R = data; // Transmit data to serial.