Configuring ADC for multichannel using nrfx driver in nrf connect sdk

Hello. I am facing an issue in configuring ADC for multichannels. I was looking at the Nordic fundamentals course Lesson 6 Exercise 2.In this example, the adc is configured to scan single channel when I changed some settings to scan 4 channels I got this error and my code is not working.

Serial output

I don't know what am I doing wrong. I want adc to scan in interrupt. Here is my code.

#include <zephyr/kernel.h>
#include <zephyr/sys/printk.h>
#include <nrfx_saadc.h>
#include <stdint.h>

/* STEP 3.1 - Declare the struct to hold the configuration for the SAADC channel used to sample the battery voltage */
static nrfx_saadc_channel_t channel[4] = {
	NRFX_SAADC_DEFAULT_CHANNEL_SE(NRF_SAADC_INPUT_AIN0, 0),
	NRFX_SAADC_DEFAULT_CHANNEL_SE(NRF_SAADC_INPUT_AIN1, 1),
	NRFX_SAADC_DEFAULT_CHANNEL_SE(NRF_SAADC_INPUT_AIN2, 2),
	NRFX_SAADC_DEFAULT_CHANNEL_SE(NRF_SAADC_INPUT_AIN3, 3)
};

/* STEP 3.2 - Declare the buffer to hold the SAAD sample value */
static int16_t sample[4];
static uint32_t counter = 0;

/* STEP 4.1 - Define the battery sample interval */
#define BATTERY_SAMPLE_INTERVAL_MS 1000

/* STEP 4.3 - Add forward declaration of timer callback handler */
static void battery_sample_timer_handler(struct k_timer *timer);

/* STEP 4.2 - Define the battery sample timer instance */
K_TIMER_DEFINE(battery_sample_timer, battery_sample_timer_handler, NULL);

/* STEP 7.1 - Implement timer callback handler function */
void battery_sample_timer_handler(struct k_timer *timer)
{
	/* STEP 7.2 - Trigger the sampling */
	nrfx_err_t err = nrfx_saadc_mode_trigger();
	if (err != NRFX_SUCCESS)
	{
		printk("nrfx_saadc_mode_trigger error: %08x", err);
		return;
	}

	printk("\n-------------------Reading - %d-------------------\n", counter++);
	for (int i = 0; i < 4; i++)
	{
		printk("SAADC%d sample: %d    \n", i, sample[i]);
	}
}

static void configure_saadc(void)
{
	/* STEP 5.1 - Connect ADC interrupt to nrfx interrupt handler */
	IRQ_CONNECT(DT_IRQN(DT_NODELABEL(adc)), DT_IRQ(DT_NODELABEL(adc), priority), nrfx_isr, nrfx_saadc_irq_handler, 0);

	/* STEP 5.2 - Connect ADC interrupt to nrfx interrupt handler */
	nrfx_err_t err = nrfx_saadc_init(DT_IRQ(DT_NODELABEL(adc), priority));
	if (err != NRFX_SUCCESS)
	{
		printk("nrfx_saadc_mode_trigger error: %08x", err);
		return;
	}

	/* STEP 5.3 - Configure the SAADC channel */
	for (int i = 0; i < 4; i++)
	{
		channel[i].channel_config.gain = NRF_SAADC_GAIN1_4;
		channel[i].channel_config.acq_time = NRF_SAADC_ACQTIME_40US;
		channel[i].channel_config.reference = NRF_SAADC_REFERENCE_VDD4;

		err = nrfx_saadc_channels_config(&channel[i], (i + 1));
		if (err != NRFX_SUCCESS)
		{
			printk("nrfx_saadc_channels_config error: %08x", err);
			return;
		}
	}

	/* STEP 5.4 - Configure nrfx_SAADC driver in simple and blocking mode */
	err = nrfx_saadc_simple_mode_set(BIT(0) | BIT(1) | BIT(2) | BIT(3),
									 NRF_SAADC_RESOLUTION_12BIT,
									 NRF_SAADC_OVERSAMPLE_DISABLED,
									 NULL);
	if (err != NRFX_SUCCESS)
	{
		printk("nrfx_saadc_simple_mode_set error: %08x", err);
		return;
	}

	/* STEP 5.5 - Set buffer where sample will be stored */
	err = nrfx_saadc_buffer_set(&sample, 4);
	if (err != NRFX_SUCCESS)
	{
		printk("nrfx_saadc_buffer_set error: %08x", err);
		return;
	}

	/* STEP 6 - Start periodic timer for battery sampling */
	k_timer_start(&battery_sample_timer, K_NO_WAIT, K_MSEC(BATTERY_SAMPLE_INTERVAL_MS));
}

int main(void)
{
	configure_saadc();

	k_sleep(K_FOREVER);
	return 0;
}

Related