fix(adc): fix ESP32C6 ADC get high result after enable

This commit is contained in:
gaoxu
2025-10-29 19:45:29 +08:00
committed by BOT
parent e8069a963d
commit 5bf03720b2
2 changed files with 11 additions and 6 deletions
+4 -3
View File
@@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2019-2024 Espressif Systems (Shanghai) CO LTD
* SPDX-FileCopyrightText: 2019-2025 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
@@ -113,9 +113,11 @@ static void adc_hal_onetime_start(adc_unit_t unit, uint32_t clk_src_freq_hz, uin
}
HAL_EARLY_LOGD("adc_hal", "delay for `onetime_start` signal captured: %"PRIu32"", sample_delay_us);
adc_oneshot_ll_start(true);
esp_rom_delay_us(sample_delay_us);
adc_oneshot_ll_start(false);
esp_rom_delay_us(sample_delay_us);
adc_oneshot_ll_start(true);
#if ADC_LL_DELAY_CYCLE_AFTER_DONE_SIGNAL
/**
@@ -145,7 +147,6 @@ bool adc_oneshot_hal_convert(adc_oneshot_hal_ctx_t *hal, int *out_raw)
}
adc_oneshot_ll_clear_event(event);
adc_oneshot_ll_disable_all_unit();
adc_oneshot_ll_enable(hal->unit);
adc_hal_onetime_start(hal->unit, hal->clk_src_freq_hz, &read_delay_us);
+7 -3
View File
@@ -8,6 +8,7 @@
#include <stdbool.h>
#include <stdlib.h>
#include "esp_attr.h"
#include "esp_rom_sys.h"
#include "soc/adc_periph.h"
#include "soc/apb_saradc_struct.h"
@@ -806,7 +807,11 @@ static inline void adc_oneshot_ll_output_invert(adc_unit_t adc_n, bool inv_en)
static inline void adc_oneshot_ll_enable(adc_unit_t adc_n)
{
HAL_ASSERT(adc_n == ADC_UNIT_1);
APB_SARADC.saradc_onetime_sample.saradc_saradc1_onetime_sample = 1;
// For ESP32C6, it need to delay 50us after enable oneshot mode to ensure the ADC channel select is stable.
if (APB_SARADC.saradc_onetime_sample.saradc_saradc1_onetime_sample == 0) {
APB_SARADC.saradc_onetime_sample.saradc_saradc1_onetime_sample = 1;
esp_rom_delay_us(50);
}
}
/**
@@ -814,8 +819,7 @@ static inline void adc_oneshot_ll_enable(adc_unit_t adc_n)
*/
static inline void adc_oneshot_ll_disable_all_unit(void)
{
APB_SARADC.saradc_onetime_sample.saradc_saradc1_onetime_sample = 0;
APB_SARADC.saradc_onetime_sample.saradc_saradc2_onetime_sample = 0;
// For ESP32C6, we keep saradc_saradc1_onetime_sample as 1 when oneshot mode.
}
/**