依据有限的资料知道CH2601的内部是有ADC的。但是引脚通过“ARDUINO”接口引出来的。
CH2601的adc驱动是在YOC开发包中提供的既CSI接口,CSI 是针对嵌入式系统,定义了CPU内核移植 接口、外围设备操作接口统一软件接口规范,消除不同芯片的差异,简化软件的使用及提高软件的移植性。通过CSI 接口规范,可以快速实现芯片对接到YoC 平台。CSI有CSI1和CSI2两种,CSI2的功能较CSI1的代码密度要高,CSI2的抽象要好一些。
CH2601的ADC可提供“支持单次转换、连续转换”本次测试为单次采集测试。代码根据yoc的例程。
程序的主要步骤如下:
1、打开引脚的功能 csi_pin_set_mux(EXAMPLE_ADC_CHANNEL0_PIN, EXAMPLE_ADC_CHANNEL0_PIN_FUNC);
2、ADC初始化,ret = csi_adc_init(&adc, 0);
3、设置ADC的工作采样频率ret = csi_adc_freq_div(&adc, 128);
4、设置采样周期,ret = csi_adc_sampling_time(&adc, 2);
5、使能ADC通道, ret = csi_adc_channel_enable(&adc, 0, true);
6、开始采样, ret = csi_adc_start(&adc);
7、读取采样数据,data = csi_adc_read(&adc);
6,7的步骤可以反复的进行。完整的程序如下:
#include <drv/adc.h>
#include <drv/tick.h>
#include <board_config.h>
//#include <board_init.h>
#define ADC_CHECK_RETURN(ret) \
do { \
if (ret != CSI_OK) { \
return -1; \
} \
} while(0);
static csi_adc_t adc;
int main(void)
{
int ret;
uint32_t data;
board_yoc_init();
csi_pin_set_mux(EXAMPLE_ADC_CHANNEL0_PIN, EXAMPLE_ADC_CHANNEL0_PIN_FUNC);
ret = csi_adc_init(&adc, 0);
ADC_CHECK_RETURN(ret);
ret = csi_adc_freq_div(&adc, 128);
if(ret == 0){
return -1;
}
/* Configure sampling time */
ret = csi_adc_sampling_time(&adc, 2);
ADC_CHECK_RETURN(ret);
/* Enable channel */
ret = csi_adc_channel_enable(&adc, 0, true);
ADC_CHECK_RETURN(ret);
/* Trigger new conversion */
ret = csi_adc_start(&adc);
ADC_CHECK_RETURN(ret);
/* Read result */
data = csi_adc_read(&adc);
printf("get adc result: %d\n", data);
/* Uninit adc */
csi_adc_uninit(&adc);
LOGD(TAG, "%s\n", aos_get_app_version());
oled_init();
while (1) {
LOGD(TAG, "Hello world! YoC");
aos_msleep(1000);
}
return 0;
}
csi_adc_uninit(&adc);这一步是可以选的,本次测试结果:
|