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

  • luca brandt said:
    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?

     That is correct. In that case, you need to port it to the dongle. 

     

    luca brandt said:

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

     Because if the RX pin is not connected to anything, and you receive some noise on the RX pin, the UART peripheral will try to make sense of it, and generate an event saying that something went wrong during the RX. 

    If you have something like this:

            case APP_UART_COMMUNICATION_ERROR:
                APP_ERROR_HANDLER(p_event->data.error_communication);

    Try to comment out the line containing APP_ERROR_HANDLER(...)

    So do you have anything connected to the UART pins on the dongle? NB: The UART pins are not the USB pins on the dongle. If nothing is connected, try to remove the uart from your project, or at least comment out the error handling from the UART.

Reply
  • luca brandt said:
    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?

     That is correct. In that case, you need to port it to the dongle. 

     

    luca brandt said:

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

     Because if the RX pin is not connected to anything, and you receive some noise on the RX pin, the UART peripheral will try to make sense of it, and generate an event saying that something went wrong during the RX. 

    If you have something like this:

            case APP_UART_COMMUNICATION_ERROR:
                APP_ERROR_HANDLER(p_event->data.error_communication);

    Try to comment out the line containing APP_ERROR_HANDLER(...)

    So do you have anything connected to the UART pins on the dongle? NB: The UART pins are not the USB pins on the dongle. If nothing is connected, try to remove the uart from your project, or at least comment out the error handling from the UART.

Children
  • What would the porting to the Dongle look like? 

    I connected the RX- and TX Pin to the serial port of my computer. (and voltage supply comes from the USB)

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

    But even when I connect the RX and TX Pins (as a loop), the code stops at the first nrf_drv_uart_...().

    Is there anyting I need to do before I use these functions?

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

Related