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);
}

  • 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.

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

Related