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

nRF52840 Dongle UART

Hello,

I use the Blinky example from the SDK. Now I would like to implement an UART on the nRF52840 Dongle. But the program always stops at either nrf_drv_uart_rx or nrf_drv_uart_tx. Can anyone help me with that?

Thanks in advance!

nrf_drv_uart_t upp_uart_inst = NRF_DRV_UART_INSTANCE(0);

void rm_uart_init()
{
    nrf_drv_uart_config_t vfg = NRF_DRV_UART_DEFAULT_CONFIG;
    cfg.baudrate    = UART_BAUDRATE_BAUDRATE_Baud115200;
    cfg.hwfc        = NRF_UART_HWFC_DISABLED;
    cfg.pselrxd     = 29;
    cfg.pseltxd     = 31;
    cfg.use_easy_dma= 0;
        
    nrf_drv_init(&app_drv_uart_init, &cfg, NULL);
}

void fkt()
{
    uint8_t tx_buffer[0] = 1;
    uint8_t rx_buffer[0] = 0;
    nrf_drv_uart_tx(&app_uart_inst, tx_buffer, 1);
    nrf_drv_uart_rx (&app_uart_inst, rx_buffer, 1);
}

Parents
  • For development, please use an nRF52840 DK. 

    I guess the issue is that you receive a COMMUNICATION_ERROR event, because your UART pins are floating. But you need a programmer to verify this, so that you can debug. 

    The nRF52840 DK has an on board debugger, but the dongle does not. 

    The debugger will allow for debugging and logging.

    It will save you a lot of time. Perhaps it is worth the expense.

    Best regards,

    Edvin

  • Thanks for your answer. 

    The nRF52840 DK uses the pca10056 SDK right? I want to use the Dongle eventually, so even if I have a working programm for the DK, I can't use it on the Dongle. Am I mistaken?

    When the pins are floating, shoudn't I recive and send noise? Why would the code stop at:

    nrf_drv_uart_tx(&app_uart_inst, tx_buffer, 1);
    nrf_drv_uart_rx (&app_uart_inst, rx_buffer, 1);
     

    But could I try to pull TX and RX high, with external restistors?

    Best regards,

    Luca

  • Like described in this blog:

    https://devzone.nordicsemi.com/nordic/short-range-guides/b/getting-started/posts/nrf52840-dongle-programming-tutorial

    If the UART is not the cause of your problem, then you need to debug your project to see what's going on. Why does it stop? How do you determine that it has stopped? 

     

    luca brandt said:
    I'm not using any kind of Error Handling. The code I posted is literally all I am using. 

     Obviously, you also have all the drivers and so on. Perhaps there is an APP_ERROR_CHECK() inside one of your function calls in nrf_drv_uart_...(). You will save yourself some time if you get hold of a debugger or a DK. NB: Read the part about the bootloader's UICR and external debugger if you decide to go with the external debugger on the dongle. 

  • I know how to program the Dongle. I was wondering how you can use a program written for the DK(pca10056) with the Dongle(pca10059). They use different SDKs.  But it is not that importent. 

    Alright. I am using the Blinky example from the SDK for the Dongle (pca10059). I implemented my own service and characteristics. I can already send and recive data over BLE. Now, I would like to send and recive data over UART as simple as possible. On the Blinky example with my service.The BLE side of the code is not in use for the UART programming.That is not the problem.

    So I use:

        nrf_drv_uart_tx(&app_uart_inst, tx_buffer, 1);
        nrf_drv_uart_rx (&app_uart_inst, rx_buffer, 1);

    I can see that the code stops at either of these functions, because I turn the LED on before, and off after calling the function. But the LED does not turn off. Hence my conclusion that the code stops at the function nrf_drv_uart_...(). 

    Now I am wondering why it does not work. Excuse me if my question was not well formulated.  

  • luca brandt said:
    I was wondering how you can use a program written for the DK(pca10056) with the Dongle(pca10059)

     Yes, it is described in the link I provided in the previous reply. Did you see the section "Adapt a BLE example (with Softdevice) and program it using nRF Connect Programmer"? since you mention BLE, I assume your application uses a softdevice? Can you confirm this, please?

     

    luca brandt said:
    They use different SDKs.

     They do not.

    Did you check whether it is nrf_drv_uart_tx or nrf_drv_uart_rx that casued the issue? Have you tried to turn the LED of between the two? In what state is the led stuck then?

     

    luca brandt said:
    Now, I would like to send and recive data over UART as simple as possible.

     How did you set this up so far? Show me the function where you initialize your UART, and all snippets that are uart related. 

    What did you connect to your UART pins? NB: That is important. Please answer this question.

    When you call nrf_uart_rx() are you sure that there is any data incoming on the UART? the nrf_uart_rx is a blocking call. If there is no data incoming, it will stop here. If you want to use it together with other functionality in your app, I suggest you look into how it is done in the ble_app_uart example, where you have a callback function for the UART, instead of blocking calls. This way, the UART callback will trigger whenever you receive a byte on the UART.

  • Yes, I am using the Softdevice 140. 

    The code stops at either of these functions, nrf_drv_uart_tx and nrf_drv_uart_rx. I tried them individually. 

    This is the code I am using.

    uint8_t rx_buffer[1];
    uint8_t tx_buffer[1];
    
    nrf_drv_uart_t app_uart_inst = NRF_DRV_UART_INSTANCE(0);
    
    
    void rm_uart_put(uint8_t c);
    uint8_t rm_uart_get();
    
    void rm_uart_init() 
    {
        nrf_drv_uart_config_t cfg = NRF_DRV_UART_DEFAULT_CONFIG;
    
        cfg.baudrate              = UART_BAUDRATE_BAUDRATE_Baud115200;
        cfg.hwfc                  = NRF_UART_HWFC_DISABLED;
        cfg.pselrxd               = 29; 
        cfg.pseltxd               = 31;
        cfg.use_easy_dma          = 0;
        
        ret_code_t ret;
        nrf_drv_uart_init(&app_uart_inst, &cfg, NULL);
    }
    
    void rm_uart_handle() 
    {
        uint32_t err_code;
        uint8_t send = 0;
        uint8_t recive = 1;
    
        bsp_board_led_on(ADVERTISING_LED);
        rm_uart_put(send);
        nrf_delay_ms(1000);
        bsp_board_led_off(ADVERTISING_LED);
        nrf_delay_ms(1000);
    
        bsp_board_led_on(ADVERTISING_LED);
        recive = rm_uart_get();
        nrf_delay_ms(1000);
        bsp_board_led_off(ADVERTISING_LED);
    }
    
    
    void rm_uart_put(uint8_t c) 
    {
        uint32_t err_code;
        tx_buffer[0] = c;
    
        nrf_drv_uart_tx(&app_uart_inst, tx_buffer, 1); 
    }
    
    uint8_t rm_uart_get(void) 
    {
        ret_code_t err_code;
    
        nrf_drv_uart_rx(&app_uart_inst, rx_buffer, 1);
        
    
        return *rx_buffer;
    }
     

    I connected two things to the UART.

    1) Rx and Tx to computer. send/recvice in PuTTY.

    2) The Rx and Tx Pins on the Dongle connected. So I would receive on the Dongle, what I sent from the Dongle. 

    However, both did not work.

  • lucaN said:

    I connected two things to the UART.

    1) Rx and Tx to computer. send/recvice in PuTTY.

    2) The Rx and Tx Pins on the Dongle connected. So I would receive on the Dongle, what I sent from the Dongle. 

    1) How? Do you have some external UART->USB bridge? Can you show me a picture of how these are connected?

    2) I am not sure that would work the way you are using it, with a blocking rx call. 

    You need to debug this. To do so, you need either an external debugger, or a DK.

Reply
  • lucaN said:

    I connected two things to the UART.

    1) Rx and Tx to computer. send/recvice in PuTTY.

    2) The Rx and Tx Pins on the Dongle connected. So I would receive on the Dongle, what I sent from the Dongle. 

    1) How? Do you have some external UART->USB bridge? Can you show me a picture of how these are connected?

    2) I am not sure that would work the way you are using it, with a blocking rx call. 

    You need to debug this. To do so, you need either an external debugger, or a DK.

Children
  • This is the set up. Voltage is provided by USB.

  • Ok, I just wanted to make 100% sure that you didn't think the pins were routed through the USB port (like it is on the DK). Then I am afraid you need to debug.

  • Alright. I ordered one. Thank you for your help!

  • I did some debugging now on the nRF52840 DK

    uint8_t rx_buffer[1];
    uint8_t tx_buffer[1];
    
    nrf_drv_uart_t app_uart_inst = NRF_DRV_UART_INSTANCE(0);
    
    
    uint32_t rm_uart_put(uint8_t c);
    uint32_t rm_uart_get();
    
    void rm_uart_init() 
    {
        nrf_drv_uart_config_t cfg = NRF_DRV_UART_DEFAULT_CONFIG;
    
        cfg.baudrate              = UART_BAUDRATE_BAUDRATE_Baud115200;
        cfg.hwfc                  = NRF_UART_HWFC_DISABLED;
        cfg.pselrxd               = 26; // 29
        cfg.pseltxd               = 27; // 31
        cfg.use_easy_dma          = false;
     
        ret_code_t err_code;
        //err_code = nrfx_uart_init(&app_uart_inst, &cfg, NULL);
        err_code = nrf_drv_uart_init(&app_uart_inst, &cfg, 0); //Original
        APP_ERROR_CHECK(err_code);
    }
    
    void rm_uart_handle()
    {
        uint32_t err_code;
        uint8_t send = 0;
        uint8_t recive = 1;
    
        err_code = rm_uart_put(send);
    
        recive = rm_uart_get();
    }
    
    
    uint32_t rm_uart_put(uint8_t c) 
    {
        ret_code_t err_code;
        tx_buffer[0] = c;
    
        err_code = nrf_drv_uart_tx(&app_uart_inst, tx_buffer, 1);
        APP_ERROR_CHECK(err_code);
    }
    
    uint32_t rm_uart_get(void) 
    {
        ret_code_t err_code;
    
        err_code = nrf_drv_uart_rx(&app_uart_inst, rx_buffer, 1);
        APP_ERROR_CHECK(err_code);
    
        return *rx_buffer;
    }

    That is the error I get from putting the breakpoint to error_info from the APP_ERROR_CHECK() after the nrf_drv_uart_init function:

    void app_error_handler_bare(unsigned int error_code=0x00000011)

    In the infocenter it says that the error 0x11 is: The length of one or more input arguments was invalid. The first input argument contains:

    app_uart_inst = {inst_idx=x00, uarte={p_reg=0x40002000, drv_inst_idx=0x00}, uart={p_reg=40002000, drv_inst_idx=0x00}}

    When I comment out that line 

        cfg.use_easy_dma          = false;
    
    , I get a 0x08 error instead. I don't if that means anything because I still don't really know what to do with all that.

    The UART Pins are not connected yet and advertising and BLE stuff is commented out.

  • What SDK version do you use, by the way?

    Is it possible to send the project, so that I can try to reproduce it?

    I guess it comes from nrfx_uarte_init() -> 

    nrfx_err_t nrfx_uarte_init(nrfx_uarte_t const *        p_instance,
                               nrfx_uarte_config_t const * p_config,
                               nrfx_uarte_event_handler_t  event_handler)
    {
        NRFX_ASSERT(p_config);
        uarte_control_block_t * p_cb = &m_cb[p_instance->drv_inst_idx];
        nrfx_err_t err_code = NRFX_SUCCESS;
    
        if (p_cb->state != NRFX_DRV_STATE_UNINITIALIZED)
        {
            err_code = NRFX_ERROR_INVALID_STATE;
            NRFX_LOG_WARNING("Function: %s, error code: %s.",
                             __func__,
                             NRFX_LOG_ERROR_STRING_GET(err_code));
            return err_code;
        }
    
    #if NRFX_CHECK(NRFX_PRS_ENABLED)
        static nrfx_irq_handler_t const irq_handlers[NRFX_UARTE_ENABLED_COUNT] = {
            #if NRFX_CHECK(NRFX_UARTE0_ENABLED)
            nrfx_uarte_0_irq_handler,
            #endif
            #if NRFX_CHECK(NRFX_UARTE1_ENABLED)
            nrfx_uarte_1_irq_handler,
            #endif
            #if NRFX_CHECK(NRFX_UARTE2_ENABLED)
            nrfx_uarte_2_irq_handler,
            #endif
            #if NRFX_CHECK(NRFX_UARTE3_ENABLED)
            nrfx_uarte_3_irq_handler,
            #endif
        };
        if (nrfx_prs_acquire(p_instance->p_reg,
                irq_handlers[p_instance->drv_inst_idx]) != NRFX_SUCCESS)
        {
            err_code = NRFX_ERROR_BUSY;
            NRFX_LOG_WARNING("Function: %s, error code: %s.",
                             __func__,
                             NRFX_LOG_ERROR_STRING_GET(err_code));
            return err_code;        // <-- This line
        }

    Out of curiousity:

    Do you (try to) use logging? Can you send me your sdk_config.h file? What is NRF_LOG_ENABLED and NRF_LOG_BACKEND_UART_ENABLED defined as, if they are present?

Related