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

NRF52840 UART high error rate communicating with Raspberry Pi

I am using nrf52840 DK and communicate with Raspberry Pi 3 through UART port. The Raspberry Pi is used as a gateway. The baud rate is set at 115200 default on both nrf52840 and Raspberry Pi 3. Raspberry Pi 3 is using GPIO14 and GPIO15 and its UART is set up by following the official guide.

Since this is a direct wired connection from nrf52840 and Raspberry Pi 3, it does not involve the soft device. The SDK version is 17.0.2.

I found that there is rather high data error rate during the UART data transmission. For 300 sets of data transmitted from nrf52840 to Raspberry Pi, there are 13-15 set of data dropping one byte. The dropping byte position is not fixed. This is about 4% error, which is too high? 

I am using the standard Nordic UART function following the examples. 

The following is the UART init function:

static void uart_init(void)
{
ret_code_t err_code;

app_uart_comm_params_t const comm_params =
{
.rx_pin_no = RX_PIN_NUMBER,
.tx_pin_no = TX_PIN_NUMBER,
.rts_pin_no = RTS_PIN_NUMBER,
.cts_pin_no = CTS_PIN_NUMBER,
.flow_control = APP_UART_FLOW_CONTROL_DISABLED,
.use_parity = false,
.baud_rate = UART_BAUDRATE_BAUDRATE_Baud115200
};

APP_UART_FIFO_INIT(&comm_params,
UART_RX_BUF_SIZE,
UART_TX_BUF_SIZE,
uart_event_handle,
APP_IRQ_PRIORITY_LOWEST,
err_code);

APP_ERROR_CHECK(err_code);
}

The following is the sending data function:

static void ble_uart_send(uint8_t * p_data, uint16_t data_len)
{
ret_code_t ret_val;


for (uint32_t i = 0; i < data_len; i++)
{
do
{
ret_val = app_uart_put(p_data[i]);

if ((ret_val != NRF_SUCCESS) && (ret_val != NRF_ERROR_BUSY))
{
NRF_LOG_INFO("app_uart_put failed for index 0x%04x.", i);

}
} while (ret_val == NRF_ERROR_BUSY);
}

// Add two end bytes to identify the ending of the packet
do
{

ret_val = app_uart_put(0xAA);
if ((ret_val != NRF_SUCCESS) && (ret_val != NRF_ERROR_BUSY))
{
NRF_LOG_INFO("app_uart_put failed\r\n");

}
} while (ret_val == NRF_ERROR_BUSY);
do
{
ret_val = app_uart_put('\n');
if ((ret_val != NRF_SUCCESS) && (ret_val != NRF_ERROR_BUSY))
{
NRF_LOG_INFO("app_uart_put failed\r\n");

}
} while (ret_val == NRF_ERROR_BUSY);

}

Parents Reply Children
No Data
Related