Hello everyone,
I am trying to implement UARTE on a custom board embedding an nRF52832, as part of an upgrade from SDK 12 to SDK 15. The nRF52832 is communicating via UART with a GSM chip, sending it messages and receiving some, with different lengths. I am using FreeRTOS.
In order to do that, I checked the example "experimental_libuarte" that is present in the SDK 15.2 file (nRF5_SDK_15.2.0_9412b96/examples/peripheral/experimental_libuarte).
But after implementing it in my project, I always have the same error: as soon as the STARTRX flag is raised, when calling "nrf_libuarte_async_enable(1)", the EVENTS_ERROR register pass to 1, and the ERRORSRC register shows 0xC, so framing and break errors. This happens before anything is send or retrieved.
I then tried to run only the example program, so without SoftDevice and FreeRTOS, and I have the same error.
After configuration and initialization of UARTE0, everything seems to be fine with UARTE0 register.
r
But as soon as the enabling is done by calling "nrf_libuarte_async_enable(1)", the error appears.

The error is more precisely thrown as soon as the STARTRX flag is raised, inside the "nrf_libuarte_async_enable()" function.
At first I thought that it might be a hardware error, that could for example put the RX line to 0V, interpreted as sending an infinite amount of "0", but it is not : the program worked well when using UART FIFO before, and the RX line is driven high by the nRF52832.
I am adding the main file here, that I slightly modified to match my pins settings and to initialize external clock and gsm chip :
#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include "nrf_libuarte_async.h"
#include <bsp.h>
#include "nrf_delay.h"
#define GSM_TXD_PIN 30
#define GSM_RXD_PIN 29
#define GSM_DTR_PIN 28
#define GSM_RI_PIN 27
#define GSM_CTS_PIN 26
#define GSM_RTS_PIN 25
#define GSM_PWR_PIN 31
#define ENABLE_4V_PIN 6
static uint8_t text[] = "UART example started.\r\n Loopback:\r\n";
static uint8_t text_size = sizeof(text);
void uart_event_handler(nrf_libuarte_async_evt_t * p_evt)
{
static uint8_t ch = 0;
ret_code_t ret;
switch (p_evt->type)
{
case NRF_LIBUARTE_ASYNC_EVT_ERROR:
bsp_board_led_invert(0);
break;
case NRF_LIBUARTE_ASYNC_EVT_RX_DATA:
ch = p_evt->data.rxtx.p_data[0];
nrf_libuarte_async_rx_free(p_evt->data.rxtx.p_data, p_evt->data.rxtx.length);
ret = nrf_libuarte_async_tx(&ch, 1);
APP_ERROR_CHECK(ret);
bsp_board_led_invert(1);
break;
case NRF_LIBUARTE_ASYNC_EVT_TX_DONE:
bsp_board_led_invert(2);
break;
default:
break;
}
}
/**
* @brief Function for main application entry.
*/
int main(void)
{
//External clock init
NRF_CLOCK->EVENTS_HFCLKSTARTED = 0;
NRF_CLOCK->TASKS_HFCLKSTART = 1;
while(NRF_CLOCK->EVENTS_HFCLKSTARTED == 0) { }
NRF_CLOCK->LFCLKSRC = (CLOCK_LFCLKSRC_SRC_Xtal << CLOCK_LFCLKSRC_SRC_Pos);
NRF_CLOCK->EVENTS_LFCLKSTARTED = 0;
NRF_CLOCK->TASKS_LFCLKSTART = 1;
while(NRF_CLOCK->EVENTS_LFCLKSTARTED == 0) { }
//Turning on GSM chip
nrf_gpio_cfg_output(ENABLE_4V_PIN);
nrf_gpio_pin_clear(ENABLE_4V_PIN);
nrf_delay_ms(200);
nrf_gpio_pin_set (ENABLE_4V_PIN);
nrf_gpio_cfg_output(GSM_PWR_PIN);
nrf_gpio_pin_set(GSM_PWR_PIN);
nrf_delay_ms(4200);
//UARTE0 configuration
nrf_libuarte_async_config_t nrf_libuarte_async_config =
{
.rx_pin = GSM_RXD_PIN,
.tx_pin = GSM_TXD_PIN,
.cts_pin = GSM_CTS_PIN,
.rts_pin = GSM_RTS_PIN,
.timeout_us = 100,
.baudrate = NRF_UARTE_BAUDRATE_57600,
.parity = NRF_UARTE_PARITY_EXCLUDED,
.hwfc = NRF_UARTE_HWFC_ENABLED
};
//UARTE0 initialization
ret_code_t err_code = nrf_libuarte_async_init(&nrf_libuarte_async_config, uart_event_handler);
APP_ERROR_CHECK(err_code);
//UARTE0 enabled (and rx start)
nrf_libuarte_async_enable(1);
err_code = nrf_libuarte_async_tx(text, text_size);
APP_ERROR_CHECK(err_code);
while (true)
{
}
}
Thank you for your help !