bigbat 发表于 2021-9-10 19:31

平头哥RVB2601板子-IIC总线测试

<p>CH2601的内部设计有IIC总线,板子上的I2C总线与ES7210连接,ES7210芯片是四通道ADC采集芯片,在板子上连接了硅麦,</p>

<p> &nbsp;</p>

<p>ES7210的数据是通过I2S总线连接的CH2601,芯片的配置是通过IIC连接到CH2601的,I2S是音频数据的传输通道。开始打算使用IIC读取ES7210的配置信息,但是手头没有ES7210的资料,也就没有办法测试了。于是就只有把跳线取下来这一办法了。也就是J1的,两根跳线就可以。</p>

<p></p>

<p>板子的接线图</p>

<p></p>

<p>PA8和PA9这两条跳线就可以,我同时将这两条线接到了适配器上用来观察波形。</p>

<p>程序的引用文件</p>

<pre>
<code class="language-cpp">#include "drv/iic.h"
#include &lt;soc.h&gt;
</code></pre>

<p>程序的步骤</p>

<p>1、打开引脚功能,csi_pin_set_mux(PA8, PA8_IIC0_SCL);&nbsp;&nbsp;</p>

<p>2、初始化端口,ret = csi_iic_init(&amp;master_iic, IIC_IDX);端口 0&nbsp;</p>

<p>3、配置IIC为主模式,ret = csi_iic_mode(&amp;master_iic, IIC_MODE_MASTER);</p>

<p>4、配置设备地址,ret = csi_iic_addr_mode(&amp;master_iic, IIC_ADDRESS_7BIT);</p>

<p>5、设置IIC总线速度,ret = csi_iic_speed(&amp;master_iic, IIC_BUS_SPEED_STANDARD);</p>

<p>6、发送数据,num = csi_iic_master_send(&amp;master_iic, IIC_SLAVE_ADDR, write_data, sizeof(write_data), 100000);</p>

<p>7、接收数据,num = csi_iic_master_receive(&amp;master_iic, IIC_SLAVE_ADDR, read_data, sizeof(read_data), 100000);</p>

<pre>
<code class="language-cpp">#include "drv/iic.h"
#include &lt;soc.h&gt;

#define IIC_SLAVE_ADDR      0x50
#define IIC_IDX             0
static csi_iic_t master_iic;

int example_iic(void)
{
uint8_t write_data;
uint8_t read_data;
csi_error_t ret;
uint32_t i;
int32_t num;

csi_pin_set_mux(PA8, PA8_IIC0_SCL);
csi_pin_set_mux(PA9, PA9_IIC0_SDA);

ret = csi_iic_init(&amp;master_iic, IIC_IDX);
if (ret != CSI_OK) {
    printf("csi_iic_initialize error\n");
    return -1;
}
/* config iic master mode */
ret = csi_iic_mode(&amp;master_iic, IIC_MODE_MASTER);
if (ret != CSI_OK) {
      printf("csi_iic_set_mode error\n");
      return -1;
}
/* config iic 7bit address mode */
ret = csi_iic_addr_mode(&amp;master_iic, IIC_ADDRESS_7BIT);
if (ret != CSI_OK) {
      printf("csi_iic_set_addr_mode error\n");
      return -1;
}
/* config iic standard speed*/
ret = csi_iic_speed(&amp;master_iic, IIC_BUS_SPEED_STANDARD);
if (ret != CSI_OK) {
      printf("csi_iic_set_speed error\n");
      return -1;
}

for (i = 0; i &lt; sizeof(write_data); i++) {
      write_data = i;         ///&lt; init write_data value
}

num = csi_iic_master_send(&amp;master_iic, IIC_SLAVE_ADDR, write_data, sizeof(write_data), 100000);
if (num != sizeof(write_data)) {
      printf("csi_iic_master_send error\n");
      return -1;
}

num = csi_iic_master_receive(&amp;master_iic, IIC_SLAVE_ADDR, read_data, sizeof(read_data), 100000);
if (num != sizeof(read_data)) {
      printf("csi_iic_master_receive error\n");
      return -1;
    }
csi_iic_uninit(&amp;master_iic);
return 0;
}
</code></pre>

<p>我在主程序中调用了测试函数</p>

<pre>
<code class="language-cpp">int main(void)
{
    board_yoc_init();
        example_iic();
    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>我使用了示波器,看到有脉冲输出,但是不知道为什么程序一直都在num = csi_iic_master_send(&amp;master_iic, IIC_SLAVE_ADDR, write_data, sizeof(write_data), 100000);函数中出不来,</p>

<p>&nbsp;而且超时机制有没有起作用。可以看到函数中有while(1)这样的循环语句。猜测:可能原因是没有接入设备,没有ACK信号的原因吧!</p>

littleshrimp 发表于 2021-9-10 19:53

<p>应该是,I2C要有匹配地址的从设备相应。</p>

Jacktang 发表于 2021-9-10 21:12

<p>应该是没有接入设备的原因</p>

annysky2012 发表于 2021-9-11 10:13

先读ID,看能否读出来?

bigbat 发表于 2021-9-11 10:21

annysky2012 发表于 2021-9-11 10:13
先读ID,看能否读出来?

<p>开始我就是这么想的,可是ES7210没有什么资料</p>

annysky2012 发表于 2021-9-11 10:39

bigbat 发表于 2021-9-11 10:21
开始我就是这么想的,可是ES7210没有什么资料

<p>找厂家问问</p>

w494143467 发表于 2021-9-13 16:17

bigbat 发表于 2021-9-11 10:21
开始我就是这么想的,可是ES7210没有什么资料

<p>你轮询扫描IIC外围设备,从0x01到0xff试一下,看看有没有回应。</p>
页: [1]
查看完整版本: 平头哥RVB2601板子-IIC总线测试