提示:Linux系统中,一些传感器通常挂载在I2C总线上,比如RTC和CSI等。我们在调试这些设备的时候,就需要了解Linux系统中操作I2C总线的方法。本文将详细介绍在Linux系统中如何调试I2C设备。
1、查看系统中的I2C总线: ls /dev/i2c-* 或 i2cdetect -l
2、列出系统中I2C总线上挂载的设备:i2cdetect -y -r 0/1/2
attachments-2020-04-a0ZQEANV5e9969257b103.png可以看到,在I2C-1上挂载了一个设备,这个设备的I2C地址为0x51
3、查看设备寄存器的值:i2cdump -f -y 1 0x51
4、设置寄存器的值:i2cset -f -y 1 0x51 0x00 0xaa
5、i2cdump和i2cset默认设备的寄存器是8位的,而有些设备的寄存器则是16位的,因此16位的设备不能再通过i2cdump和i2cset来调试,只能使用i2ctransfer,首先在buildroot/busybox中查找是否提供该命令:
attachments-2020-04-5e4F8UB75e996ddad9d5f.png可以看到是没有提供i2ctransfer的,我们需要通过单独编译i2c-tools的方式来移植,i2c-tools源码可以在这里下载https://mirrors.edge.kernel.org/pub/software/utils/i2c-tools/
我们选择最新的4.1版本
attachments-2020-04-f76BvjVg5e996eac6a2bb.png在ubuntu下解压并进入解压目录,新建install目录
在ubuntu下解压并进入解压目录,新建install目录
接着编辑Makefile,设置交叉编译链和安装目录:
执行make开始编译
执行make install 安装
将install/bin、install/sbin和install/lib目录的所有文件拷贝到板子文件系统/bin,/sbin和/lib目录下
6、使用i2ctransfer读8位寄存器:i2ctransfer -f -y 1 w1@0x51 0xff r1
使用i2ctransfer读16位寄存器:i2ctransfer -f -y 1 w1@0x51 0x01 r2
使用i2ctransfer写8位寄存器的值:i2ctransfer -f -y 1 w2@0x51 0xff 0x11
使用i2ctransfer写16位寄存器的值:i2ctransfer -f -y 1 w3@0x51 0x01 0xaa 0xbb