简介
I2C tools包含一套用于Linux应用层测试各种各样I2C功能的工具。它的主要功能包括:总线探测工具、SMBus访问帮助程序、EEPROM解码脚本、EEPROM编程工具和用于SMBus访问的python模块。只要你所使用的内核中包含I2C设备驱动,那么就可以在你的板子中正常使用这个测试工具。
参考:https://zhuanlan.zhihu.com/p/443741898
安装方式
- 自己交叉编译:下载源码,交叉编译,安装。
- 文件系统构建工具里面勾选相关选项。
命令介绍:
- i2cdetect:用于扫描 i2c 总线上的设备,并显示地址
- i2cdump:查看寄存器值
- i2cget:获取单个寄存器值(8位寄存器)
- i2cset:设置单个寄存器值(8位寄存器)
- i2ctransfer:一次写多个字节数据(16位寄存器)
参数介绍:
- -y:禁用交互模式。
- -f:强制访问设备。
- -r:写入后立即读回该值。
Usage: i2cdetect [-y] [-a] [-q|-r] I2CBUS [FIRST LAST]
i2cdetect -F I2CBUS
i2cdetect -l
I2CBUS is an integer or an I2C bus name
If provided, FIRST and LAST limit the probing range.
-y:关闭交互式,不会显示警告信息
-a:扫描总线上所有设备
-q:使用SMBus的"quick write"命令进行检测,不建议使用
-r:使用SMBus的"receive byte"命令进行检测,不建议使用
i2cbus:指定查询某个总线编号
first、last:扫描的地址范围
使用例子
列出系统可用i2c总线
列出当前系统所有可用的i2c总线:i2cdetect -l
# i2cdetect -l
i2c-0 i2c mv64xxx_i2c adapter I2C adapter
由上可知,只有一组总线,即i2c0。
还有多组i2c总线是这样排列的:
# i2cdetect -l
i2c-0 i2c mv64xxx_i2c adapter I2C adapter
i2c-1 i2c DP-AUX adapter I2C adapter
i2c-2 i2c DesignWare HDMI I2C adapter
检测i2c总线上的器件
检测第0条总线上的器件:i2cdetect -r -y 0
# i2cdetect -r -y 0
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- UU -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
-
--
表示该地址被检测,但是没有芯片应答,UU 表示该地址被当前内核驱动使用。 -
如上图显示,在i2c0总线上,有一个器件,设备地址分别是:0x48
-
上图是一张地址表,垂直方向和水平方向的
UU
交点,就是地址值(如上:0x40+0x08=0x48)。
获取器件所有寄存器的值
查看器件所有寄存器的值:i2cdump -f -y i2c总线 器件地址(16进制)
实例:i2cdump -y -f 0 0x48
i2c0总线,0x48地址
# i2cdump -y -f 0 0x48
0 1 2 3 4 5 6 7 8 9 a b c d e f 0123456789abcdef
00: ff ff ff ff ff ff ff ff c0 3f 3f 3f 3f 3f 3f 3f ........????????
10: 00 ff ff ff ff ff ff ff c0 00 00 00 00 00 00 00 ........?.......
20: 7f ff ff ff ff ff ff f8 c0 2d 4a 5c 6d 82 84 84 ?......??-J\m???
30: ff ff ff ff ff ff ff ff c0 31 37 45 4d 60 5f 7a ........?17EM`_z
40: ff ff ff ff ff ff ff ff c0 4c 4c 4c 4c 4c 4c 4c ........?LLLLLLL
50: ff ff ff ff ff ff ff ff c0 3d 3d 3d 3d 3d 3d 3d ........?=======
60: 00 ff ff ff ff ff ff ff c0 00 00 00 00 00 00 00 ........?.......
70: 7f ff ff ff ff ff ff ff c0 2c 44 49 54 5b 6c 7b ?.......?,DIT[l{
80: 00 00 00 00 00 00 00 00 02 04 04 06 08 0a 0b 0e ........????????
90: ce ce cd ce c7 ce ce cb ce ce ce cf d0 ce cd cd ????????????????
a0: c9 c2 b5 ad af bc be c3 b9 bc be c1 af b7 b9 b9 ????????????????
b0: 9a 9a 9b 9a 9b 9b 9b 9a 9b 9a 9a 9b 9a 99 9a 9a ????????????????
c0: ff 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
d0: d6 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ?...............
e0: 00 00 00 00 01 00 00 00 04 00 00 00 00 00 00 00 ....?...?.......
f0: ff ff ff ff ff ff fe ff ff ff ff ff ff ff ff ff ......?.........
获取单个寄存器的值
获取单个寄存器的值:i2cget -y -f i2c总线 器件地址(16进制) 寄存器地址(16进制)
实例:i2cget -y -f 0 0x48 0x3a
i2c0总线,0x48器件地址,0x3a寄存器地址
# i2cget -y -f 0 0x48 0x3a
0xff
设置单个寄存器的值
设置单个寄存器的值:2cset -y -f i2c总线 器件地址(16进制) 寄存器地址(16进制) 要写入的值
实例:i2cset -y -f 0 0x48 0xa0 0x03
i2c0总线,0x48器件地址,0xa0寄存器地址,设置的值0x03
# i2cset -y -f 0 0x48 0xa0 0x03
# i2cget -y -f 0 0x48 0xa0
0x03