Skip to content

Commit

Permalink
Merge branch 'bugfix/workaround_reset_eof_counter_c3_v5.1' into 'rele…
Browse files Browse the repository at this point in the history
…ase/v5.1'

fix(adc): workaround to fix adc continuous get less results on c3 (v5.1)

See merge request espressif/esp-idf!29137
  • Loading branch information
suda-morris committed Mar 14, 2024
2 parents 077a966 + 5101e52 commit 374e54c
Show file tree
Hide file tree
Showing 5 changed files with 42 additions and 7 deletions.
5 changes: 5 additions & 0 deletions components/esp_adc/adc_continuous.c
Original file line number Diff line number Diff line change
Expand Up @@ -390,6 +390,11 @@ esp_err_t adc_continuous_stop(adc_continuous_handle_t handle)
//stop ADC
adc_hal_digi_stop(&handle->hal);

#if ADC_LL_WORKAROUND_CLEAR_EOF_COUNTER
periph_module_reset(PERIPH_SARADC_MODULE);
adc_hal_digi_clr_eof();
#endif

adc_hal_digi_deinit(&handle->hal);

if (handle->use_adc2) {
Expand Down
5 changes: 1 addition & 4 deletions components/esp_adc/test_apps/adc/main/test_adc_driver.c
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD
* SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
Expand Down Expand Up @@ -142,8 +142,6 @@ TEST_CASE("ADC oneshot fast work with ISR", "[adc_oneshot]")
#define ADC_DRIVER_TEST_GET_DATA(p_data) ((p_data)->type2.data)
#endif

#if !CONFIG_IDF_TARGET_ESP32C3 //TODO: DIG-270

#define ADC_RESTART_TEST_SIZE 4096
#define ADC_READ_TEST_COUNT 10

Expand Down Expand Up @@ -191,7 +189,6 @@ TEST_CASE("ADC continuous test after restarting", "[adc_continuous]")
TEST_ESP_OK(adc_continuous_deinit(handle));
free(result);
}
#endif //!CONFIG_IDF_TARGET_ESP32C3

#if SOC_ADC_DIG_IIR_FILTER_SUPPORTED
TEST_CASE("ADC filter exhausted allocation", "[adc_oneshot]")
Expand Down
9 changes: 8 additions & 1 deletion components/hal/adc_hal.c
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2019-2023 Espressif Systems (Shanghai) CO LTD
* SPDX-FileCopyrightText: 2019-2024 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
Expand Down Expand Up @@ -358,3 +358,10 @@ void adc_hal_digi_stop(adc_hal_dma_ctx_t *hal)
//disconnect DMA and peripheral
adc_ll_digi_dma_disable();
}

#if ADC_LL_WORKAROUND_CLEAR_EOF_COUNTER
void adc_hal_digi_clr_eof(void)
{
adc_ll_digi_dma_clr_eof();
}
#endif
21 changes: 20 additions & 1 deletion components/hal/esp32c3/include/hal/adc_ll.h
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD
* SPDX-FileCopyrightText: 2015-2024 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
Expand Down Expand Up @@ -56,6 +56,13 @@ extern "C" {
#define ADC_LL_DEFAULT_CONV_LIMIT_EN 0
#define ADC_LL_DEFAULT_CONV_LIMIT_NUM 10

/**
* Workaround: on ESP32C3, the internal hardware counter that counts ADC samples will not be automatically cleared,
* and there is no dedicated register to manually clear it. (see section 3.2 of the errata document).
* Therefore, traverse from 0 to the value configured last time, so as to clear the ADC sample counter.
*/
#define ADC_LL_WORKAROUND_CLEAR_EOF_COUNTER (1)

/*---------------------------------------------------------------
PWDET (Power Detect)
---------------------------------------------------------------*/
Expand Down Expand Up @@ -437,6 +444,18 @@ static inline void adc_ll_digi_dma_set_eof_num(uint32_t num)
HAL_FORCE_MODIFY_U32_REG_FIELD(APB_SARADC.dma_conf, apb_adc_eof_num, num);
}

/**
* Clear ADC sample counter of adc digital controller.
*/
static inline void adc_ll_digi_dma_clr_eof(void)
{
uint32_t eof_num = HAL_FORCE_READ_U32_REG_FIELD(APB_SARADC.dma_conf, apb_adc_eof_num);
for (int i = 0; i <= eof_num; i++)
{
HAL_FORCE_MODIFY_U32_REG_FIELD(APB_SARADC.dma_conf, apb_adc_eof_num, i);
}
}

/**
* Enable output data to DMA from adc digital controller.
*/
Expand Down
9 changes: 8 additions & 1 deletion components/hal/include/hal/adc_hal.h
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD
* SPDX-FileCopyrightText: 2021-2024 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
Expand Down Expand Up @@ -207,6 +207,13 @@ void adc_hal_digi_dis_intr(adc_hal_dma_ctx_t *hal, uint32_t mask);
*/
void adc_hal_digi_stop(adc_hal_dma_ctx_t *hal);

#if ADC_LL_WORKAROUND_CLEAR_EOF_COUNTER
/**
* @brief Clear the ADC sample counter
*/
void adc_hal_digi_clr_eof(void);
#endif

#ifdef __cplusplus
}
#endif

0 comments on commit 374e54c

Please sign in to comment.