EDIT: It seems that the app hangs in nrf_saadc_event_check() after initializing channel0. I'll further investigate!
Current I'm at the point at which I found out that
nrf_drv_saadc_buffer_convert(m_buffer_pool[1],SAADC_SAMPLES_IN_BUFFER);
Is causing the app to hang at
while (nrf_saadc_event_check(NRF_SAADC_EVENT_STARTED) == 0);
I'm running two timers using app_timer on a nrf52840 DK using S140. Whenever I try to initialize the SAADC by using the function below, my timers started using app_timer stop firing. Is this because somehow the SAADC is trying to use the same timer as app_timer? If so, how can I change the timer the SAADC is using?
void saadc_init(void) { ret_code_t err_code; nrf_drv_saadc_config_t saadc_config; nrf_saadc_channel_config_t channel_config0; //Configure SAADC saadc_config.resolution = NRF_SAADC_RESOLUTION_12BIT; //Set SAADC resolution to 12-bit. This will make the SAADC output values from 0 (when input voltage is 0V) to 2^12=2048 (when input voltage is 3.6V for channel gain setting of 1/6). saadc_config.oversample = SAADC_OVERSAMPLE; //Set oversample to 4x. This will make the SAADC output a single averaged value when the SAMPLE task is triggered 4 times. saadc_config.interrupt_priority = APP_IRQ_PRIORITY_LOW; //Set SAADC interrupt to low priority. //Initialize SAADC err_code = nrf_drv_saadc_init(&saadc_config, saadc_callback); //Initialize the SAADC with configuration and callback function. The application must then implement the saadc_callback function, which will be called when SAADC interrupt is triggered APP_ERROR_CHECK(err_code); //Configure SAADC channel channel_config0.reference = NRF_SAADC_REFERENCE_INTERNAL; //Set internal reference of fixed 0.6 volts channel_config0.gain = NRF_SAADC_GAIN1_5; //Set input gain to 1/6. The maximum SAADC input voltage is then 0.6V/(1/6)=3.6V. The single ended input range is then 0V-3.6V channel_config0.acq_time = NRF_SAADC_ACQTIME_3US; //Set acquisition time. Set low acquisition time to enable maximum sampling frequency of 200kHz. Set high acquisition time to allow maximum source resistance up to 800 kohm, see the SAADC electrical specification in the PS. channel_config0.mode = NRF_SAADC_MODE_SINGLE_ENDED; //Set SAADC as single ended. This means it will only have the positive pin as input, and the negative pin is shorted to ground (0V) internally. channel_config0.pin_p = NRF_SAADC_INPUT_AIN3; //Select the input pin for the channel. AIN0 pin maps to physical pin P0.02. channel_config0.pin_n = NRF_SAADC_INPUT_DISABLED; //Since the SAADC is single ended, the negative pin is disabled. The negative pin is shorted to ground internally. channel_config0.resistor_p = NRF_SAADC_RESISTOR_DISABLED; //Disable pullup resistor on the input pin channel_config0.resistor_n = NRF_SAADC_RESISTOR_DISABLED; //Disable pulldown resistor on the input pin //Disable pulldown resistor on the input pin //Initialize SAADC channel err_code = nrf_drv_saadc_channel_init(0, &channel_config0); //Initialize SAADC channel 0 with the channel configuration APP_ERROR_CHECK(err_code); if(SAADC_BURST_MODE) { NRF_SAADC->CH[0].CONFIG |= 0x01000000; //Configure burst mode for channel 0. Burst is useful together with oversampling. When triggering the SAMPLE task in burst mode, the SAADC will sample "Oversample" number of times as fast as it can and then output a single averaged value to the RAM buffer. If burst mode is not enabled, the SAMPLE task needs to be triggered "Oversample" number of times to output a single averaged value to the RAM buffer. } err_code = nrf_drv_saadc_buffer_convert(m_buffer_pool[0],SAADC_SAMPLES_IN_BUFFER); //Set SAADC buffer 1. The SAADC will start to write to this buffer APP_ERROR_CHECK(err_code); err_code = nrf_drv_saadc_buffer_convert(m_buffer_pool[1],SAADC_SAMPLES_IN_BUFFER); //Set SAADC buffer 2. The SAADC will write to this buffer when buffer 1 is full. This will give the applicaiton time to process data in buffer 1. APP_ERROR_CHECK(err_code); }