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文章
384瀏覽量
60665 -
LINUX內核
+關注
關注
1文章
315瀏覽量
21557 -
I2C接口
+關注
關注
1文章
124瀏覽量
25020
原文標題:推薦一個好用的i2c調試小工具
文章出處:【微信號:zhuyandz,微信公眾號:FPGA之家】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論