评测三、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;
}
依旧报错,暂时未调通。
审核编辑:汤梓红
-
控制器
+关注
关注
112文章
16185浏览量
177337 -
Linux
+关注
关注
87文章
11219浏览量
208879 -
I2C
+关注
关注
28文章
1481浏览量
123244 -
开发板
+关注
关注
25文章
4933浏览量
97160 -
RISC-V
+关注
关注
44文章
2227浏览量
46000
发布评论请先 登录
相关推荐
评论