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 !

Parents
  • Using SDK 15.3, SoftDevice 6.1.1 and with that the new libuarte library with my original program, I still have the same error (NRF_UARTE0->ERRORSRC = 0xC just after STARTRX), but I also have a new issue appearing in the logger:

    Apparently it can't allocate, or reallocate, a buffer for RX, despite having enough RAM.

    Could those two issues be linked ?

  • Could you check exactly which line is returning the error when allocating RX buffer? Have you tried adding external pullup to the RX pin to make sure that no noise is affecting it? Could you provide a logic trace of the RX line?

  • Of course, it is "nrf_balloc_alloc(p_libuarte->p_rx_pool)" called in the case NRF_LIBUARTE_EVT_RX_BUF_REQ in "uart_evt_handler()" in nrf_libuarte_async.c that seems to return NULL, and as so executing the "else" case : "NRF_LOG_ERROR("(evt) Failed to allocate buffer for RX.")".

    I can not add an external resistor on my custom PCB, but I activated the internal one for RX (and every other UART pins). Again I do not think this is a hardware problem, as everything works fine when using app_uart_fifo instead of libuarte. I can't provide a logic trace of RX for the moment, but it was ok when I tested it.

Reply
  • Of course, it is "nrf_balloc_alloc(p_libuarte->p_rx_pool)" called in the case NRF_LIBUARTE_EVT_RX_BUF_REQ in "uart_evt_handler()" in nrf_libuarte_async.c that seems to return NULL, and as so executing the "else" case : "NRF_LOG_ERROR("(evt) Failed to allocate buffer for RX.")".

    I can not add an external resistor on my custom PCB, but I activated the internal one for RX (and every other UART pins). Again I do not think this is a hardware problem, as everything works fine when using app_uart_fifo instead of libuarte. I can't provide a logic trace of RX for the moment, but it was ok when I tested it.

Children
No Data
Related