CH2601的内部设计有IIC总线,板子上的I2C总线与ES7210连接,ES7210芯片是四通道ADC采集芯片,在板子上连接了硅麦,
ES7210的数据是通过I2S总线连接的CH2601,芯片的配置是通过IIC连接到CH2601的,I2S是音频数据的传输通道。开始打算使用IIC读取ES7210的配置信息,但是手头没有ES7210的资料,也就没有办法测试了。于是就只有把跳线取下来这一办法了。也就是J1的[3,4],[5,6]两根跳线就可以。
板子的接线图
PA8和PA9这两条跳线就可以,我同时将这两条线接到了适配器上用来观察波形。
程序的引用文件
#include "drv/iic.h"
#include <soc.h>
程序的步骤
1、打开引脚功能,csi_pin_set_mux(PA8, PA8_IIC0_SCL);
2、初始化端口,ret = csi_iic_init(&master_iic, IIC_IDX);端口 0
3、配置IIC为主模式,ret = csi_iic_mode(&master_iic, IIC_MODE_MASTER);
4、配置设备地址,ret = csi_iic_addr_mode(&master_iic, IIC_ADDRESS_7BIT);
5、设置IIC总线速度,ret = csi_iic_speed(&master_iic, IIC_BUS_SPEED_STANDARD);
6、发送数据,num = csi_iic_master_send(&master_iic, IIC_SLAVE_ADDR, write_data, sizeof(write_data), 100000);
7、接收数据,num = csi_iic_master_receive(&master_iic, IIC_SLAVE_ADDR, read_data, sizeof(read_data), 100000);
#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[10];
uint8_t read_data[10];
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;
}
我在主程序中调用了测试函数
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;
}
我使用了示波器,看到有脉冲输出,但是不知道为什么程序一直都在num = csi_iic_master_send(&master_iic, IIC_SLAVE_ADDR, write_data, sizeof(write_data), 100000);函数中出不来,
而且超时机制有没有起作用。可以看到函数中有while(1)这样的循环语句。猜测:可能原因是没有接入设备,没有ACK信号的原因吧!
|