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?