評測三、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文章
16339瀏覽量
177853 -
Linux
+關注
關注
87文章
11296瀏覽量
209358 -
I2C
+關注
關注
28文章
1486瀏覽量
123630 -
開發板
+關注
關注
25文章
5035瀏覽量
97384 -
RISC-V
+關注
關注
45文章
2271瀏覽量
46134
發布評論請先 登錄
相關推薦
評論