評(píng)測(cè)三、I2C功能摸索
手冊(cè)里說CV1800B有5個(gè)I2C控制器,分別如下:
正好手頭有個(gè)BMP180,它的設(shè)備地址是0x77,于是修改設(shè)備樹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>;
};
};
同時(shí)修改build/boards/default/u-boot/ cv180x_qfn_cvi_board_init.c重映射I2C0功能為默認(rèn):
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下編譯不知道為什么老是報(bào)錯(cuò)linux5.10/build/cv1800b_milkv_duo_sd/sur/include:cannot overwrite directory
圖2 Windows下編譯老是報(bào)錯(cuò)
由于之前燒過,再燒錄重新登陸會(huì)提示“Host key verification failed”,不慌按提示的在.ssh/known_hosts編輯刪掉192.168.42.1那一行USB RNDIS即可:
圖3重?zé)齋SH報(bào)錯(cuò)
進(jìn)入后用這篇帖子https://community.milkv.io/t/milk-v-duo-cvi-pinmux/292提供的cvi_pinmux工具查看I2C0引腳設(shè)置:
圖4掃不到目標(biāo)
明明設(shè)置的是0x77(BMP180傳感器的從機(jī)地址為0xEE),可無中生有掃出0x56,上傳bmp180驅(qū)動(dòng),代碼如下:
#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,要和內(nèi)核一致*******/
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這個(gè)數(shù)量決定了有多少開始信號(hào),對(duì)于“單開始時(shí)序”,取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是在注冊(cè)i2c-dev.c后產(chǎn)生的,代表一個(gè)可操作的適配器。如果不使用i2c-dev.c
*的方式,就沒有,也不需要這個(gè)節(jié)點(diǎn)。
*/
if(i2c_file<0)
{
printf("open I2C device failed %dn", errno);
return -ENODEV;
}
sensor_data.nmsgs=2;
/*
*因?yàn)椴僮鲿r(shí)序中,最多是用到2個(gè)開始信號(hào)(字節(jié)讀操作中),所以此將
*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);/*超時(shí)時(shí)間*/
ioctl(i2c_file,I2C_RETRIES,2);/*重復(fù)次數(shù)*/
/******read data from sensor*******/
sensor_data.nmsgs=2;
(sensor_data.msgs[0]).len=1; //sensor目標(biāo)數(shù)據(jù)的地址
(sensor_data.msgs[0]).addr=0x77; // sensor設(shè)備地址
(sensor_data.msgs[0]).flags=0;//write
(sensor_data.msgs[0]).buf[0]=0xD0;//sensor數(shù)據(jù)地址
(sensor_data.msgs[1]).len=1;//讀出的數(shù)據(jù)
(sensor_data.msgs[1]).addr=0x77;// sensor設(shè)備地址
(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;
}
依舊報(bào)錯(cuò),暫時(shí)未調(diào)通。
審核編輯:湯梓紅
-
控制器
+關(guān)注
關(guān)注
112文章
16419瀏覽量
178803 -
Linux
+關(guān)注
關(guān)注
87文章
11329瀏覽量
209977 -
I2C
+關(guān)注
關(guān)注
28文章
1495瀏覽量
124130 -
開發(fā)板
+關(guān)注
關(guān)注
25文章
5096瀏覽量
97829 -
RISC-V
+關(guān)注
關(guān)注
45文章
2308瀏覽量
46301
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論