Dear Nordic fellows,
I have a NRF52832 and I want to configure the UARTE peripheral driver in not blocking mode. I want to try and exploit the double buffered DMA. I'm using nRF5_SDK17.1.0
I read the documentation but find it sparse.
This is part of my code:
#define BLE_UARTE_RXD_BUFF_SIZE 22
static nrfx_uarte_t uarteInstance;
static uint8_t bleUarteDriverRxBuff[BLE_UARTE_RXD_BUFF_SIZE] = {0};
static uint8_t bleUarteDriverSecondaryRxBuff[BLE_UARTE_RXD_BUFF_SIZE] = {
0};
static uint8_t bleUarteRxBuff[BLE_UARTE_RX_BUFF_SIZE] = {0};
static uint16_t bleUarteRxBuffWrIdx = 0;
void ble_uarte_init(const nrfx_uarte_event_handler_t event_handler)
{
nrfx_err_t errorCode;
uarteInstance = (nrfx_uarte_t)NRFX_UARTE_INSTANCE(0);
const nrfx_uarte_config_t configUarte = {BLE_UARTE_TXD_PIN_NUMBER,
BLE_UARTE_RXD_PIN_NUMBER,
BLE_UARTE_CTS_PIN_NUMBER,
BLE_UARTE_RTS_PIN_NUMBER,
NULL,
BLE_UARTE_HWFC,
BLE_UARTE_PARITY,
BLE_UARTE_BAUDRATE,
BLE_UARTE_IRQ_PRIORITY};
errorCode = nrfx_uarte_init(&uarteInstance, &configUarte, event_handler);
APP_ERROR_CHECK(errorCode);
/* Set main buffer */
nrfx_uarte_rx(&uarteInstance, bleUarteDriverRxBuff, BLE_UARTE_RXD_BUFF_SIZE);
APP_ERROR_CHECK(errorCode);
/* Set secondary buffer */
nrfx_uarte_rx(&uarteInstance, bleUarteDriverSecondaryRxBuff, BLE_UARTE_RXD_BUFF_SIZE);
APP_ERROR_CHECK(errorCode);
}
uint32_t ble_uarte_get(nrfx_uarte_event_t *pUarteEvt)
{
nrfx_err_t errorCode = NRF_SUCCESS;
if (pUarteEvt->data.rxtx.bytes)
{
memcpy(&bleUarteRxBuff[bleUarteRxBuffWrIdx], pUarteEvt->data.rxtx.p_data, BLE_UARTE_RXD_BUFF_SIZE);
bleUarteRxBuffWrIdx = bleUarteRxBuffWrIdx + 22;
if (bleUarteRxBuffWrIdx == BLE_UARTE_RX_BUFF_SIZE)
{
bleUarteRxBuffWrIdx = 0;
}
}
else
{
errorCode = NRF_ERROR_NOT_FOUND;
}
return errorCode;
}
void ble_uarte_event_handler(nrfx_uarte_event_t const *pUarteEvt, void *pContext)
{
switch (pUarteEvt->type)
{
case NRFX_UARTE_EVT_RX_DONE:
if (ble_uarte_get(pUarteEvt) == NRF_SUCCESS)
{
test_send_eco();
}
// Call to nrfx_uarte_rx(...)??
break;
case NRFX_UARTE_EVT_TX_DONE:
break;
case NRFX_UARTE_EVT_ERROR:
APP_ERROR_HANDLER(pUarteEvt->data.error);
break;
default:
break;
}
}
Q1. The third parameter of nrfx_uarte_rx(...) is the length of the buffer I want to set? (Line 31)
Q2. Is it necessary to call nrfx_uarte_rx(...) after processing every 22 bytes received ? If so, with which parameters? One for main and one for secondary buffer? (Line 71)
Q3. The correct way to process the received that is to read pUarteEvt->data.rxtx.p_data when received an NRFX_UARTE_EVT_RX_DONE event? (Line 45)
If you have any further pointers or could clarify the usage of double buffering on RX transfers that would be great!
Thanks in advance,
Fernando.