在使用nRF的多通道AD转换时,p_event->data.done.p_buffer里的值对应的通道有时正确有时不正确,p_buffer[0]和p_buffer[1]里的值有时刚好和两个通道反过来了,是什么原因?
#define SAMPLES_IN_BUFFER 2
static nrf_saadc_value_t m_buffer_pool[2][SAMPLES_IN_BUFFER];
void saadc_callback(nrf_drv_saadc_evt_t const * p_event)
{
if (p_event->type == NRF_DRV_SAADC_EVT_DONE)
{
ret_code_t err_code;

    err_code = nrf_drv_saadc_buffer_convert(p_event->data.done.p_buffer, SAMPLES_IN_BUFFER);
    APP_ERROR_CHECK(err_code);
    NRF_LOG_DEBUG("ADC event number: %d", (int)m_adc_evt_counter);
    NRF_LOG_DEBUG("AIN1:%d   AIN2:%d",p_event->data.done.p_buffer[0],p_event->data.done.p_buffer[1]);  
    m_adc_evt_counter++;
}

}

void saadc_init(void)
{
ret_code_t err_code;
nrf_saadc_channel_config_t channel_config_1 =
NRF_DRV_SAADC_DEFAULT_CHANNEL_CONFIG_SE(NRF_SAADC_INPUT_AIN1);

nrf_saadc_channel_config_t channel_config_2 =
    NRF_DRV_SAADC_DEFAULT_CHANNEL_CONFIG_SE(NRF_SAADC_INPUT_AIN2);

err_code = nrf_drv_saadc_init(NULL, saadc_callback);
APP_ERROR_CHECK(err_code);

err_code = nrf_drv_saadc_channel_init(0, &channel_config_1);
APP_ERROR_CHECK(err_code);

err_code = nrf_drv_saadc_channel_init(1, &channel_config_2);
APP_ERROR_CHECK(err_code);


err_code = nrf_drv_saadc_buffer_convert(m_buffer_pool[0], SAMPLES_IN_BUFFER);
APP_ERROR_CHECK(err_code);

err_code = nrf_drv_saadc_buffer_convert(m_buffer_pool[1], SAMPLES_IN_BUFFER);
APP_ERROR_CHECK(err_code);

}

    你是不是第一次,第三次,第五次的值都是对的,而第二次,第四次,第六次就是值跟通道是对调的?

      2 个月后

      这个问题我也遇到了,你这个问题解决了吗?

        lovewa 每次读取完数据之后,就清除下缓存区

        Wireless-Tech 我已经按你之前给我的回复进行的清除,暂时没有发现错乱,这里问一下只是看看这位朋友是怎么解决的
        还有随便问一下,p_event->data.done.p_buffer这个buf可以用memset清除,为什么p_event->data.done.size =0;会报错了,编译不通过,暂时这个长度没有清除

          lovewa 看看这个变量的属性,这位朋友已经失踪了。关于这个adc的问题,这个是一个通病,都要清缓存区的

          Wireless-Tech 好的,谢谢

            15 天后
            撰写回复...