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

Low Throughput NUS & freertos

Hello ,

I am using freertos with nrf uart  service,  i could able to get these timings that seem little bit weird. 

one of the pin toggled for each successful ble_nus_data_send , and  other pin toggled for each BLE_NUS_EVT_TX_RDY event.

After every 5 pulses (2.9ms for each) ,  i have a big gap (33.65ms for each)  . And TX_RDY pulses are very long too.  I created a task to send the data .

Question : How can i avoid 33.65ms gap ? 

Here is my send task ;

xTaskCreate(send_ble_task_function, "BLESEND", configMINIMAL_STACK_SIZE + 200, NULL,1, &m_ble_send_task_handle));

static void send_ble_task_function (void * pvParameter)
{
    ret_code_t err_code;
    int k = 0;
    nrf_gpio_cfg_output(15);
    nrf_gpio_cfg_output(16);
    UNUSED_PARAMETER(pvParameter);
    for(int i = 0 ;i<247;i++)
    {
      data_arrayx[i] = i;
    }

    
    while (true)
    {
      if(command){
        do
        {
            nrf_gpio_pin_write(15,1);
            err_code = ble_nus_data_send(&m_nus, data_arrayx, &m_ble_nus_max_data_len, m_conn_handle);
            if ((err_code != NRF_ERROR_INVALID_STATE) &&
                (err_code != NRF_ERROR_RESOURCES) &&
                (err_code != NRF_ERROR_NOT_FOUND))
            {
                APP_ERROR_CHECK(err_code);
            }
            nrf_gpio_pin_write(15,0);
            data_arrayx[2] = (char)k++;
        } while (err_code != NRF_ERROR_RESOURCES);
        data_arrayx[2] = (char)k--;
        ulTaskNotifyTake(pdTRUE,1000);
      }
      else{
        
        vTaskSuspend(m_ble_send_task_handle);}
    }

And i am signalling my task in this routine ; 

static void nus_data_handler(ble_nus_evt_t * p_evt)
{
    int srtCmpResult = 0; 

    if (p_evt->type == BLE_NUS_EVT_RX_DATA)
    {
        uint32_t err_code;

        srtCmpResult = strncmp(p_evt->params.rx_data.p_data,"Start\r",p_evt->params.rx_data.length);
        if(srtCmpResult == 0 )
        {  command = 1;vTaskResume(m_ble_send_task_handle);}
        srtCmpResult = strncmp(p_evt->params.rx_data.p_data,"Stop\r",p_evt->params.rx_data.length);
        if(srtCmpResult == 0 )
        {  command = 0;}

        for (uint32_t i = 0; i < p_evt->params.rx_data.length; i++)
        {
            do
            {
                err_code = app_uart_put(p_evt->params.rx_data.p_data[i]);
                if ((err_code != NRF_SUCCESS) && (err_code != NRF_ERROR_BUSY))
                {
                    NRF_LOG_ERROR("Failed receiving NUS message. Error 0x%x. ", err_code);
                    APP_ERROR_CHECK(err_code);
                }
            } while (err_code == NRF_ERROR_BUSY);
        }
        if (p_evt->params.rx_data.p_data[p_evt->params.rx_data.length - 1] == '\r')
        {
            while (app_uart_put('\n') == NRF_ERROR_BUSY);
        }
    }

    if (p_evt->type == BLE_NUS_EVT_TX_RDY)
    {
      nrf_gpio_pin_write(16,1);
      nrf_gpio_pin_write(16,0);
      xTaskNotifyGive( m_ble_send_task_handle );
    }

}

Here is some settings ;

#define MIN_CONN_INTERVAL MSEC_TO_UNITS(100, UNIT_1_25_MS) /**< Minimum acceptable connection interval (0.4 seconds). */

#define MAX_CONN_INTERVAL MSEC_TO_UNITS(100, UNIT_1_25_MS) /**< Maximum acceptable connection interval (0.65 second). */

Parents
  • Hello,

    I assume that this is the peripheral in your connection. What is the central in the connection? Is that another nRF? If so, what are the connection parameters of this device? I suspect that the connection interval is approx. 33ms. Remember that it is the central in the connection that decides the connection interval.

    To determine this, you can either check the connection parameters on the central application (if you have access), or you can sniff the connection using e.g. nRF Sniffer (this requires an extra DK). Alternatively, monitor the connection update events in the peripheral application. 

    So what is your central device?

    Best regards,

    Edvin

  • Thank you for your answer .Central device is a Samsung Galaxy note 9 . i don't have access to the central application . so i will try to get connection updates from nrf52. Is there any parameter to check connection interval , number of package in a connection interval  from nrf52 ?

Reply Children
Related