本文作者:bigbat
依据有限的资料知道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);这一步是可以选的。
本次测试结果:
可以看到12位的ADC的采集值。
本文源自:平头哥芯片开放社区