This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

[NRF51822QFAC][SDK11] How to recover Uart errors

Hi,

I'm trying to interface SIM808 with nrf51822 over uart using nrf_drv_uart. Everything works well for some time, but then uart starts reporting error code 1, NRF_UART_ERROR_PARITY_MASK, for all transactions on uart. Re-initializing the uart doesn't correct it. Also the time after which error starts appearing is also random, varies from 15 minutes to 1 hour. The problem is not with the module as when the error occurs, I can still communicate with the module using external uart to usb. Here is what I think is relevant information:

  • Baudrate is 115200
  • Tx is blocking
  • Listen to rx for 20ms
  • Max transaction size for rx is 10 bytes

I can upload the code, if necessary.

Hoping for a positive response and thanks in advance :)

Parents
  • When you get a parity error you will not get the RX complete event for that particular byte. You should do this in your uart event handler.

    static void uart_event_handler(nrf_drv_uart_event_t * p_event, void* p_context)
    {
       ...
       ...
    
        else if (p_event->type == NRF_DRV_UART_EVT_ERROR)
        {
            nrf_uart_event_clear(NRF_UART0, NRF_UART_EVENT_TXDRDY);
            nrf_uart_event_clear(NRF_UART0, NRF_UART_EVENT_RXTO);
            nrf_uart_event_clear(NRF_UART0, NRF_UART_EVENT_ERROR);  /* thanks for correction Lalit*/
            nrf_drv_uart_uninit
            nrf_drv_uart_init
     
        }
    
       ...
       ...
    }
    
Reply
  • When you get a parity error you will not get the RX complete event for that particular byte. You should do this in your uart event handler.

    static void uart_event_handler(nrf_drv_uart_event_t * p_event, void* p_context)
    {
       ...
       ...
    
        else if (p_event->type == NRF_DRV_UART_EVT_ERROR)
        {
            nrf_uart_event_clear(NRF_UART0, NRF_UART_EVENT_TXDRDY);
            nrf_uart_event_clear(NRF_UART0, NRF_UART_EVENT_RXTO);
            nrf_uart_event_clear(NRF_UART0, NRF_UART_EVENT_ERROR);  /* thanks for correction Lalit*/
            nrf_drv_uart_uninit
            nrf_drv_uart_init
     
        }
    
       ...
       ...
    }
    
Children
Related