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

nRF51822 uart flow control

Hello,

I am using nrf starter kit and nRF51822 DK modules atached. I'm using external usb-com uart modules (based on FT232 chips) for communication with PC (Win7) and hyper terminal clients for data send/receive. Currently I'm experimenting with modified gazell example project to include data received from uart and to transfer between modules as in com cable replacement setup. If I connect usb-com modules directly with each other (thus error free communication) and set baudrate 921600bps, I can transfer data at aproximately 890kpbs transfer rate (using zmodem file transfer). Now i'm trying to include radio transfer in data path. Uart is configured with hardware flow control, uart module on nrf51 is configured on high priority with extended buffering (fifo like size of 1kB) and aditional checking for receive buffer usage to stop and start RX transfers. Uart Error interrupt is enabled and i'm getting several errors representing Buffer overflow during large data chunk receive (3-15kB in size). I'm guessing that hardware flow control is not quick enough to prevent RX register overwriting. Another issue is stopping RX transfer without data loss. I'm thinking that it could be possible to use aditional I/O for RTS/CTS manual control together with uart hardware to pause Rx transfers correctly. What solutions could be usable to correct flow control not lowering baudrate? as this is the basis of transportation layer for later tasks.

Parents
  • The latest app_uart_fifo file (included in the SDK 9) contains a bug. 3 bytes where systematically lost (even with HFC) because of a bug in the UART0_IRQHandler function.

    Be sure that the in the UART0_IRQHandler function you check that the RX FIFO is not full before reading the RXD register or some bytes will be lost !

    if (FIFO_LENGTH(m_rx_fifo) <= m_rx_fifo.buf_size_mask)
        err_code = app_fifo_put(&m_rx_fifo, (uint8_t) NRF_UART0->RXD);
        // ...
    

    I successfully transferred a 2MB file over a UART link (115'200 bauds) without any error, using the new chip revision with the six-byte buffer.

  • FYI, the RXD register is not any more read each time the UART0 ISR occurs. To avoid deadlock and to resume to UART stream (to active the CTS again), the app_uart_get function must also be updated: the RXD register must be read if an overflow occurs.

    I am not sure if my patch is the best solution, but now you are aware of this bug. Thank you @Aryan to add it on the list.

Reply Children
No Data
Related