nrf52840 ADC + easyDMA, scan two channels in non blocking way on registers

Hello

I have a code that sucessfully scans one ADC channel in FreeRTOS task and grabs the value of the buffer every 2000ms

I have zero need for accuracy. speed or anything fancy, I just want in that single task to take what ADC has been converting under the hood in non blocking way.

Simplified config 

    NRF_SAADC->RESOLUTION = saadcResolution;

	NRF_SAADC->ENABLE = (SAADC_ENABLE_ENABLE_Enabled << SAADC_ENABLE_ENABLE_Pos);

	
	NRF_SAADC->SAMPLERATE =
		(SAADC_SAMPLERATE_MODE_Timers << SAADC_SAMPLERATE_MODE_Pos) | (adc_cc_value << SAADC_SAMPLERATE_CC_Pos);
	

	for (int i = 0; i < 8; i++) {
		NRF_SAADC->CH[i].PSELN = SAADC_CH_PSELP_PSELP_NC;
		NRF_SAADC->CH[i].PSELP = SAADC_CH_PSELP_PSELP_NC;
	}

	NRF_SAADC->CH[0].CONFIG =
		((SAADC_CH_CONFIG_RESP_Bypass << SAADC_CH_CONFIG_RESP_Pos) & SAADC_CH_CONFIG_RESP_Msk) |
		((SAADC_CH_CONFIG_RESP_Bypass << SAADC_CH_CONFIG_RESN_Pos) & SAADC_CH_CONFIG_RESN_Msk) |
		((saadcGain << SAADC_CH_CONFIG_GAIN_Pos) & SAADC_CH_CONFIG_GAIN_Msk) |
		((saadcReference << SAADC_CH_CONFIG_REFSEL_Pos) & SAADC_CH_CONFIG_REFSEL_Msk) |
		((saadcSampleTime << SAADC_CH_CONFIG_TACQ_Pos) & SAADC_CH_CONFIG_TACQ_Msk) |
		((SAADC_CH_CONFIG_MODE_SE << SAADC_CH_CONFIG_MODE_Pos) & SAADC_CH_CONFIG_MODE_Msk) |
		((saadcBurst << SAADC_CH_CONFIG_BURST_Pos) & SAADC_CH_CONFIG_BURST_Msk);

	NRF_SAADC->CH[1].CONFIG = NRF_SAADC->CH[0].CONFIG;

	NRF_SAADC->CH[0].PSELN = SAADC_CH_PSELP_PSELP_AnalogInput2;
	NRF_SAADC->CH[0].PSELP = SAADC_CH_PSELP_PSELP_AnalogInput2;

	NRF_SAADC->CH[1].PSELN = SAADC_CH_PSELP_PSELP_AnalogInput3;
	NRF_SAADC->CH[1].PSELP = SAADC_CH_PSELP_PSELP_AnalogInput3;

	NRF_SAADC->RESULT.PTR = (uint32_t)&value;
	NRF_SAADC->RESULT.MAXCNT = 1; // One sample

	NRF_SAADC->TASKS_START = 0x01UL;
	while (!NRF_SAADC->EVENTS_STARTED);
	NRF_SAADC->EVENTS_STARTED = 0x00UL;
	NRF_SAADC->TASKS_SAMPLE = 0x01UL;

and it works great for single channel, when i tried to add additional channel (1) with same config but different input
I am getting the same values in buffer, value is array of int16 of size of 2

I tried to change MAXCNT to 2 but it just gets populated with values from channel 0

This is how task looks like

[[noreturn]] void ADC::process(void* p) {
	while (true) {
		Serial.printf("res: %d %d\n", value[0], value[1]);
		NRF_SAADC->TASKS_START = 0x01UL;
		NRF_SAADC->TASKS_SAMPLE = 0x01UL;

		delay(2000);
	}
}

Is this even possible to get in easyDMA buffer values from ch0 and ch1 respectively?

Parents Reply Children
No Data
Related