OS : Ubuntu
SDK: 15.3.0_59ac345
Base example : peripheral/saadc
HW : nRF52832 DK PCA10040 1.2.1 2017.49 682663245
Hello, i would like to make sure the ADC acquisition speed.
As seen in this post, it was recommended to use GPIOTE to toggle a pin on start and end of an sampling to measure precisely the acquisition frequency with a logic analyser.
- I have updated the peripheral/saadc base example to attache two channels on EVENTS_DONE and TASKS_SAMPLE
to clear and set the GPIO 20. - I have changed the acquisition time to NRF_SAADC_ACQTIME_3US
- I have changed the timer to 100µS.
void saadc_sampling_event_init(void)
{
ret_code_t err_code;
err_code = nrf_drv_ppi_init();
APP_ERROR_CHECK(err_code);
nrf_drv_timer_config_t timer_cfg = NRF_DRV_TIMER_DEFAULT_CONFIG;
timer_cfg.bit_width = NRF_TIMER_BIT_WIDTH_32;
err_code = nrf_drv_timer_init(&m_timer, &timer_cfg, timer_handler);
APP_ERROR_CHECK(err_code);
/* setup m_timer for compare event every 5µs */
uint32_t ticks = nrf_drv_timer_us_to_ticks(&m_timer, 100);
nrf_drv_timer_extended_compare(&m_timer,
NRF_TIMER_CC_CHANNEL0,
ticks,
NRF_TIMER_SHORT_COMPARE0_CLEAR_MASK,
false);
nrf_drv_timer_enable(&m_timer);
uint32_t timer_compare_event_addr = nrf_drv_timer_compare_event_address_get(&m_timer,
NRF_TIMER_CC_CHANNEL0);
uint32_t saadc_sample_task_addr = nrf_drv_saadc_sample_task_get();
/* setup ppi channel so that timer compare event is triggering sample task in SAADC */
err_code = nrf_drv_ppi_channel_alloc(&m_ppi_channel);
APP_ERROR_CHECK(err_code);
err_code = nrf_drv_ppi_channel_alloc(&m_ppi_channel_saadc);
APP_ERROR_CHECK(err_code);
err_code = nrf_drv_ppi_channel_alloc(&m_ppi_channel_saadc_start);
APP_ERROR_CHECK(err_code);
err_code = nrf_drv_ppi_channel_assign(m_ppi_channel,
timer_compare_event_addr,
saadc_sample_task_addr);
APP_ERROR_CHECK(err_code);
// err_code = nrf_drv_ppi_channel_fork_assign(m_ppi_channel, nrf_drv_gpiote_out_task_addr_get(LED2));
err_code = nrf_drv_ppi_channel_assign(m_ppi_channel_saadc,
(uint32_t)&NRF_SAADC->EVENTS_DONE,
nrf_drv_gpiote_clr_task_addr_get(LED2));
APP_ERROR_CHECK(err_code);
err_code = nrf_drv_ppi_channel_assign(m_ppi_channel_saadc_start,
(uint32_t)&NRF_SAADC->TASKS_SAMPLE,
nrf_drv_gpiote_set_task_addr_get(LED2));
APP_ERROR_CHECK(err_code);
}
From my understanding, i expect a 3µs toggle every 100µs, but i have a nothing toggleing on the pin.

If now i change the events from : EVENTS_DONE and TASKS_SAMPLE to : EVENTS_DONE and EVENTS_STARTED i do have a toggeling ( so my PPI channeling is working ) but i still don't have the expected result ( i have 87.5µs every 0.4ms instead of the expected 3µs toggle every 100µs)

Am i understanding something wrong ?