322|6

1689

帖子

2

资源

纯净的硅(高级)

平头哥RVB2601板子-IIC总线测试 [复制链接]

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

image.png  

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

image.png

板子的接线图

image.png

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);函数中出不来,

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


回复

8711

帖子

20

资源

版主

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


回复

6132

帖子

0

资源

五彩晶圆(初级)

应该是没有接入设备的原因


回复

831

帖子

3

资源

版主

先读ID,看能否读出来?

点评

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

回复

1689

帖子

2

资源

纯净的硅(高级)

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

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

点评

你轮询扫描IIC外围设备,从0x01到0xff试一下,看看有没有回应。  详情 回复 发表于 2021-9-13 16:17
找厂家问问  详情 回复 发表于 2021-9-11 10:39

回复

831

帖子

3

资源

版主

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

找厂家问问

个人签名

没有什么不可以,我就是我,不一样的烟火! 


回复

1838

帖子

3

资源

版主

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

你轮询扫描IIC外围设备,从0x01到0xff试一下,看看有没有回应。


回复
您需要登录后才可以回帖 登录 | 注册

最新文章 更多>>
    关闭
    站长推荐上一条 1/9 下一条

    About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

    站点相关: 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

    北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

    电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2021 EEWORLD.com.cn, Inc. All rights reserved
    快速回复 返回顶部 返回列表