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 :

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?

  • I fully understand, and I'd also like to try on a nRF5 DK, but I don't have access to one... Though I did also try on a Thingy:52, and had the same problem.

  • I've tried to take source file you've attached. Ported it to 15.3 libuarte_async api, used on PCA10040 DK and picked gpio pins which are floating, not connected to anything. In fact, i got error on initialization. Then, I've modified nrf_libuarte_init line to use pullup for RX line:

    Error was gone. Seems to me that this is the problem there that GSM device does not have pull up. In the example, we use libuarte to communicate with Segger chip on DK and segger chip keeps line high. Please let me know if that helps.

    Regarding using libuarte with RTC and Softdevice, there is a bug that driver tries to control clock without softdevice. In case of softdevice presence following line should be removed:

  • Hi, thank you for your help. I tried enabling pullup on RX as you did and removed nrfx_clock_lfclk_start().

    But when calling nrf_libuarte_async_enable() I still have the same output errror:

    Though this time I do not have any error shown in NRF_UARTE0 error register (EVENTS_ERROR), contrary to last time.

    Still it seems that it fails to allocate a RX buffer, which may come from the same issue...

  • So there was actually another issue which is related to the fact that buffer size in balloc is increased to be aligned to 4 bytes and requested rx buffer size (255) becomes 256 (and that on 8 bits become 0). To workaround it for now, please change rx buffer size parameter in macro which creates libuarte_async instance to something smaller than 253.

    Like:

    NRF_LIBUARTE_ASYNC_DEFINE(libuarte, 0, 0, 0, NRF_LIBUARTE_PERIPHERAL_NOT_USED, 252, 3);

  • Thanks a lot, by modifyng this value I indeed do not have this error anymore.

Reply Children
No Data