I'm trying to use the eDMA UART module on a Kinetis K64. Code has been based on the example from the SDK.
Everything works ok during normal operation, but when a bad packet is received (eg. frame error) the Kinetis stops receiving and the eDMA receive operation never completes.
I would like to be able to recover from errors (parity, framing, noise, etc) by discarding the data in the buffer and starting a new receive operation. I've written some code to check status flags for errors and start a new receive operation when an error is detected;
uint32_t active_flags = UART_GetStatusFlags(p_base);
uint32_t error_flags = kUART_NoiseErrorFlag | kUART_FramingErrorFlag | kUART_ParityErrorFlag;
if (active_flags & error_flags)
{
UART_TransferAbortReceiveEDMA(p_base, &uart_edma_handle);
UART_ClearStatusFlags(p_base, error_flags);
uart_transfer_t xfer;
xfer.dataSize = RX_BUF_SIZE;
xfer.data = rx_buf;
UART_ReceiveEDMA(p_base, &uart_edma_handle, &xfer);
}
This isn't working. After the receive operation is restarted the subsequent data coming in on the RX line gets missed. Calls to UART_TransferGetReceiveCountEDMA() return 0. Eventually, after a few seconds and many bytes of missed data, it starts receiving again.
Any ideas what could be causing this?