cancel
Showing results for 
Search instead for 
Did you mean: 

While programming for UART in receiver mode, SZF bit in UARTSR gets set and LINFLEX enters the sleep mode. Why is this so?

Pooja WANI
Associate II
 
1 ACCEPTED SOLUTION

Accepted Solutions
Erwan YVIN
ST Employee

Hello ,

In which state are you ?

Stuck at Zero Flag

This bit is set by hardware when the bus is dominant for more than a 100-bit time. If the dominant

state continues, SZF flag is set again after 87-bit time. It is cleared by software.

Are you sure that you have plugged correctly the Error Interruption callback ?

Best regards

Erwan

View solution in original post

4 REPLIES 4
Erwan YVIN
ST Employee

Hello ,

In which state are you ?

Stuck at Zero Flag

This bit is set by hardware when the bus is dominant for more than a 100-bit time. If the dominant

state continues, SZF flag is set again after 87-bit time. It is cleared by software.

Are you sure that you have plugged correctly the Error Interruption callback ?

Best regards

Erwan

Pooja WANI
Associate II

Hello,

I have copied the code below.

#include "components.h"

void UART_Init(void);

void GPIO_Init(void);

void UART_Transmit(uint8_t);

void UART_Receive(void);

uint8_t TransData[] = {"Hello World...!\n\r"};

#define NUMBER_OF_BYTES_SENT sizeof(TransData)

uint8_t ReceivedData;

/*

 * Application entry point.

 */

int main(void)

{

 unsigned short j = 0;

 /* Initialization of all the imported components in the order specified in

   the application wizard. The function is generated automatically.*/

 componentsInit();

 GPIO_Init();

 UART_Init();

 /* Transmit welcome message */

 for (j = 0; j < NUMBER_OF_BYTES_SENT; j++) /* Loop for character string */

 {

 UART_Transmit(TransData[j]);

 }

 /* Application main loop.*/

 while(1)

 {

 UART_Receive();

 UART_Transmit(ReceivedData);

 }

}

void UART_Transmit(uint8_t ch)

{

unsigned char *ptr = (unsigned char *)&LINFLEX_0.BDRL.R + 3;

*ptr = ch; /* write character to transmit buffer */

while (1 != LINFLEX_0.UARTSR.B.DTF); /* Wait for data transmission completed flag */

LINFLEX_0.UARTSR.R = 0x0002;

}

void UART_Receive(void)

{

while (LINFLEX_0.UARTSR.B.DRF != 1);

while (LINFLEX_0.UARTSR.B.RMB != 1);

ReceivedData = (uint8_t) LINFLEX_0.BDRM.B.DATA4;

LINFLEX_0.UARTSR.R = 0x0204;    /* clear the DRF and RMB flags */

}

void UART_Init(void)

{

/*Alternate functions are chosen by setting the values of the PCR.PA bit-fields inside the SIUL module.

PCR.PA = 00 for AF0; PCR.PA = 01 for AF1; PCR.PA = 10 for AF2; PCR.PA = 11 for AF2.

This is intended to select the output functions;

to use one of the input functions, the PCR.IBE bit must be written to ‘1’, regardless of the values selected in the PCR.PA bit-fields. */

/* UART Tx and Rx */

SIU.PCR[16].R = 0x0E00;

SIU.PCR[17].R = 0x0100;

/* LINFLEX in an Initialization mode */

LINFLEX_0.LINCR1.B.INIT = 1;

LINFLEX_0.LINCR1.B.SLEEP = 0;

/* wait for the INIT mode */

//while (0x1000 != (LINFLEX_0.LINSR.R && 0xF000));

LINFLEX_0.LINSR.R = 0xFFFF; /* Clearing LINSR register */

LINFLEX_0.UARTSR.R = 0xFFFF; /* Clearing UARTSR register */

/* Start UART mode */

LINFLEX_0.UARTCR.B.UART = 1;

LINFLEX_0.UARTCR.R = 0x0003; /* 8-bit data, Parity transmit/check disabled */

/* Generate Baud Rate = 115200 at 16 MHz */

/* BAUD RATE = 16 MHz/(16 * LFDIV)

For Baud Rate of 115200, LFDIV = 8.68

LINFBRR = 16 * 0.68 = 11d i.e. 0xB & LINIBRR = 0x8 */

LINFLEX_0.LINFBRR.B.DIV_F = 0xB;  /* LINFBRR (containing the fraction bits must be programmed before the LINIBRR */

LINFLEX_0.LINIBRR.B.DIV_M = 0x8;

/* Exit Initialization mode */

LINFLEX_0.LINCR1.B.INIT = 0;

LINFLEX_0.LINCR1.B.SLEEP = 0;

/* Transmit buffer size = 1 byte, Enable Transmission, Enable Reception */

LINFLEX_0.UARTCR.B.TDFLTFC = 0;

LINFLEX_0.UARTCR.B.TXEN = 1;

LINFLEX_0.UARTCR.B.RXEN = 1;

}

Transmitter in this code is working . But, Receiver part is not working. TO flag in UARTSR register is getting set before receiving a single byte. Please, go throgh the code once if I am missing something in the code.

Thanks and Regards,

Pooja Wani

Pooja WANI
Associate II

while (LINFLEX_0.UARTSR.B.DRF != 1);

It is getting stuck over here. DRF flag does not get set.

Hello,

I could perform UART reception successfully.

However, I was using pins PB[0] and PB[1] earlier for Transmission and Reception. UART transmitter was working properly using these pins and there was problem while reception. Same code when used with pins PB[2] and PB[3], Transmission and Reception both are working successfully.

Can you please tell me what can be the problem over here?

Thanks and Regards,

Pooja WANI