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

nrf52832: ERRORSRC 0xC with UARTE0 when starting RX.

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 !

  • Hi,

    Could you try updating libuarte to SDK 15.3.0? There is some changes in the latest version. Have you checked the RX pin with a logic analyzer, to make sure there is no noise on the line? This is the typical reason for this issue to appear.

    Best regards,
    Jørgen

  • Hi,

    Thank you for your answer, I will try using the libuarte from the SDK 15.3.0 and update the results here.

    I did check the RX pin yes, it works fine, that is why I don't think it is a hardware problem...

    Regards,

    Pierre

    EDIT: I still have the same error using the libuarte example from SDK 15.3.0. I also tried to activate internal pullups on UART pins (RX, TX, CTS and RTS), as I read it might not be done by default. I used for that "nrf_gpio_cfg_input(GSM_RXD_PIN,NRF_GPIO_PIN_PULLUP);". Also, when trying to use the new libuarte with my project, I get a SOFTDEVICE: INVALID MEMORY ACCESS error during initialization.

  • I also have another issue when using libuarte library from SDK 15.3 with SoftDevice (and FreeRTOS).

    When calling nrf_libuarte_async_init(), after entering nrfx_clock_lfclk_start(), I have a SOFTDEVICE: INVALID MEMORY ACCESS. INFO 0x1 error when calling nrf_clock_event_clear(NRF_CLOCK_EVENT_LFCLKSTARTED) inside nrfx_clock_lfclk_start(). I do not have this error without SoftDevice, which seems logic as memory areas not accessible with SoftDevice become accessible without it. Problem is I can't see any pointers pointing to an unaccessible area...

    Is it no longer possible to use libuarte with SoftDevice, are is there some ajustments to do implement ?

    EDIT: Ok, this issue has been solved by disabling RTC and using Timers instead when initializating and enabling uarte with libuarte.

  • I have exactly the same problem. I am using a Particle Boron board which has an nRF52840 and an u-blox SARA U201 2G/3G modem on it. I modified the uart example program for dev board PCA10056 to establish the uart communication between the nRF52840 and the modem. After calling APP_UART_FIFO_INIT(), an app uart communication error occurs with the error code 0x0C. 

  • Well, when I use app_uart_fifo library instead of libuarte and libuarte_async libraries it actually works for me !

Related