Hello,
I'm using following code to read two channels of SAADC. It works fine when device is not connected to BLE central device. As soon as it's connected, the saadc_callback function stops executing despite the fact that nrf_drv_saadc_sample(); returns NRF_SUCCESS. In the log, I can see that saadc_callback() being called when device is not connected to BLE and no saadc_callback() when device connected to BLE.
One thing more, the saadc_callback() gets being called from a timer in the main() (although with incorrect values) function but not being called when saadc_voltage_get() is used other than main().
I have tried changing the priority of SAADC IRQ in the sdk_config.h from 7 to 3, still no success. The code otherwise works fine and at device startup, when it's not connected, SAADC reads values.
The code is here:
#include "nrf_drv_saadc.h"
#include "nrf_log.h"
#include "nrf_log_ctrl.h"
#include "nrf_delay.h"
#include "adc_driver.h"
#define SAMPLES_IN_BUFFER 2
static nrf_saadc_value_t m_buffer[2][SAMPLES_IN_BUFFER];
uint16_t drive_V, batt_V;
void saadc_callback(nrf_drv_saadc_evt_t const * p_event)
{
NRF_LOG_INFO("SAADC event: %d", p_event->type);
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);
drive_V = p_event->data.done.p_buffer[0];
batt_V = p_event->data.done.p_buffer[1];
NRF_LOG_INFO("Drive voltage=%d", drive_V);
//NRF_LOG_INFO("Sys volatge=%d", batt_V);
}
}
void saadc_init(void)
{
ret_code_t err_code;
nrf_saadc_channel_config_t channel_config_1
= NRF_DRV_SAADC_DEFAULT_CHANNEL_CONFIG_SE(NRF_SAADC_INPUT_AIN1);
nrf_saadc_channel_config_t channel_config_2
= NRF_DRV_SAADC_DEFAULT_CHANNEL_CONFIG_SE(NRF_SAADC_INPUT_AIN2);
err_code = nrf_drv_saadc_init(NULL, saadc_callback);
APP_ERROR_CHECK(err_code);
err_code = nrf_drv_saadc_channel_init(1, &channel_config_1);
APP_ERROR_CHECK(err_code);
err_code = nrf_drv_saadc_channel_init(2, &channel_config_2);
APP_ERROR_CHECK(err_code);
err_code = nrf_drv_saadc_buffer_convert(m_buffer[0], SAMPLES_IN_BUFFER);
APP_ERROR_CHECK(err_code);
err_code = nrf_drv_saadc_buffer_convert(m_buffer[1], SAMPLES_IN_BUFFER);
APP_ERROR_CHECK(err_code);
// get values
saadc_voltage_get();
// Analog PIN assignments
// P0.02/AIN0
// P0.03/AIN1 --> Drive_V
// P0.04/AIN2 --> Batt_V
}
void saadc_voltage_get(){
ret_code_t err_code;
err_code = nrf_drv_saadc_sample();
if (err_code == NRF_SUCCESS){
NRF_LOG_INFO("SAADC getting voltage...");
}
else{
NRF_LOG_INFO("SAADC sampling issue.");
}
nrf_delay_ms(2);
}
void saadc_voltage_get_drive(uint16_t *voltage){
saadc_voltage_get();
*voltage = drive_V;
}
void saadc_voltage_get_battery(uint16_t *voltage){
saadc_voltage_get();
*voltage = batt_V;
}