i2c-tools简介
在嵌入式开发仲,有时候需要确认硬件是否正常连接,设备是否正常工作,设备的地址是多少等等,这里我们就需要使用一个用于测试I2C总线的工具——i2c-tools。
i2c-tools工具是一个专门调试i2c的,开源,可获取挂载的设备及设备地址,还可以读写I2C设备寄存器。
下面我们就对这个工具的安装和使用做个简单介绍。
i2c-tools安装
解压
tar-zxvfi2c-tools-4.3.tar.gz cdi2c-tools-4.3
编译
使用以下命令进行编译
makeCC=arm-linux-gnueabihf-gccUSE_STATIC_LIB=1
USE_STATIC_LIB 的意思是使用静态编译。编译完成后,会在tools目录下产生i2cdetect,i2cdump,i2cget,i2cset,i2ctransfer五个产物。将这些可执行文件拷贝到设备上。
不加 USE_STATIC_LIB 编译选项,会使用动态链接的方式编译。编译完成后需要拷贝i2c-tools-4.3/lib 目录下的libi2c.so.0动态库到设备上的/usr/bin 目录下。
i2c-tools使用方法
i2cdetect
i2cdetect用來列举I2C bus和上面所有的设备,可接受的参数有
Usage:i2cdetect[-y][-a][-q|-r]I2CBUS[FIRSTLAST] i2cdetect-FI2CBUS i2cdetect-l I2CBUSisanintegeroranI2Cbusname Ifprovided,FIRSTandLASTlimittheprobingrange.
-V:输出当前版本号
debian@npi:/mnt/mnt$./i2cdetect-V i2cdetectversion4.3
-l:输出所有 i2c 总线,如下总线编号有twi1和twi2,或者1和2
debian@npi:/mnt/mnt$./i2cdetect-l i2c-0unknown21a0000.i2cN/A i2c-1unknown21a4000.i2cN/A debian@npi:/mnt/mnt$ls-l/dev/i2c-* crw-------1rootroot89,0Mar1909:42/dev/i2c-0 crw-------1rootroot89,1Mar1909:42/dev/i2c-1
I2CBUS:i2c总线编号-F:此 i2c 支持的功能
root@npi:/mnt/mnt#./i2cdetect-F1 Functionalitiesimplementedby/dev/i2c-1: I2Cyes SMBusQuickCommandyes SMBusSendByteyes SMBusReceiveByteyes SMBusWriteByteyes SMBusReadByteyes SMBusWriteWordyes SMBusReadWordyes SMBusProcessCallyes SMBusBlockWriteyes SMBusBlockReadyes SMBusBlockProcessCallno SMBusPECyes I2CBlockWriteyes I2CBlockReadyes root@npi:/mnt/mnt#
-y:指令执行自动yes,否则会提示确认执行Continue? [Y/n] Y,不加参数y会有很多执行提示,可以帮助判断
-a:输出总线上所有地址(00-7f),没有 -a,只显示 08-77,UU 表示该设备在驱动中已使用。
如下0x1a,0x39的地址正在被使用。
root@npi:/mnt/mnt#./i2cdetect-a1 WARNING!ThisprogramcanconfuseyourI2Cbus,causedatalossandworse! Iwillprobefile/dev/i2c-1. Iwillprobeaddressrange0x00-0x7f. Continue?[Y/n]y 0123456789abcdef 00:00------------------------------ 10:--------------------UU---------- 20:-------------------------------- 30:------------------UU------------ 40:-------------------------------- 50:-------------------------------- 60:60------------------------------ 70:-------------------------------- root@npi:/mnt/mnt#./i2cdetect-y-a1 0123456789abcdef 00:00------------------------------ 10:--------------------UU---------- 20:-------------------------------- 30:------------------UU------------ 40:-------------------------------- 50:-------------------------------- 60:60------------------------------ 70:-------------------------------- root@npi:/mnt/mnt#
i2cdump
i2cdump读取设备上所有寄存器的值,可接受的参数有
Usage:i2cdump[-f][-y][-rfirst-last][-a]I2CBUSADDRESS[MODE[BANK[BANKREG]]] I2CBUSisanintegeroranI2Cbusname ADDRESSisaninteger(0x03-0x77,or0x00-0x7fif-aisgiven) MODEisoneof: b(byte,default) w(word) W(wordonevenregisteraddresses) s(SMBusblock) i(I2Cblock) c(consecutivebyte) AppendpforSMBusPEC
-V:输出当前版本号
-f:强制使用此设备地址,即使此设备地址已经被使用;若不添加此参数,地址可能写失败
-y:指令执行自动 yes,否则会提示确认执行Continue? [Y/n] Y,不加参数y会有很多执行提示,可以帮助判断
-r:读取从 first-last 之间的寄存器值
-a:读取0x00-0xff范围的地址
I2CBUS:i2c总线编号
ADDRESS:设备地址,建议使用十六进制
MODE:数据长度类型
root@npi:/mnt/mnt#./i2cdump-f-y-a10x39 Nosizespecified(usingbyte-dataaccess) 0123456789abcdef0123456789abcdef 00:00000000000000007000000000000000........p....... 10:0000000000000000000010b002030200..........?????. 20:9500000000004000000000fbffddc400?.....@....?.??. 30:0000000000009022a000000001100000......?"?...??.. 40:00000000000000000000000000000000................ 50:00000000000000000000000000000000................ 60:04030000000000000000000000000000??.............. 70:00000000000000000000000000030000.............?.. 80:00000000000000000000000000000000................ 90:00000000000000000000000000000000................ a0:00000000000000000000000000000000................ b0:00000000000000000077147601000100.........w?v?.?. c0:00000000000000000000000000000000................ d0:00000000000000000000000000000000................ e0:00000000000000000000000000000000................ f0:00000000000000000000000000000000................ #只读取0x50-0x7f寄存器范围的值 root@npi:/mnt/mnt#./i2cdump-f-y-r0x50-0x7f10x39 Nosizespecified(usingbyte-dataaccess) 0123456789abcdef0123456789abcdef 50:00000000000000000000000000000000................ 60:04030000000000000000000000000000??.............. 70:00000000000000000000000000030000.............?.. root@npi:/mnt/mnt#
通过读取i2c设备寄存器的值与芯片手册的值进行比对,确认我们配置的是否正确。
i2cget
i2cget读取设备上寄存器的值,可接受的参数有
Usage:i2cget[-f][-y][-a]I2CBUSCHIP-ADDRESS[DATA-ADDRESS[MODE]] I2CBUSisanintegeroranI2Cbusname ADDRESSisaninteger(0x03-0x77,or0x00-0x7fif-aisgiven) MODEisoneof: b(readbytedata,default) w(readworddata) c(writebyte/readbyte) AppendpforSMBusPEC
I2CBUS:i2c总线编号
CHIP-ADDRESS:设备地址
DATA-ADDRESS:要读取的寄存器地址
MODE:数据长度类型
#0x39设备地址,0x04要读取的寄存器 root@npi:/mnt/mnt#./i2cget-f-y10x390x04 0x03
i2cset
i2cset设置设备上寄存器的值,可接受的参数有
Usage:i2cset[-f][-y][-mMASK][-r][-a]I2CBUSCHIP-ADDRESSDATA-ADDRESS[VALUE]...[MODE] I2CBUSisanintegeroranI2Cbusname ADDRESSisaninteger(0x03-0x77,or0x00-0x7fif-aisgiven) MODEisoneof: c(byte,novalue) b(bytedata,default) w(worddata) i(I2Cblockdata) s(SMBusblockdata) AppendpforSMBusPEC
I2CBUS:i2c总线编号
CHIP-ADDRESS:设备地址
DATA-ADDRESS:要写入的寄存器地址
VALUE:要写入的值
MODE:数据长度类型
root@npi:/mnt/mnt#./i2cset-f-m0xff-r10x390x040x03 WARNING!ThisprogramcanconfuseyourI2Cbus,causedatalossandworse! Iwillwritetodevicefile/dev/i2c-1,chipaddress0x39, dataaddress0x04,data0x03(masked),modebyte. Continue?[Y/n]y Oldvalue0x00,writemask0xff,willwrite0x03 Continue?[Y/n]y Value0x03written,readbackmatched root@npi:/mnt/mnt#
把写入寄存器的值读出来。确认与我们写入的值相同。
root@npi:/mnt/mnt#./i2cdump-f-y-r0x00-0x0f10x39 Nosizespecified(usingbyte-dataaccess) 0123456789abcdef0123456789abcdef 00:00000000030000007000000000000000....?...p....... root@npi:/mnt/mnt#
i2ctransfer
i2ctransfer通过一次传输发送用户定义的I2C消息,用于创建I2C消息并将其作为一次传输合并发送。
Usage:i2ctransfer[-f][-y][-v][-V][-a]I2CBUSDESC[DATA][DESC[DATA]]... I2CBUSisanintegeroranI2Cbusname DESCdescribesthetransferintheform:{r|w}LENGTH[@address] 1)read/write-flag2)LENGTH(range0-65535)3)I2Caddress(uselastoneifomitted) DATAareLENGTHbytesforawritemessage.Theycanbeshortenedbyasuffix: =(keepvalueconstantuntilLENGTH) +(increasevalueby1untilLENGTH) -(decreasevalueby1untilLENGTH) p(usepseudorandomgeneratoruntilLENGTHwithvalueasseed) Example(bus0,read8byteatoffset0x64fromEEPROMat0x50): #i2ctransfer0w1@0x500x64r8 Example(sameEEPROM,atoffset0x42write0xff0xfe...0xf0): #i2ctransfer0w17@0x500x420xff-
I2CBUS:i2c总线编号
DESC:{r | w}<消息长度>[@设备地址]
{r | w}指定消息是读还是写
<消息长度>指定在此消息中读取或写入的字节数。它被解析为一个无符号的16位整数
[@设备地址]指定此消息要访问的芯片的7位地址,并且是整数。
#参数2为i2c2,w2表示写两个字节,@0x39为i2c设备(注意要7位地址),0x02 0xd3 为高低位地址,r1为读取的数据是一个byte。 root@npi:/mnt/mnt#./i2ctransfer-f-y1w2@0x600x020xd3r1 0x00
总结
本文只是抛砖引玉,i2c-tools还有更多的使用方法,需要大家在实际工作中去探索。
审核编辑:刘清
-
I2C总线
+关注
关注
8文章
390浏览量
60916 -
LINUX内核
+关注
关注
1文章
316浏览量
21644 -
I2C接口
+关注
关注
1文章
125浏览量
25190
原文标题:推荐一个好用的i2c调试小工具
文章出处:【微信号:zhuyandz,微信公众号:FPGA之家】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论