• 正文
  • 相關(guān)推薦
申請入駐 產(chǎn)業(yè)圖譜

手把手教你使用 i2c-tools

2024/04/12
1.5萬
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

i2c-tools 簡介

嵌入式開發(fā)中,有時候需要確認(rèn)硬件是否正常連接,設(shè)備是否正常工作,設(shè)備的地址是多少等等,這里我們就需要使用一個用于測試 I2C 總線的工具:i2c-tools。

i2c-tools 工具是一個專門調(diào)試 i2c 的,開源,可獲取掛載的設(shè)備及設(shè)備地址,還可以讀寫 I2C 設(shè)備寄存器。

調(diào)試新的設(shè)備驅(qū)動時,難免要反復(fù)修改寄存器,然后看結(jié)果現(xiàn)象。傳統(tǒng)的做法是【修改驅(qū)動代碼寄存器值->編譯->下載->運(yùn)行->看結(jié)果】,這一過程比較費(fèi)時間,而每次需要改的可能只是 1 個 bit,這種情況下 i2c-tools 是神器。

i2c-tools 官方說明:

https://i2c.wiki.kernel.org/index.php/I2C_Tools

i2c-tools 下載網(wǎng)站:

https://mirrors.edge.kernel.org/pub/software/utils/i2c-tools/

下載后在 Ubuntu 解壓,如果想在開發(fā)板使用,就用自己板子對應(yīng)的 gcc 工具鏈編譯;如果想在 ubuntu 使用,就用 ubuntu 的默認(rèn)的 gcc 編譯即可。

編譯會生成五個工具:i2cdetect、i2cset、i2cget、i2cdump、i2ctransfer,拷貝到開發(fā)板中就可以使用;也可以直接把 i2c-tools 源碼包放到自己的源碼中,直接編譯進(jìn)固件。

i2cdetect:用于掃描 i2c 總線上的設(shè)備,并顯示地址
i2cset:設(shè)置i2c設(shè)備某個寄存器的值
i2cget:讀取i2c設(shè)備某個寄存器的值
i2cdump:讀取某個i2c設(shè)備所有寄存器的值
i2ctransfer:一次性讀寫多個字節(jié)

該工具原本是在 Linux 上使用,因?yàn)?Android 系統(tǒng)的內(nèi)核也是 Linux,故很方便的可以移植到 Android 中。

Android-i2ctools 下載:

https://github.com/skyxiaoyan1/android-i2ctool

這是某位大佬根據(jù) i2c-tools 4.1 移植的,關(guān)于 Android 下的編譯博主上次寫過 Android 系統(tǒng)編譯技巧,大概流程如下:

1、源碼包放在 /external/i2c-tools/...
2、在Android源碼根目錄輸入
    source build/envsetup.sh
    lunch rk3399_mid-userdebug(自己的工程名字)
3、在 /external/i2c-tools/ 目錄下輸入 mm 模塊編譯
4、在 Android 根目錄輸入 make snod 重新打包 system.img
5、燒寫 system.img

 

使用示例

i2cdetect:用于掃描 i2c 總線上的設(shè)備

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:關(guān)閉交互式,不會顯示警告信息
  a:掃描總線上所有設(shè)備
  q:使用SMBus的"quick write"命令進(jìn)行檢測,不建議使用
  r:使用SMBus的"receive byte"命令進(jìn)行檢測,不建議使用
  i2cbus:指定查詢某個總線編號
  first、last:掃描的地址范圍

./i2cdetect -r -y 0

 

-- 表示該地址被檢測,但是沒有芯片應(yīng)答,UU 表示該地址被當(dāng)前內(nèi)核驅(qū)動使用。

如上圖顯示,在i2c0總線上,有三個器件,設(shè)備地址分別是:0x1b、0x40、0x41

./i2cdetect -F i2cbus  查詢總線的功能

./i2cdetect -V 打印軟件版本號

 

./i2cdetect -l 檢測當(dāng)前系統(tǒng)有幾組i2c總線

i2cset:向i2c設(shè)備某個寄存器寫入值

Usage: i2cset [-f] [-y] [-m MASK] [-r] [-a] I2CBUS CHIP-ADDRESS DATA-ADDRESS [VALUE] ... [MODE]
  I2CBUS is an integer or an I2C bus name
  ADDRESS 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
    
    f:強(qiáng)制訪問
    y:指令執(zhí)行自動yes,否則會提示確認(rèn)執(zhí)行Continue? [Y/n] Y,不加參數(shù)y會有很多執(zhí)行提示,可以幫助判斷
    r:寫入后立即回讀寄存器的值,并將結(jié)果與寫入的值進(jìn)行比較
    i2cbus:總線編號
    chip-address:i2c設(shè)備地址
    data-address:i2c寄存器地址
    value 要寫入的值
    mode:指定讀取的大小,b字節(jié),w字,s是SMBus塊,i是i2c塊

設(shè)置i2c-1上0x20器件的0x77寄存器值為0x3f
./i2cset -f -y 1 0x20 0x77 0x3f

i2cget:讀取i2c設(shè)備某個寄存器的值

Usage: i2cget [-f] [-y] [-a] I2CBUS CHIP-ADDRESS [DATA-ADDRESS [MODE]]
  I2CBUS is an integer or an I2C bus name
  ADDRESS 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
    
    f:強(qiáng)制訪問
    y:關(guān)閉交互模式,不會提示警告信息
    i2cbus:總線編號
    chip-address:i2c設(shè)備地址
    data-address:i2c寄存器地址
    mode:指定讀取的大小,b字節(jié),w字,s是SMBus塊,i是i2c塊

讀取i2c-1上0x20器件的0x77寄存器值
./i2cget -f -y 1 0x20 0x77 

i2cdump:讀取某個i2c設(shè)備所有寄存器的值

Usage: i2cdump [-f] [-y] [-r first-last] [-a] I2CBUS ADDRESS [MODE [BANK [BANKREG]]]
  I2CBUS is an integer or an I2C bus name
  ADDRESS 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
    
    r:指定寄存器范圍,只能掃描從 first 到 last 區(qū)域
    f:強(qiáng)制訪問設(shè)備
    y:關(guān)閉人機(jī)交互模式
    i2cbus:總線編號
    address:指定設(shè)備地址
    mode:指定讀取的大小,b字節(jié),w字,s是SMBus塊,i是i2c塊

讀取i2c1上0x38器件的所有寄存器
./i2cdump -f -y -a 1 0x38

一般寄存器都是8位地址的,i2cdump、i2cget、i2cset 也是設(shè)置讀取8位的地址,如果一次超過8位,需要用 i2ctransfer。

i2ctransfer:一次性讀寫多個字節(jié)

Usage: i2ctransfer [-f] [-y] [-v] [-V] [-a] I2CBUS DESC [DATA] [DESC [DATA]]...
  I2CBUS is an integer or an I2C bus name
  DESC describes the transfer in the form: {r|w}LENGTH[@address]
    1) read/write-flag 2) LENGTH (range 0-65535) 3) I2C address (use last one if omitted)
  DATA are LENGTH bytes for a write message. They can be shortened by a suffix:
    = (keep value constant until LENGTH)
    + (increase value by 1 until LENGTH)
    - (decrease value by 1 until LENGTH)
    p (use pseudo random generator until LENGTH with value as seed)

查看系統(tǒng)上存在的 i2c 總線及其設(shè)備地址

ls /sys/bus/i2c/devices/

可以在這里查看實(shí)際的設(shè)備,然后對比 i2c-tools 掃描出來的對不對。

備注:

i2c-tools 是通過操作  /dev 路徑 i2c-× 設(shè)備文件完成,因此你的 kernel 必須開啟 CONFIG_I2C_CHARDEV 宏控,否者會報找不到節(jié)點(diǎn)。

相關(guān)推薦

登錄即可解鎖
  • 海量技術(shù)文章
  • 設(shè)計資源下載
  • 產(chǎn)業(yè)鏈客戶資源
  • 寫文章/發(fā)需求
立即登錄

研究生在讀,熟悉硬件、STM32單片機(jī)、嵌入式Linux。已收獲小米、聯(lián)發(fā)科、浙江大華、上能電氣、英威騰、匯川技術(shù)、格力、富士康等大廠offer。在這里分享求職經(jīng)驗(yàn)、嵌入式學(xué)習(xí)規(guī)劃、考研、嵌入式Linux技術(shù)文章等。