| | |
| | | /* |
| | | * Copyright (c) 2019-2023 Beijing Hanwei Innovation Technology Ltd. Co. and |
| | | * Copyright (c) 2019-2025 Beijing Hanwei Innovation Technology Ltd. Co. and |
| | | * its subsidiaries and affiliates (collectly called MKSEMI). |
| | | * |
| | | * All rights reserved. |
| | |
| | | return DRV_ERROR; |
| | | } |
| | | |
| | | // check if ADC is using by HW or not |
| | | if (adc_handle.base->STATUS & ADC_STATUS_BUSY_MSK) |
| | | if (adc_handle.state == ADC_STATE_BUSY) |
| | | { |
| | | return DRV_BUSY; |
| | | } |
| | |
| | | /* If the external reference voltage driving capability is insufficient */ |
| | | /* It is recommended to enable this configuration */ |
| | | // val |= (9 << 1) | (1 << 4); |
| | | val |= (1 << 9) | (7 << 5) | (1 << 4); |
| | | } |
| | | REG_WRITE(0x4000062C, val); |
| | | |
| | |
| | | |
| | | int adc_close(void) |
| | | { |
| | | // check if ADC is using by HW or not |
| | | if ((adc_handle.base->STATUS & ADC_STATUS_BUSY_MSK) && (adc_handle.state != ADC_STATE_BUSY)) |
| | | if (adc_handle.state == ADC_STATE_BUSY) |
| | | { |
| | | return DRV_BUSY; |
| | | } |
| | |
| | | |
| | | dma_open(adc_handle.dma_ch, &adc_dma_cfg); |
| | | dma_transfer(adc_handle.dma_ch, (uint32_t *)&adc_handle.base->DATA, data, number, adc_dma_callback); |
| | | |
| | | adc_handle.base->DMA_EN = ADC_DMA_EN_MSK; |
| | | |
| | | // start conversion |
| | | adc_handle.base->CTRL2 = ADC_CTRL2_CONV_EN_MSK; |
| | | #endif |
| | |
| | | { |
| | | if (adc_handle.mode == ADC_MODE_CONTINUE) |
| | | { |
| | | adc_handle.base->DMA_EN &= ~ADC_DMA_EN_MSK; |
| | | |
| | | // stop conversion |
| | | adc_handle.base->CTRL2 &= ~ADC_CTRL2_CONV_EN_MSK; |
| | | } |
| | |
| | | { |
| | | // enable ADC |
| | | struct ADC_CFG_T vs_adc_cfg; |
| | | vs_adc_cfg.mode = ADC_MODE_SINGLE; /* Selected single conversion mode */ |
| | | vs_adc_cfg.mode = ADC_MODE_CONTINUE; /* Selected single conversion mode */ |
| | | vs_adc_cfg.clk_sel = ADC_CLK_HIGH; /* Selected 62.4M high speed clock */ |
| | | vs_adc_cfg.vref_sel = ADC_SEL_VREF_INT; /* Using internal reference voltage (1.2V)*/ |
| | | vs_adc_cfg.rate = 1000; /* ADC works at high frequency system clock, the maximum sampling rate is 2M */ |
| | |
| | | adc_close(); |
| | | } |
| | | |
| | | static void adc_continue_callback(void *data, uint32_t number) |
| | | { |
| | | |
| | | //LOG_INFO(TRACE_MODULE_APP, "Chip adc callback %d degree\r\n", data); |
| | | } |
| | | int16_t battery_monitor_get(void) |
| | | { |
| | | #define NUM_SAMPLES (1) |
| | | #define NUM_SAMPLES (3) |
| | | |
| | | uint32_t sample[NUM_SAMPLES]; |
| | | adc_get(&sample[0], NUM_SAMPLES, adc_continue_callback); |
| | | adc_get(&sample[0], NUM_SAMPLES, NULL); |
| | | |
| | | int32_t sum = 0; |
| | | for (int i = 0; i < NUM_SAMPLES; i++) |