一. 前言
前面调试一个I2C设备,用到了i2c-tools,觉得是一个调试I2C不错的工具,本文对i2c-tools的基本用法做一些介绍。i2c-tools是一些控制2C接口工具的集合,其中包括i2cdetect,i2cdump,i2cget,i2cset和i2ctransfer,其中i2cdetect是用来探测I2C总线上有哪些从设备的,i2cdump是用来输出某个从设备的各个数据地址的内容的,i2cget是用来获取某个从设备的某个数据地址的内容的,i2cset则是用来设置某个从设备的某个数据地址的内容的,i2ctransfer则兼具读和写的功能。本文主要介绍i2cdetect,i2cget,i2cset和i2cdump的功能和使用方法。本文使用的I2C外设是AT24C02。
二. 命令的使用方法
1. i2cdetect
i2cdetect的帮助信息如下:
Usage: i2cdetect [-y] [-a] [-q|-r] I2CBUS [FIRST LAST]i2cdetect -F I2CBUSi2cdetect -lI2CBUS is an integer or an I2C bus nameIf provided, FIRST and LAST limit the probing range.
i2cdetect是用来探测I2C总线上有哪些从设备的。探测的原理:根据I2C协议,当主设备发送从设备的地址(由从设备的A0,A1和A2决定)后,从设备需要回一个ACK,此时,主设备就知道了该地址的从设备存在,所以,I2C主设备依次发送从设备地址为0x03 - 0x77的地址数据,
root@OpenWrt:/# i2cdetect -y 00 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: 50 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
2. i2cset
i2cset命令的帮助信息如下:
root@OpenWrt:/# i2cset --help
Error: Unsupported option "--help"!
Usage: i2cset [-f] [-y] [-m MASK] [-r] [-a] I2CBUS CHIP-ADDRESS DATA-ADDRESS [VALUE] ... [MODE]I2CBUS is an integer or an I2C bus nameADDRESS is an integer (0x03 - 0x77, or 0x00 - 0x7f if -a is given)MODE is one of:c (byte, no value)b (byte data, default)w (word data)i (I2C block data)s (SMBus block data)Append p for SMBus PEC
i2cset命令用于设置I2C设备的某个地址的值,这里以在AT24C02的0x04地址写入0x89为例,命令如下:
root@OpenWrt:/# i2cset -y 0 0x50 0x04 0x89
3. i2cget
i2cget命令的帮助信息如下:
Usage: i2cget [-f] [-y] [-a] I2CBUS CHIP-ADDRESS [DATA-ADDRESS [MODE]]I2CBUS is an integer or an I2C bus nameADDRESS is an integer (0x03 - 0x77, or 0x00 - 0x7f if -a is given)MODE is one of:b (read byte data, default)w (read word data)c (write byte/read byte)Append p for SMBus PEC
i2cget命令用于读取I2C设备的某个地址的值,以读取AT24C02的0x04地址为例,之前用i2cset设置了0x89。
root@OpenWrt:/# i2cget -y 0 0x50 0x04
0x89
4. i2cdump
i2cdump命令的帮助信息如下:
Usage: i2cdump [-f] [-y] [-r first-last] [-a] I2CBUS ADDRESS [MODE [BANK [BANKREG]]]I2CBUS is an integer or an I2C bus nameADDRESS is an integer (0x03 - 0x77, or 0x00 - 0x7f if -a is given)MODE is one of:b (byte, default)w (word)W (word on even register addresses)s (SMBus block)i (I2C block)c (consecutive byte)Append p for SMBus PEC
i2cdump命令用于输出I2C设备的各个地址的值,在之前我在AT24C02的0x04地址上写入了0x89值,i2cdump命令输出如下:
root@OpenWrt:/# i2cdump -y 0 0x50
No size specified (using byte-data access)0 1 2 3 4 5 6 7 8 9 a b c d e f 0123456789abcdef
00: ff ff ff ff 89 ff ff ff ff ff ff ff ff ff ff ff ....?...........
10: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................
20: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ......................
可以看到通过i2cdump,0x04地址的值为0x89。
三. 总结
本文讲解了Linux下i2c-tools工具的使用方法,i2cdetect用于检测I2C总线的上有哪些I2C从设备,i2cset用于设置I2C总线上某个设备的地址的值,i2cget用于获取I2C总线上某个设备的地址的值,i2cdump用于批量输出I2C总线上某个设备的地址的值。熟悉使用这几个工具,对I2C设备的调试非常有帮助。