Hi Dave,
I'm on KSDK 1.2 (KDS v3.0.0 - same as Carlos). My situation is a bit different. When I'm sending large amounts of data via ethernet, the UART will timeout. The UART interrupt wasn't getting triggered and a character would be lost. I tried your solution, and indeed during the losses, the detected_overrun flag is set to true. However, I still lose the data and the packet I transmitted to UART is invalid.
Is that your expectation? Or was your solution to avoid the loss of data to UART?
The code you posted is a bit different than what I saw in fsl_uart_driver.c - so I have posted that to see if I misinterpreted something.
Thanks in advance!
void UART_DRV_IRQHandler(uint32_t instance)
{
uart_state_t * uartState = (uart_state_t *)g_uartStatePtr[instance];
UART_Type * base = g_uartBase[instance];
/* Exit the ISR if no transfer is happening for this instance. */
if ((!uartState->isTxBusy) && (!uartState->isRxBusy))
{
return;
}
/* Handle receive data register full interrupt, if rx data register full
* interrupt is enabled AND there is data available. */
if((UART_BRD_C2_RIE(base)) && (UART_BRD_S1_RDRF(base)))
{
#if FSL_FEATURE_UART_HAS_FIFO
/* Read out all data from RX FIFO */
while(UART_HAL_GetRxDatawordCountInFifo(base))
{
#endif
/* Dave's changes from https://community.freescale.com/thread/341862 */
bool detected_overrun = false;
if (UART_HAL_GetStatusFlag(base, kUartRxOverrun)) {
base->CFIFO |= UART_CFIFO_RXFLUSH_MASK;
base->PFIFO &= ~UART_PFIFO_RXFE_MASK;
uartState->rxBuff[0] = base->D;
base->PFIFO |= UART_PFIFO_RXFE_MASK;
detected_overrun = true;
_rbatra_count++;
}
if (UART_HAL_GetStatusFlag(base, kUartFrameErr)) {
// TODO: I have verified framing errors, need to address after RX overrun
UART_HAL_ClearStatusFlag(base, kUartFrameErr);
}
if (UART_HAL_GetStatusFlag(base, kUartNoiseDetect)) {
UART_HAL_ClearStatusFlag(base, kUartNoiseDetect);
}
/* Get data and put into receive buffer */
if( !detected_overrun) {
// Originally wasn't rapped with detected_overrun but added per forum.
UART_HAL_Getchar(base, uartState->rxBuff);
}
/* End of changes - but see below for comment out section*/
/* Invoke callback if there is one */
if (uartState->rxCallback != NULL)
{
uartState->rxCallback(instance, uartState);
}
else
{
++uartState->rxBuff;
--uartState->rxSize;
/* Check and see if this was the last byte */
if (uartState->rxSize == 0U)
{
UART_DRV_CompleteReceiveData(instance);
#if FSL_FEATURE_UART_HAS_FIFO
break;
#endif
}
}
#if FSL_FEATURE_UART_HAS_FIFO
}
#endif
}
/* Handle transmit data register empty interrupt, if tx data register empty
* interrupt is enabled AND tx data register is currently empty. */
... DIDN'T POST THIS CODE AS NO CHANGES TILL END....
/* Handle receive overrun interrupt */
/* COMMENTED THIS OUT AS DAVE HAD CHECK ABOVE */
//if (UART_HAL_GetStatusFlag(base, kUartRxOverrun))
//{
// /* Clear the flag, OR the rxDataRegFull will not be set any more */
// UART_HAL_ClearStatusFlag(base, kUartRxOverrun);
//}
}