【Milk-V Duo开发板免费体验】评测三、I2C功能摸索

电子说

1.3w人已加入

描述

评测三、I2C功能摸索

          手册里说CV1800B有5个I2C控制器,分别如下:

控制器

正好手头有个BMP180,它的设备地址是0x77,于是修改设备树build/boards/cv180x/cv1800b_milkv_duo_sd/dts_riscv/cv1800b_milkv_duo_sd.dts使能I2C0:

&i2c0 {

   status = "okay";

   bmp180:bmp180@77 {

       compatible = "bmp180";

       reg = <0x77>;

   }; 

};

同时修改build/boards/default/u-boot/ cv180x_qfn_cvi_board_init.c重映射I2C0功能为默认:

          PINMUX_CONFIG(IIC0_SCL, IIC0_SCL);

          PINMUX_CONFIG(IIC0_SDA, IIC0_SDA);

以及build/boards/cv180x/cv1800b_milkv_duo_sd/u-boot使能IIC0:

CONFIG_IIO=y

控制器

图1 dts修改

然后编译生成镜像文件,在Windows下编译不知道为什么老是报错linux5.10/build/cv1800b_milkv_duo_sd/sur/include:cannot overwrite directory

控制器

图2 Windows下编译老是报错

由于之前烧过,再烧录重新登陆会提示“Host key verification failed”,不慌按提示的在.ssh/known_hosts编辑删掉192.168.42.1那一行USB RNDIS即可:

控制器

图3 重烧SSH报错

进入后用这篇帖子https://community.milkv.io/t/milk-v-duo-cvi-pinmux/292提供的cvi_pinmux工具查看I2C0引脚设置:

控制器

图4 扫不到目标

明明设置的是0x77(BMP180传感器的从机地址为0xEE),可无中生有扫出0x56,上传bmp180驱动,代码如下:

#include

#include

#include

#include

#include

#include

#include

#include

#define I2C_RETRIES 0x0701

#define I2C_TIMEOUT 0x0702

#define I2C_RDWR 0x0707

/*********定义struct i2c_rdwr_ioctl_data和struct i2c_msg,要和内核一致*******/

struct i2c_msg

{

          unsigned short addr;

          unsigned short flags;

#define I2C_M_TEN 0x0010

#define I2C_M_RD 0x0001

          unsigned short len;

          unsigned char *buf;

};

struct i2c_rdwr_ioctl_data

{

          struct i2c_msg *msgs;

          int nmsgs;

/* nmsgs这个数量决定了有多少开始信号,对于“单开始时序”,取1*/

};

/***********主程序***********/

int main()

{

          int i2c_file,ret;

          struct i2c_rdwr_ioctl_data sensor_data;

          i2c_file=open("/dev/i2c-0",O_RDWR);

          /*

          dev/i2c-0是在注册i2c-dev.c后产生的,代表一个可操作的适配器。如果不使用i2c-dev.c

          *的方式,就没有,也不需要这个节点。

          */

          if(i2c_file<0)

          {

                     printf("open I2C device failed %dn", errno);

                     return -ENODEV;

          }

          sensor_data.nmsgs=2;

          /*

          *因为操作时序中,最多是用到2个开始信号(字节读操作中),所以此将

          *sensor_data.nmsgs配置为2

          */

          sensor_data.msgs=(struct i2c_msg*)malloc(sensor_data.nmsgs*sizeof(struct i2c_msg));

          if(!sensor_data.msgs)

          {

                             perror("malloc error");

                             exit(1);

          }

          ioctl(i2c_file,I2C_TIMEOUT,1);/*超时时间*/

          ioctl(i2c_file,I2C_RETRIES,2);/*重复次数*/

 

          /******read data from sensor*******/

          sensor_data.nmsgs=2;

          (sensor_data.msgs[0]).len=1; //sensor 目标数据的地址

          (sensor_data.msgs[0]).addr=0x77; // sensor 设备地址

          (sensor_data.msgs[0]).flags=0;//write

          (sensor_data.msgs[0]).buf[0]=0xD0;//sensor数据地址

          (sensor_data.msgs[1]).len=1;//读出的数据

          (sensor_data.msgs[1]).addr=0x77;// sensor 设备地址

          (sensor_data.msgs[1]).flags=I2C_M_RD;//read

          (sensor_data.msgs[1]).buf=(unsigned char*)malloc(1);//存放返回值的地址。

          (sensor_data.msgs[1]).buf[0]=0;//初始化读缓冲

          ret=ioctl(i2c_file,I2C_RDWR,(unsigned long)&sensor_data);

          if(ret<0)

          {

                             perror("ioctl error2");

          }

          printf("buff[0]=%xn",(sensor_data.msgs[1]).buf[0]);

          close(i2c_file);

          return 0;

}

依旧报错,暂时未调通。

  审核编辑:汤梓红

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分