平头哥RVB2601板子-IIC总线测试
<p>CH2601的内部设计有IIC总线,板子上的I2C总线与ES7210连接,ES7210芯片是四通道ADC采集芯片,在板子上连接了硅麦,</p><p> </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 <soc.h>
</code></pre>
<p>程序的步骤</p>
<p>1、打开引脚功能,csi_pin_set_mux(PA8, PA8_IIC0_SCL); </p>
<p>2、初始化端口,ret = csi_iic_init(&master_iic, IIC_IDX);端口 0 </p>
<p>3、配置IIC为主模式,ret = csi_iic_mode(&master_iic, IIC_MODE_MASTER);</p>
<p>4、配置设备地址,ret = csi_iic_addr_mode(&master_iic, IIC_ADDRESS_7BIT);</p>
<p>5、设置IIC总线速度,ret = csi_iic_speed(&master_iic, IIC_BUS_SPEED_STANDARD);</p>
<p>6、发送数据,num = csi_iic_master_send(&master_iic, IIC_SLAVE_ADDR, write_data, sizeof(write_data), 100000);</p>
<p>7、接收数据,num = csi_iic_master_receive(&master_iic, IIC_SLAVE_ADDR, read_data, sizeof(read_data), 100000);</p>
<pre>
<code class="language-cpp">#include "drv/iic.h"
#include <soc.h>
#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(&master_iic, IIC_IDX);
if (ret != CSI_OK) {
printf("csi_iic_initialize error\n");
return -1;
}
/* config iic master mode */
ret = csi_iic_mode(&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(&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(&master_iic, IIC_BUS_SPEED_STANDARD);
if (ret != CSI_OK) {
printf("csi_iic_set_speed error\n");
return -1;
}
for (i = 0; i < sizeof(write_data); i++) {
write_data = i; ///< init write_data value
}
num = csi_iic_master_send(&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(&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(&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(&master_iic, IIC_SLAVE_ADDR, write_data, sizeof(write_data), 100000);函数中出不来,</p>
<p> 而且超时机制有没有起作用。可以看到函数中有while(1)这样的循环语句。猜测:可能原因是没有接入设备,没有ACK信号的原因吧!</p>
<p>应该是,I2C要有匹配地址的从设备相应。</p> <p>应该是没有接入设备的原因</p>
先读ID,看能否读出来? annysky2012 发表于 2021-9-11 10:13
先读ID,看能否读出来?
<p>开始我就是这么想的,可是ES7210没有什么资料</p>
bigbat 发表于 2021-9-11 10:21
开始我就是这么想的,可是ES7210没有什么资料
<p>找厂家问问</p>
bigbat 发表于 2021-9-11 10:21
开始我就是这么想的,可是ES7210没有什么资料
<p>你轮询扫描IIC外围设备,从0x01到0xff试一下,看看有没有回应。</p>
页:
[1]