TM4C123 UART está siempre en estado ocupado

2

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.
    
pregunta Saqib Ahmed

1 respuesta

2

Se ha resuelto. Había un problema muy complejo. Todos los registros tenían valores perfectos. Volví a leer la hoja de datos y llegué a saber que el registro LCRH debería 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 que las posibles razones de la marca BUSY sean 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)
    
respondido por el Saqib Ahmed

Lea otras preguntas en las etiquetas