UART3 overrun error occurs RT1020 Hi, I'm using uart3 interrupt of RT1020 ,i'm using uart3 for rs-485 communication and its speed is 3MBps. Also, I'm using LPSPI4 CMSIS driver handler for other communication . Individually uart3 works fine but after adding spi handler , it will start occurring Overrun. Still im clearing overrun flag but why this flag is getting set . Also ,one query when this flag set ,in this case will i receive all data or lost ? i.MXRT 102x Re: UART3 overrun error occurs RT1020 Hi @hanmant
Thanks for your reply.
According to NXP's policy, I can not send you the source code directly .
My verification code is based on MIMXRT1020-EVK and MIMXER1064-EVK board, I do not think my verification code suitable for your customized board.
Also, I have sent you a screenshot of the critical code about your question.
I merge the following three project into my verification project.
For MIMXRT1020-EVK board:
1: evkmimxrt1020_pit
2: evkmimxrt1020_lpi2c_edma_b2b_transfer_master
3:evkmimxrt1020_lpuart_edma_transfer
For MIMXRT1064-EVK board:
1: evkmimxrt1064_lpi2c_edma_b2b_transfer_slave
If your I2C program still doesn't work properly, I suspect that there might be some issues with your I2C program. I suggest you disable other functions and test the I2C alone to see if it works normally.
I think the current issue I have solved. Please tell me to close this case.
If you still have problem, Please create a new case, thanks.
BR
mayliu Re: UART3 overrun error occurs RT1020 Hi @mayliu, Thanks for your valuable suggest. Can you please share your code with me. Re: UART3 overrun error occurs RT1020 Hi @hanmant ,
I use MIMXRT1020-EVK board as edma_b2b_transfer_master, MIMXRT1064-EVK board as edma_b2b_transfer_slave.
I create a project based on MIMXRT1020-EVK board, I set this board as I2C master, add UART TX, UART RX, totally using 4 DMA channels. I modify some code both of MIMXRT1020-EVK project and MIMXRT1064-EVK project.
The result is both projects run Okay.
So please check your code, the critical code I have shown you bellow.
Please try it, and tell me to close this case.
If you still have question, Please create a new case.
BR
mayliu Re: UART3 overrun error occurs RT1020 Hi @mayliu , Thanks for reply. I'm using bare matel not freeRTOS. Please bare board project and check. Re: UART3 overrun error occurs RT1020 Hi @hanmant ,
Thanks for your reply, I will try do it on my side.
Please let me know if your project is using the FreeRTOS operating system or using a bare board. I will try to create a project as you do and validate , It is very import.
Please keep patience,thanks.
BR
mayliu Re: UART3 overrun error occurs RT1020 Hi @mayliu, Thank for reply. Can you simulate these things at your side by just adding Two DMA's one is UART and another is I2C and check priority get conflicts or not Re: UART3 overrun error occurs RT1020 Hi @hanmant ,
Thanks for the reply.
If you do not mind, Please create a new case because current case list too much item.
If you want your modules work well with DMA, especially some modules need to be processed in a timely manner, you should consider the prioritization of all DMA channels used.
I do not know your project and DMA priority configuration. So please send me your code if it is convenient.
If not convenient, I suggest you consider this two function, double check the parameters.
void EDMA_SetChannelPreemptionConfig(DMA_Type *base, uint32_t channel, const edma_channel_Preemption_config_t *config)
NVIC_SetPriority
Wish it helps you. If you still have question about it, please kindly let me know.
BR
mayliu Re: UART3 overrun error occurs RT1020 Hi @mayliu, Thank for reply. Can please tell me how to resolve this issue. Still I'm facing this DMA priority issue. Re: UART3 overrun error occurs RT1020 Hi @hanmant ,
Thanks for your update.
I rechecked your reply, I think you are right. Most likely, it is because conflicting priority between I2C DMA and UART DMA.
Wish it helps you. If you still have question about it, please kindly let me know.
Best Regards
mayliu
Re: UART3 overrun error occurs RT1020 Hi @mayliu, Thank for update, My custom board RT1020 is i2c master and it is connected with slave DAC and it is works fine. But my problem is when i'm tried to add the channel priority(EDMA_SetChannelPreemptionConfig) config code then the code will stuck into i2c dma. Re: UART3 overrun error occurs RT1020 Hi @hanmant ,
Thanks for your update.
The reason of your Application got stuck is the I2C master node of your development board needs to be connected to the I2C slave node.
I verified it with my development board, and if I don't connect to the I2C slave node, I get an error as you. If I use two development board, one is "lpi2c_edma_b2b_transfer_master", the other is "lpi2c_edma_b2b_transfer_slave". connect two boards correctly, the program run well.
You can create a "lpi2c_edma_b2b_transfer_master" project and don't add any other code to validate.
Best Regards
mayliu Re: UART3 overrun error occurs RT1020 Hi @mayliu, This is "lpi2c_edma_b2b_transfer_master" my whole project name under this name i have added all modules like uart dma ,spi and i2c dma etc. When i removed priority related then application works fine Re: UART3 overrun error occurs RT1020 Hi @hanmant ,
I do not think this problem related with current case subject" UART3 overrun error occurs RT1020".
I import SDK demo as you do, I find that this demo "lpi2c_edma_b2b_transfer_master" need lpi2c instance on the other board as slave.
Because of no I2C slave, lpi2c_master_callback can not be called, so you application got stuck.
BR
mayliu
Re: UART3 overrun error occurs RT1020 Hi @mayliu1 Thanks for update. it is getting stuck into I2c DMA. here i have one question : Is it conflicting priority between I2C DMA and UART DMA but in I2C DMA i have not set the Priority. Re: UART3 overrun error occurs RT1020 Dear @hanmant ,
Thanks for the update.
you said your whole application got stuck when you add the functions.
Can you tell me the detail information when your whole application got stuck.
1: where your application got stuck, Please tell me which function.
2: when your application got stuck, Please read your RT1020 Registers, Faults, Peripherals status, check whether something unusual.
The following Fig is just a demo to help you check the problem.
Wish it helps you!
Best Regards
mayliu Re: UART3 overrun error occurs RT1020 Hi @mayliu This piece of code is not working ,means when i add this lines code in my code then whole application got stuck const edma_channel_Preemption_config_t Channel_preemption_config = { .enableChannelPreemption = false, .enablePreemptAbility = true, .channelPriority = 15U }; const edma_channel_Preemption_config_t Channel14_preemption_config = { .enableChannelPreemption = false, .enablePreemptAbility = true, .channelPriority = 14U }; EDMA_SetChannelPreemptionConfig(EXAMPLE_LPUART_DMA_BASEADDR,LPUART_TX_DMA_CHANNEL, &Channel_preemption_config); EDMA_SetChannelPreemptionConfig(EXAMPLE_LPUART_DMA_BASEADDR, LPUART_RX_DMA_CHANNEL, &Channel14_preemption_config); Note: with this uart DMA there is another i2c DMA also there but i have not set priority of i2c DMA Re: UART3 overrun error occurs RT1020 Dear @hanmant ,
I wish you success, and also I have a little advice.
It is better put NVIC_SetPriority function after LPUART_TransferCreateHandleEDMA function.
I'm waiting for your good news.
Best Regards
mayliu Re: UART3 overrun error occurs RT1020 Hi @mayliu, Thank you for reply lpuart_config_t lpuartConfig; lpuart_transfer_t sendXfer; lpuart_transfer_t receiveXfer; edma_config_t userConfig = {0}; uint32_t uiCnt = 0; /* Initialize the LPUART. */ /* * lpuartConfig.baudRate_Bps = 115200U; * lpuartConfig.parityMode = kLPUART_ParityDisabled; * lpuartConfig.stopBitCount = kLPUART_OneStopBit; * lpuartConfig.txFifoWatermark = 0; * lpuartConfig.rxFifoWatermark = 0; * lpuartConfig.enableTx = false; * lpuartConfig.enableRx = false; */ LPUART_GetDefaultConfig(&lpuartConfig); lpuartConfig.baudRate_Bps = UART3_BAUDRATE; lpuartConfig.enableTx = true; lpuartConfig.enableRx = true; LPUART_Init(DEMO_LPUART, &lpuartConfig, DEMO_LPUART_CLK_FREQ); // Set NVIC priority for the DMA interrupt to highest priority NVIC_SetPriority(DMA0_DMA16_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(), 0, 0)); // Highest priority for DMA0 interrupt // DMA1_DMA17_IRQn #if defined(FSL_FEATURE_SOC_DMAMUX_COUNT) && FSL_FEATURE_SOC_DMAMUX_COUNT /* Init DMAMUX */ DMAMUX_Init(EXAMPLE_LPUART_DMAMUX_BASEADDR); /* Set channel for LPUART */ DMAMUX_SetSource(EXAMPLE_LPUART_DMAMUX_BASEADDR, LPUART_TX_DMA_CHANNEL, LPUART_TX_DMA_REQUEST); DMAMUX_SetSource(EXAMPLE_LPUART_DMAMUX_BASEADDR, LPUART_RX_DMA_CHANNEL, LPUART_RX_DMA_REQUEST); DMAMUX_EnableChannel(EXAMPLE_LPUART_DMAMUX_BASEADDR, LPUART_TX_DMA_CHANNEL); DMAMUX_EnableChannel(EXAMPLE_LPUART_DMAMUX_BASEADDR, LPUART_RX_DMA_CHANNEL); #endif /* Init the EDMA module */ EDMA_GetDefaultConfig(&userConfig); #if defined(BOARD_GetEDMAConfig) BOARD_GetEDMAConfig(userConfig); #endif EDMA_Init(EXAMPLE_LPUART_DMA_BASEADDR, &userConfig); EDMA_CreateHandle(&g_lpuartTxEdmaHandle, EXAMPLE_LPUART_DMA_BASEADDR, LPUART_TX_DMA_CHANNEL); EDMA_CreateHandle(&g_lpuartRxEdmaHandle, EXAMPLE_LPUART_DMA_BASEADDR, LPUART_RX_DMA_CHANNEL); #if defined(FSL_FEATURE_EDMA_HAS_CHANNEL_MUX) && FSL_FEATURE_EDMA_HAS_CHANNEL_MUX EDMA_SetChannelMux(EXAMPLE_LPUART_DMA_BASEADDR, LPUART_TX_DMA_CHANNEL, DEMO_LPUART_TX_EDMA_CHANNEL); EDMA_SetChannelMux(EXAMPLE_LPUART_DMA_BASEADDR, LPUART_RX_DMA_CHANNEL, DEMO_LPUART_RX_EDMA_CHANNEL); #endif // Set DMA channel priorities // EXAMPLE_LPUART_DMA_BASEADDR->DCHPRI[LPUART_TX_DMA_CHANNEL] = (EXAMPLE_LPUART_DMA_BASEADDR->DCHPRI[LPUART_TX_DMA_CHANNEL] & ~DMA_DCHPRI_CHPRI_MASK) | DMA_DCHPRI_CHPRI(15); // EXAMPLE_LPUART_DMA_BASEADDR->DCHPRI[LPUART_RX_DMA_CHANNEL] = (EXAMPLE_LPUART_DMA_BASEADDR->DCHPRI[LPUART_RX_DMA_CHANNEL] & ~DMA_DCHPRI_CHPRI_MASK) | DMA_DCHPRI_CHPRI(15); // EXAMPLE_LPUART_DMA_BASEADDR->DCHPRI0 const edma_channel_Preemption_config_t Channel_preemption_config = { .enableChannelPreemption = false, .enablePreemptAbility = true, .channelPriority = 14U }; const edma_channel_Preemption_config_t Channel14_preemption_config = { .enableChannelPreemption = false, .enablePreemptAbility = true, .channelPriority = 15U }; EDMA_SetChannelPreemptionConfig(EXAMPLE_LPUART_DMA_BASEADDR,LPUART_TX_DMA_CHANNEL, &Channel_preemption_config); EDMA_SetChannelPreemptionConfig(EXAMPLE_LPUART_DMA_BASEADDR, LPUART_RX_DMA_CHANNEL, &Channel14_preemption_config); /* Create LPUART DMA handle. */ LPUART_TransferCreateHandleEDMA(DEMO_LPUART, &g_lpuartEdmaHandle, LPUART_UserCallback, NULL, &g_lpuartTxEdmaHandle, &g_lpuartRxEdmaHandle); Im thinking to use this way . Re: UART3 overrun error occurs RT1020 Hi @hanmant ,
Please review the differences between the following definitions and use them according to your needs.
EDMA_SetChannelPreemptionConfig: It is primarily used to configure the preemption priority of DMA channels, ensuring the most important task can be processed first, when multiple DMA tasks happened at the same time.
NVIC_SetPriority: It is used to set the priority of interrupts, ensuring that high-priority interrupts can be responded to and processed by the CPU first when multiple interrupts happened at the same time.
Best Regards
mayliu Re: UART3 overrun error occurs RT1020 Hi @mayliu, I'm thinking add this way, const edma_channel_Preemption_config_t Channel_preemption_config = { .enableChannelPreemption = false, .enablePreemptAbility = true, .channelPriority = 14U }; const edma_channel_Preemption_config_t Channel14_preemption_config = { .enableChannelPreemption = false, .enablePreemptAbility = true, .channelPriority = 15U }; EDMA_SetChannelPreemptionConfig(EXAMPLE_LPUART_DMA_BASEADDR,LPUART_TX_DMA_CHANNEL, &Channel_preemption_config); EDMA_SetChannelPreemptionConfig(EXAMPLE_LPUART_DMA_BASEADDR, LPUART_RX_DMA_CHANNEL, &Channel14_preemption_config); is it correct or not. please confirm Re: UART3 overrun error occurs RT1020 Hi @hanmant ,
Thank you for your updated information.
I suggest you can use NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)function.
1: The first parameter is IRQn_Type:
It depends on your design, if UART3 using DMA channel 0(#define LPUART_TX_DMA_CHANNEL 0U), then the first parameter is DMA0_DMA16_IRQn.
2:The second parameter is priority, The lower value, the greater the priority of the corresponding interrupt.
Best Regards
mayliu Re: UART3 overrun error occurs RT1020 Hi @mayliu, Can you please tell me how to set Highest the Priority to DMA controller over CPU. Also in DMA i want set the highest priority to UART receive and TX than SPI. Please tell me the process and API's or any examples. Re: UART3 overrun error occurs RT1020 Hi @hanmant
Just add a delay function, I have shown to you.
SDK_DelayAtLeastUs(100000, CLOCK_GetFreq(kCLOCK_CpuClk));
1:In addition, I suggest you check whether the data format for UART sending and receiving is consistent.
2:Please confirm whether your NXP development board and TI development board share a common ground.
3:Please confirm whether the connection between UART transmission and reception is secure.
BR
mayliu Re: UART3 overrun error occurs RT1020 Thanks for reply. Can you please share your source code files. Re: UART3 overrun error occurs RT1020 Hi @hanmant
I think I know the reason of the problem.
Continuous data transmission in your program can cause Ti board UART receiver overrun, resulting in abnormal data transfer.
I suggest adding a delay after sending 52 bytes UART data, Please try it.
I have tested and verified this 100 times on my end, and the data sending and receiving are consistent.
Wish it helps you. If you still have question about it, please kindly let me know. Re: UART3 overrun error occurs RT1020 Hi @mayliu1 , Thanks for reply. As of now im not using uart receiver . whatever i shared with is only uart transmit only (size 52 buffer)but i dont receive correct data on my Ti board using dma. Re: UART3 overrun error occurs RT1020 Hi @hanmant
Thank you for your updated information.
As you said, if you only send UART data, why you ask me UART overrun error happened.
UART overrun error is related with UART receive.
and if you want to send UART data, It is very simple, just call LPUART_SendEDMA.
BR
mayliu Re: UART3 overrun error occurs RT1020 Thanks for reply. In this project i only send the data using DMA uart . So the my receiver is Ti processor device. I think priority does not matter in this example because here only DMA Uart is running. I have tried to send 2 bytes of data but still same issue . Give me solid solution to work this because this simple uart DMA transmission . Re: UART3 overrun error occurs RT1020 Hi @hanmant
Thank you for your updated information.
Can you tell me when and where you call the DMA UART receive function interface?
"In the source files(lpuart_edma_transfer.c) you sent, I didn't see any calls to the DMA UART data receive interface."
Please try to verify it according to the steps shown below. 1: Set the DMA_UART interrupt priority to be higher than other modules. 2: Use ping pong buffer to receive UART data.
Wish it helps you. If you still have question about it, please kindly let me know.
Best Regards
mayliu Re: UART3 overrun error occurs RT1020 Hi @mayliu1 , As per your suggestion i configured uart in DMA but still see the losses. I can see clear losses at receiver side(my receiver is another device comport). Re: UART3 overrun error occurs RT1020 Hi @hanmant
I highly recommend you using the DMA UART , especially when UART baud rate is particularly high.
BR
mayliu Re: UART3 overrun error occurs RT1020 So , I have to implement DMA uart then? Re: UART3 overrun error occurs RT1020 Hi @hanmant
Question: This overrun problem is coming after inclusion of spi cmsis handler.
Answer: Due to the addition of spi cmsis handler, the entry of UART interrupt will be delayed and the UART data cannot be received in time.
BR
mayliu Re: UART3 overrun error occurs RT1020 Thanks for reply . This overrun problem is coming after inclusion of spi cmsis handler. Re: UART3 overrun error occurs RT1020 Hi @hanmant
Thanks for your update information.
If you use UART interrupt to send and receive UART data, every UART byte will trigger a UART interrupt.
Your UART baud rate is very high(3MBps) and will cause frequent entry UART interrupt, which is unreasonable.
I don't recommend you to use the UART interrupt when the UART baud rate is so high.
Best Regards
mayliu Re: UART3 overrun error occurs RT1020 Hi @mayliu1 , Please Note Currently im not using DMA uart. I'm using uart interrupt. Re: UART3 overrun error occurs RT1020 Hi @mayliu1 , Thanks for reply. Currently im using DMA uart. I'm using uart interrupt. Please see below code snippet. Re: UART3 overrun error occurs RT1020 Hi @hanmant
Thank you so much for your interest in our products and for using our community.
Usually, there are various causes of UART overrun errors, and it is necessary to consider various aspects such as data processing speed and interrupt processing.
In order to better help you solve the problem, please reply to the question below. First, Please tell me which DMA_UART interface function you call to receive UART data Second, Please tell me where and when you call DMA_UART interface function.
I have a few suggestions for you. 1: Set the DMA_UART interrupt priority to be higher than other modules. 2: Use ping pong buffer to receive UART data.
Wish it helps you. If you still have question about it, please kindly let me know.
Wish you a nice day!
Best Regards
mayliu
View full article