K64F UART Status Register TDRE bit

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

K64F UART Status Register TDRE bit

750 Views
yibinwang
Contributor I

Dear all,

I have issue on the K64F UART data sending. Now, I use the request mode to code my data sending without interrupt so I also need to check the S1 TDRE bit to understand if the current data is sent out when in the next new data sending.

Please see my UART sending code.

void SendSer0Char(unsigned char Char){
/* Wait for transmitter to empty, load char into TDRE */
//while(!(SSR0 & TDREbit));
//TDR0 = Char;
//SSR0 &= ~TDREbit;
UART1_S1 &= ~(0x80);
while((UART1_S1 & 0x80) != 0x80); // TDRE
UART1_D = Char;

}

But, there is the issue on the UART1_S1 TDRE checking. I got the two differences value on TDRE bit when I used same code working on a batch boards.

On the some boards, the TDRE can be reset automatically before the next new data sending. But the another boards, the TDRE always keeps Zero status after the first data sent so the code stay in the loop without any sending for the following datas . I don't what reason was on the UART sending code.

I also attached the UART initialization code in here. Please have a look.

void UART1_Init(void) {

  UART1_C2 &= ~UART1_C2_MASK_1;  // #define UART1_C2_MASK_1      0x0CU

  UART1_BDH = UART1_BDH_VALUE;  // #define UART1_BDH_VALUE      0x00U

  UART1_BDL = UART1_BDL_VALUE;   // #define UART1_BDL_VALUE      0x36U

  UART1_C4 = UART1_C4_VALUE;        // #define UART1_C4_VALUE       0x08U

  UART1_MA1 = UART1_MA1_VALUE; // #define UART1_MA1_VALUE      0x00U

 

  UART1_MA2 = UART1_MA2_VALUE; // #define UART1_MA2_VALUE      0x00U

  UART1_C1 = UART1_C1_VALUE;      // #define UART1_C1_VALUE       0x00U

  UART1_S2 = UART1_S2_VALUE;      // #define UART1_S2_VALUE       0xC0U

 

  UART1_MODEM = UART1_MODEM_VALUE;  // #define UART1_MODEM_VALUE    0x00U

  UART1_IR = UART1_IR_VALUE;  // #define UART1_IR_VALUE       0x00U

  UART1_TWFIFO = UART1_TWFIFO_VALUE; // #define UART1_TWFIFO_VALUE   0x00U

  UART1_RWFIFO = UART1_RWFIFO_VALUE; // #define UART1_RWFIFO_VALUE   0x01U

  UART1_SFIFO = UART1_SFIFO_VALUE; // #define UART1_SFIFO_VALUE    0xC7U

  UART1_CFIFO = UART1_CFIFO_VALUE; // #define UART1_CFIFO_VALUE    0xC0U

  UART1_PFIFO &= ~UART1_PFIFO_MASK; // #define UART1_PFIFO_MASK     0x88U

  /* Clear flags */

  #ifdef UART1_CLEAR_FLAGS

  (void)UART1_S1;

  (void)UART1_D;

  #endif

  UART1_C5 = UART1_C5_VALUE;  // #define UART1_C5_VALUE       0x00U

  UART1_C3 = UART1_C3_VALUE; // #define UART1_C3_VALUE       0x0FU

  UART1_C2 = UART1_C2_VALUE_2; // #define UART1_C2_VALUE_2     0x2CU

}

0 Kudos
1 Reply

413 Views
jorge_a_vazquez
NXP Employee
NXP Employee

Hi yibin wang

What IDE are you using? To clear the TDRE flag you have to read Status register (S1) and then write to the UART data (UART1_D). There is not need to write a logic 0 in the status register TDRE, and actually, it's a "read only" register, so the instruction UART1_S1 &= ~(0x80);  should mark a error. try to take out that instruction and if you the issue persist please let me know.

attache an example of UART0 for K64F polling mode.

Note: in case you want to specific clear the TDRE, you can do it after you check for empty space (after the while) with (void)UART0_S1;

Hope it helps

Jorge Alcala

0 Kudos