TM4C123 UART siempre está en estado ocupado

Estoy tratando de configurar UART0 en la plataforma de lanzamiento TM4C123G. Todos mis registros de configuración son perfectos. Se han escrito con valores deseados. Pero de alguna manera, mi indicador de ocupado siempre es 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 proporciona 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

El único registro problemático es UART0_FR. Debe tener un valor de 0x90 en todos los casos excepto durante la transmisión de datos. Pero incluso después de la transmisión, su bit de ocupado permanece en 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.

Respuestas (1)

Ha sido resuelto. Había un problema muy complicado. Todos los registros tenían valores perfectos. Volví a leer la hoja de datos y me di cuenta de que el registro LCRH debe escribirse después de la configuración de la velocidad en baudios. No hace ninguna diferencia en los valores finales de los registros, pero de alguna manera mantiene a UART en estado ocupado. No se mencionó en ninguna parte de la hoja de datos cuáles son las posibles razones de que el indicador OCUPADO sea 1. Simplemente reorganicé las siguientes líneas en mi código.

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_LCRH_R = (UART_LCRH_WLEN_8|UART_LCRH_FEN);  // 8 bit word length (no parity bits, one stop bit, FIFOs)
Reconocimiento: Este acertijo fue resuelto por Jonathan Valvano- Profesor de la Universidad de Texas. Es un experto en sistemas embebidos. usuarios.ece.utexas.edu/~valvano