diff --git a/components/hal/adc_oneshot_hal.c b/components/hal/adc_oneshot_hal.c index 096fbcfb89..b9cfdcbe8f 100644 --- a/components/hal/adc_oneshot_hal.c +++ b/components/hal/adc_oneshot_hal.c @@ -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); diff --git a/components/hal/esp32c6/include/hal/adc_ll.h b/components/hal/esp32c6/include/hal/adc_ll.h index 92af7fc0da..011b47f7da 100644 --- a/components/hal/esp32c6/include/hal/adc_ll.h +++ b/components/hal/esp32c6/include/hal/adc_ll.h @@ -8,6 +8,7 @@ #include #include #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. } /**