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

UART usage - I cannot see the light in the SDK

In advance I would like to say I’m sorry for the frustration that this message reflects…Event though I have been using the UART for some time, adding more functionality makes me search documentation for a UART description, and this makes me really frustrated.

I have what I think is a relatively simple need, I want to use UART0 and UART1 on a nRF32840 (both for some RS485 communication).

 

I do not care if it is NRF_DRV, NRFX or APP layer, anything that can be made to work will do!

 

Originally, I thought that selecting between NRF or NRFX was simple; documents suggest that NRF is legacy and I should use the "new" NRFX layer.

So selecting NRFX_UART_ENABLE would be logical and then including nrfx_uart.c driver file.....

But nothing is that simple with this SDK.... there always seems to be a mess of dependencies between configuration macros and files you need to include. and absolutely nothing that documents it (except heavy reading of header files of course ;-). I would love to see. “If you want this layer, tick this in SDK config and include ….”)

Well initial suggestion as above for NRFX just creates a bunch of errors…. so what is the combination needed...

It seems I can choose between using:

1 nrf_drv_uart

2 nrfx_uart

3 nrfx_uarte

4 app_uart

Can anyone suggest settings that will make just one of these options work, it would be highly appreciated and hopefully spare me a lot of testing and experimentation.

What I’m looking for what is a combination of what should be in SDK Config for

NRFX_UARTE section

NRFX_UART section

NRF_DRV (UART_ENABLED) section

APP_UART_ENABLED (+APP_FIFO_ENABLED) section

And any other sections that have dependencies!

I want to be able to call ???_init, send one or more bytes and receive bytes one by one

  • Tried out nrf_serial library. But unfortunately again stuck.

    <error> app: ERROR 8 [NRF_ERROR_INVALID_STATE] at ..\..\..\..\..\..\components\libraries\log\src\nrf_log_backend_uart.c:67
    PC at: 0x00030559

    Cant really figure out why.

    In main I only initialize log and timers and then I try to initialize serial library.

    It fails inside nrf_serial_init() in the function nrf_drf_uart_init() when forwarding the call to nrfx_uart_init(). This function seems to get something wrong. Really difficult to see what.

    I have taken all configuration from the example only changed a little:

    NRF_SERIAL_DRV_UART_CONFIG_DEF(m_uart_drv_config,
    RX1_PIN_NUMBER, TX1_PIN_NUMBER,
    0, 0,
    NRF_UART_HWFC_DISABLED, NRF_UART_PARITY_EXCLUDED,
    NRF_UART_BAUDRATE_9600,
    UART_DEFAULT_CONFIG_IRQ_PRIORITY);

    #define SERIAL_FIFO_TX_SIZE 32
    #define SERIAL_FIFO_RX_SIZE 32

    NRF_SERIAL_QUEUES_DEF(serial_queues, SERIAL_FIFO_TX_SIZE, SERIAL_FIFO_RX_SIZE);

    #define SERIAL_BUFF_TX_SIZE 1
    #define SERIAL_BUFF_RX_SIZE 1

    NRF_SERIAL_BUFFERS_DEF(serial_buffs, SERIAL_BUFF_TX_SIZE, SERIAL_BUFF_RX_SIZE);
    NRF_SERIAL_CONFIG_DEF(serial_config, NRF_SERIAL_MODE_IRQ, &serial_queues, &serial_buffs, SerialEventHandler, SerialSleepHandler);
    NRF_SERIAL_UART_DEF(serial_uart, 0);

    And the just calling:

    ret = nrf_serial_init(&serial_uart, &m_uart_drv_config, &serial_config);
    APP_ERROR_CHECK(ret);

    As good as I could, I also copied the sdk_config parameters so all drivers are enabled no instances checked (as in the example).

    Anyone got a clue what I'm missing?

  • Forgot to mention that I am also running with a softdevice.

    How do I control if nrf_serial should use uart or uarte?

  • Thomas said:
    <error> app: ERROR 8 [NRF_ERROR_INVALID_STATE] at ..\..\..\..\..\..\components\libraries\log\src\nrf_log_backend_uart.c:67

     It looks like you are trying to use UART as logging backend as well as in your application. Is that correct? Go to sdk_config.h and try to set:

    #define NRF_LOG_BACKEND_UART_ENABLED 0

    and

    #define NRF_LOG_BACKEND_RTT_ENABLED 1

    To use the RTT backend  for the log instead of the UART backend.

  • Right got that - so I now have it running for a bit until asserts and nothing on the port.... but still fighting ;-)

  • Try to define debug in your preprocessor defines (please let me know what IDE you use if you don't know how to do this), and monitor your RTT log. It may not be related to UART at all.

    BR,

    Edvin

Related