I've gotten the SAADC working in a blocking fashion and been able to evaluate sample times. Now, I'd like to set it up to automatically read three inputs in a row to see how fast I can get three reads in a row. Something isn't right. I don't ever see the callback function getting called. I know that I'm calling the nrfx_saadc_sample() function as I see my debug output.
/* * Copyright (c) 2018 Nordic Semiconductor ASA * * SPDX-License-Identifier: LicenseRef-BSD-5-Clause-Nordic */ #include <gpio.h> #include <net/socket.h> #include <nrf9160.h> #include <stdio.h> #include <string.h> #include <uart.h> #include <adc.h> #include <zephyr.h> #include <nrfx.h> #include <nrfx_saadc.h> #include <misc/printk.h> //#include <hal/nrf_saadc.h> //#include <nrfx_dppi.h> struct device *gpio_dev; #define SAADC_DEFAULT_CONFIG \ { \ .resolution = (nrf_saadc_resolution_t)NRFX_SAADC_CONFIG_RESOLUTION, \ .oversample = (nrf_saadc_oversample_t)NRFX_SAADC_CONFIG_OVERSAMPLE, \ .interrupt_priority = NRFX_SAADC_CONFIG_IRQ_PRIORITY, \ .low_power_mode = NRFX_SAADC_CONFIG_LP_MODE \ } #define SAADC_DEFAULT_CHANNEL_CONFIG_SE(PIN_P) \ { \ .resistor_p = NRF_SAADC_RESISTOR_DISABLED, \ .resistor_n = NRF_SAADC_RESISTOR_DISABLED, \ .gain = NRF_SAADC_GAIN1_6, \ .reference = NRF_SAADC_REFERENCE_INTERNAL, \ .acq_time = NRF_SAADC_ACQTIME_3US, \ .mode = NRF_SAADC_MODE_SINGLE_ENDED, \ .burst = NRF_SAADC_BURST_DISABLED, \ .pin_p = (nrf_saadc_input_t)(PIN_P), \ .pin_n = NRF_SAADC_INPUT_DISABLED \ } nrf_saadc_channel_config_t saadc_channel_config_1 = SAADC_DEFAULT_CHANNEL_CONFIG_SE(NRF_SAADC_INPUT_AIN0); nrf_saadc_channel_config_t saadc_channel_config_2 = SAADC_DEFAULT_CHANNEL_CONFIG_SE(NRF_SAADC_INPUT_AIN1); nrf_saadc_channel_config_t saadc_channel_config_3 = SAADC_DEFAULT_CHANNEL_CONFIG_SE(NRF_SAADC_INPUT_AIN2); static bool adcCalibrateDone; #define BUFFER_SIZE 3 static nrf_saadc_value_t m_sample_buffer[BUFFER_SIZE]; static void saadc_callback(nrfx_saadc_evt_t const * p_event){ if ( p_event->type == NRFX_SAADC_EVT_DONE ) { gpio_pin_write(gpio_dev, 10, 0); printk("ADC raw value: %d\n", m_sample_buffer[0]); } else if( p_event->type == NRFX_SAADC_EVT_CALIBRATEDONE ) { adcCalibrateDone = true; } } void adc_module_init(void) { nrfx_err_t err_code; nrfx_saadc_config_t drv_saadc_cfg = SAADC_DEFAULT_CONFIG; err_code = nrfx_saadc_init( &drv_saadc_cfg, saadc_callback ); if(err_code != NRFX_SUCCESS){ //Blah error } err_code = nrfx_saadc_channel_init(0, &saadc_channel_config_1); err_code = nrfx_saadc_channel_init(1, &saadc_channel_config_2); err_code = nrfx_saadc_channel_init(2, &saadc_channel_config_3); } static int adc_sample_blocking(void) { int ret; gpio_pin_write(gpio_dev, 10, 1); ret = nrfx_saadc_sample_convert(0, m_sample_buffer); ret = nrfx_saadc_sample_convert(1, m_sample_buffer); ret = nrfx_saadc_sample_convert(2, m_sample_buffer); gpio_pin_write(gpio_dev, 10, 0); if (ret != NRFX_SUCCESS) { printk("Error in adc sampling: %d\n", ret); } /* Print the AIN0 values */ for (int i = 0; i < BUFFER_SIZE; i++) { float adc_voltage = 0; adc_voltage = (float)(((float)m_sample_buffer[i] / 1023.0f) * 3600.0f); printk("ADC raw value: %d\n", m_sample_buffer[i]); printf("Measured voltage: %f mV\n", adc_voltage); } return ret; } static int adc_sample_nonblocking(void) { int ret; gpio_pin_write(gpio_dev, 10, 1); nrfx_saadc_buffer_convert(m_sample_buffer, 3); ret = nrfx_saadc_sample(); if(ret == NRFX_SUCCESS){ printk("Sampling Triggered!\n"); } return ret; } int main(void) { nrfx_err_t err; printk("nrf91 saadc sampling AIN0 (P0.13)\n"); printk("Example requires secure_boot to have "); printk("SAADC set to non-secure!\n"); printk("If not; BusFault/UsageFault will be triggered\n"); gpio_dev = device_get_binding(DT_GPIO_P0_DEV_NAME); if (!gpio_dev) { printk("Cannot bind gpio device"); return -ENODEV; } err = gpio_pin_configure(gpio_dev, 10, GPIO_DIR_OUT);//Set pin 0 to output adc_module_init(); while (1) { //adc_sample_blocking(); adc_sample_nonblocking(); k_sleep(500); } }