TM4C123 UART ist immer im Belegtzustand

Ich versuche, UART0 auf dem TM4C123G-Launchpad zu konfigurieren. Alle meine Konfigurationsregister sind perfekt. Sie wurden mit gewünschten Werten geschrieben. Aber irgendwie ist mein Busy-Flag nach dem ersten Schreiben in das Datenregister immer 1. Ich verwende das UART0-Modul an den Pins PA0 und PA1. Der Initialisierungscode ist unten angegeben.

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
}

Die Konfigurationsregister haben nach dem Ausführen der obigen Funktion folgende Werte:

UART0_IBRD = 0x2B        //43
UART0_FBRD = 0x1A        //26
UART0_LCRH = 0x70    
UART0_CTL  = 0x301

Das einzige problematische Register ist UART0_FR. Es sollte immer einen Wert von 0x90 haben, außer während der Datenübertragung. Aber auch nach der Übertragung bleibt sein Busy-Bit auf 1, was jede Übertragung verhindert.

Ich schreibe das UART0_DATA-Register wie folgt:

  while((UART0_FR_R&UART_FR_TXFF) != 0);       //While transmission FIFO is not full, stay here.
  UART0_DR_R = data;                          // Transmit data to serial.

Antworten (1)

Es wurde gelöst. Es gab ein sehr kompliziertes Problem. Alle Register hatten perfekte Werte. Ich habe das Datenblatt erneut gelesen und festgestellt, dass das LCRH-Register nach den Baudrateneinstellungen geschrieben werden sollte. Es macht keinen Unterschied zu den Endwerten der Register, aber irgendwie hält es UART im beschäftigten Zustand. Es wurde nirgendwo im Datenblatt erwähnt, was mögliche Gründe dafür sind, dass das BUSY-Flag 1 ist. Ich habe nur die folgenden Zeilen in meinem Code neu angeordnet.

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)
Danksagung: Dieses Rätsel wurde von Jonathan Valvano – Lehrer an der Universität von Texas – gelöst. Er ist Experte für eingebettete Systeme. users.ece.utexas.edu/~valvano