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

How to manage SAADC and BLE run in parallel

 I'm trying to send ADC data through BLE using nRF52840.

 According to the example codes named ble_peripheral/ble_app_uart, peripheral/saadc, I wrote a code and it is able to transmit the data.

 But the problem is that the throughput is about 850 kbps, which is much lower than I expected. When I ran the throughput demo, it was able to get 1M(conn_interval =7.5ms)~1.3M(conn_interval=400ms) bps.

 So I wonder whether one of the ADC sampling or BLE task becomes a bottleneck as I aligned them in a serial way like the below code.

void saadc_callback(nrf_drv_saadc_evt_t const * p_event)
{
    if (p_event->type == NRF_DRV_SAADC_EVT_DONE)
    {
        ret_code_t err_code;

        err_code = nrf_drv_saadc_buffer_convert(p_event->data.done.p_buffer, SAMPLES_IN_BUFFER);
        APP_ERROR_CHECK(err_code);
        //SEGGER_RTT_WriteString(0, "saadc_callback function\n");

        saadc2ble_convert();   
        uint16_t length = (uint16_t)(SAMPLES_IN_BUFFER * 2);            
        //SEGGER_RTT_WriteString(0, "Trying to send data.\n");  
        
        notification_err_code = ble_nus_data_send(&m_nus, adc_output, &length, m_conn_handle);   
        //sprintf(error_string, "Error number: %#x\n", notification_err_code);
        //SEGGER_RTT_WriteString(0, error_string);  
        if ((notification_err_code != NRF_ERROR_INVALID_STATE) &&
                    (notification_err_code != NRF_ERROR_RESOURCES) &&
                    (notification_err_code != NRF_ERROR_NOT_FOUND))
        {
            APP_ERROR_CHECK(notification_err_code);                    
        }
    }
}

 For now, ble_nus_data_send() is called every time when the SAADC buffer is full.

 Will there be some advances if I save the ADC samples in a kind of buffer and call ble_nus_data_send() several times when the data are collected?

Parents Reply Children
Related