Dear Nordic fellows,
I have a Rigado BMD-350 that can transmit correctly bytes to another device via UARTE, but who cannot receive data correctly.
I'm using SDK15.3.0, softdevice 6.1.1.
For debugging, I disabled all the bluetooth stack, and I initialized only the UART module like this
void my_uarte_init()
{
nrfx_uarte_config_t uart_conf;
memset(&uart_conf,0,sizeof(uart_conf));
uart_conf.baudrate = NRF_UARTE_BAUDRATE_115200;//p_init->serial.baud;
uart_conf.hwfc = NRF_UARTE_HWFC_DISABLED;//p_init->serial.hwfc;
uart_conf.interrupt_priority = APP_TIMER_CONFIG_IRQ_PRIORITY; // 7
uart_conf.p_context = 0 ; //initialized by the nrfx init function
uart_conf.parity = NRF_UARTE_PARITY_EXCLUDED;//p_init->serial.parity;
uart_conf.pselcts = PIN_NOT_CONNECTED; //NOT_CONNECTED
uart_conf.pselrts = PIN_NOT_CONNECTED;
uart_conf.pselrxd = RX_PIN_NUMBER; //8
uart_conf.pseltxd = TX_PIN_NUMBER; //6
m_uart_instance = (nrfx_uarte_t)NRFX_UARTE_INSTANCE(0); //initialize UARTE0. the cast is safe to do
err_code = nrfx_uarte_init(&m_uart_instance,&uart_conf,handle_nrfx_event);
memset(m_tmp_buffer,0,UART_RX_BUF_SIZE);
memset(debug_buffer,0,UART_RX_BUF_SIZE);
debug_buffer_idx=0;
m_tmp_buf_idx=0;
m_tmp_buffer[0]=0;
nrfx_uarte_rx(&m_uart_instance,m_tmp_buffer,1);
}
Buffer are 250bytes long each.
For the debugging purposes, I receive only one byte per NRFX_UARTE_EVT_ENDRX event.
There are two problems:
- the number of bytes received is not correct
- Some messages are not received
This is the event handling function:
static void handle_nrfx_event(nrfx_uarte_event_t const *p_event ,void* p_context)
{
my_uart_evt_t event;// set the status to "Processing command"
switch(p_event->type)
{
case NRFX_UARTE_EVT_ERROR:
event.type = UART_EVT_UART_ERROR;
event.data.uart_err.err_code = p_event->data.error.error_mask;
event.data.uart_err.data = p_event->data.error.rxtx.p_data;
event.data.uart_err.length = p_event->data.error.rxtx.bytes;
handler(&event);
break;
case NRFX_UARTE_EVT_TX_DONE://NRFX_UARTE_EVT_TX_DONE:
event.type = UART_EVT_CMD_SENT;
handler(&event);
break;
case NRFX_UARTE_EVT_RX_DONE://NRFX_UARTE_EVT_RX_DONE:
//DEBUG
memcpy(&(debug_buffer[debug_buffer_idx]),p_event->data.rxtx.p_data,p_event->data.rxtx.bytes);
debug_buffer_idx += p_event->data.rxtx.bytes;
nrfx_uarte_rx(&m_uart_instance,m_tmp_buffer,1);
return;
}
}
When I test the function, sending 11 bytes ({0xb0,0xb0,0x0b,0x87,0x02,0x54,0x45,0x53,0x54,0x30,0x34}) at 115200 baud, 8N1 the debug_buffer, which only stores received data, is as follows: (I bolded the changes on the debug_buffer)
0B 87 02 54 45 53 54 30 ...
After the second transmission of the same 11 bytes, the debug_buffer becomes:
0B 87 02 54 45 53 54 30 34 B0 B0 ...
After the third:
0B 87 02 54 45 53 54 30 34 B0 B0 0B 87 02 54 45 53 54 30 ...
If, instead, I use nrfx_uarte_rx(&m_uart_instance, m_tmp_buffer,11) the device won't display the first reception of data, but at the second transfer the debug_buffer will be
0B 87 02 54 45 53 54 30 34 B0 B0 ...
which is all the data, but with the first two bytes at the end
I think I initialized the nrfx_uarte module correctly, and I think the minimal receiving procedure is correct.
Does anyone have a suggestion on what the problem could be?
Edit: added SDK