bigbat 发表于 2021-9-6 20:06

平头哥RVB2601板子-ADC采集与CSI

<p>依据有限的资料知道CH2601的内部是有ADC的。但是引脚通过&ldquo;ARDUINO&rdquo;接口引出来的。</p>

<p> CH2601的adc驱动是在YOC开发包中提供的既CSI接口,CSI 是针对嵌入式系统,定义了CPU内核移植 接口、外围设备操作接口统一软件接口规范,消除不同芯片的差异,简化软件的使用及提高软件的移植性。通过CSI 接口规范,可以快速实现芯片对接到YoC 平台。CSI有CSI1和CSI2两种,CSI2的功能较CSI1的代码密度要高,CSI2的抽象要好一些。</p>

<p>CH2601的ADC可提供&ldquo;支持单次转换、连续转换&rdquo;本次测试为单次采集测试。代码根据yoc的例程。</p>

<p>程序的主要步骤如下:</p>

<p>1、打开引脚的功能&nbsp;csi_pin_set_mux(EXAMPLE_ADC_CHANNEL0_PIN, &nbsp;EXAMPLE_ADC_CHANNEL0_PIN_FUNC);</p>

<p>2、ADC初始化,ret = csi_adc_init(&amp;adc, 0);</p>

<p>3、设置ADC的工作采样频率ret = csi_adc_freq_div(&amp;adc, 128);</p>

<p>4、设置采样周期,ret = csi_adc_sampling_time(&amp;adc, 2);</p>

<p>5、使能ADC通道,&nbsp;ret = csi_adc_channel_enable(&amp;adc, 0, true);</p>

<p>6、开始采样,&nbsp;ret = csi_adc_start(&amp;adc);</p>

<p>7、读取采样数据,data = csi_adc_read(&amp;adc);</p>

<p>6,7的步骤可以反复的进行。完整的程序如下:</p>

<pre>
<code class="language-cpp">#include &lt;drv/adc.h&gt;
#include &lt;drv/tick.h&gt;
#include &lt;board_config.h&gt;
//#include &lt;board_init.h&gt;
#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(&amp;adc, 0);
    ADC_CHECK_RETURN(ret);
       
        ret = csi_adc_freq_div(&amp;adc, 128);
    if(ret == 0){
      return -1;
    }
       
        /* Configure sampling time */
    ret = csi_adc_sampling_time(&amp;adc, 2);
    ADC_CHECK_RETURN(ret);

    /* Enable channel */
    ret = csi_adc_channel_enable(&amp;adc, 0, true);
    ADC_CHECK_RETURN(ret);

    /* Trigger new conversion */
    ret = csi_adc_start(&amp;adc);
    ADC_CHECK_RETURN(ret);

    /* Read result */
    data = csi_adc_read(&amp;adc);
    printf("get adc result: %d\n", data);
       
        /* Uninit adc */
    csi_adc_uninit(&amp;adc);
               
    LOGD(TAG, "%s\n", aos_get_app_version());
    oled_init();
    while (1) {
      LOGD(TAG, "Hello world! YoC");
      aos_msleep(1000);
    }

    return 0;
}
</code></pre>

<p>&nbsp;csi_adc_uninit(&amp;adc);这一步是可以选的,本次测试结果:</p>

<p> &nbsp;</p>

w494143467 发表于 2021-9-7 16:49

<p>我以为CSI摄像头接口呢!</p>

freebsder 发表于 2021-9-8 00:11

<p>csi是个什么缩写?</p>

bigbat 发表于 2021-9-8 12:44

freebsder 发表于 2021-9-8 00:11
csi是个什么缩写?

<p>只需要根据芯片驱动接口层(CSI)的定义,CHIP SERVIC INTFACE</p>

qq329769206 发表于 2021-9-8 14:32

<p>&nbsp; 惊喜的发现我代理的ES7210+ES8156。哈哈!</p>

freebsder 发表于 2021-9-8 22:11

bigbat 发表于 2021-9-8 12:44
只需要根据芯片驱动接口层(CSI)的定义,CHIP SERVIC INTFACE

<p>卧槽,瞎弄这种大多数人认可的缩写,让人费解。</p>
页: [1]
查看完整版本: 平头哥RVB2601板子-ADC采集与CSI