5,755 瀏覽數

Linux command – i2c-dev

什麼是 I²C – (Inter-Integrated Circuit,讀法為 “I-squared-C”) 是一種慢速 serial bus 的協定,主要透過兩條線路的匯流排 (串列資料(SDA)及串列時脈(SCL)) 與電腦上的控制晶片(MC : Micro Controller)做溝通.更多關於 I²C 請參考官方網站 http://www.i2c-bus.org/

測試環境為 Ubuntu14.04 x64

在 Linux 下要透過下面指令來讀取 I²C 的資料.首先先確定系統有沒有支援 I²C .

ben@ubuntu:~$ sudo su -
root@ubuntu:~# modprobe i2c-dev
root@ubuntu:~#ls /dev/i2c*
/dev/i2c-0  /dev/i2c-1

除了 i2c-dev , i2c_core 外可以能還需要額外的模組,可以參考核心檔案 /usr/src/linux-version/drivers/i2c/busses/Kconfig 內的說明.

你可以看到 I²C 有兩條 (/dev/i2c-0 與 /dev/i2c-1),現在確定無誤,接下來就需要安裝 i2c-tools (如果你在 vmware 等虛擬裝置下看,目前並沒有模擬 I²C 的裝置).

root@ubuntu:~#sudo apt-get install i2c-tools

i2c-tools 主要提供了這幾支工具

  • i2cdetect – 掃描列 I2C bus 以及 bus 上面所有的裝置
  • i2cdump – 顯示某裝置上所有 register 的值
  • i2cget – 讀取裝置某一個暫存器 register 的值
  • i2cset – 修改設某一個備暫存器 register 數值

i2cdetect

root@ubuntu:~# i2cdetect 
Error: No i2c-bus specified!
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.

透過 # i2cdetect -l 可以看到有兩條 I²C (/dev/i2c-0 與 /dev/i2c-1),但 I²C bus 上面有哪些裝置就需要另外的參數 (-y)來看

root@ubuntu:~# i2cdetect -l
i2c-0   i2c             bcm2708_i2c.0                           I2C adapter
i2c-1   i2c             bcm2708_i2c.1                           I2C adapter
root@ubuntu:~# i2cdetect -y 1
    0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: 50 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- UU -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

預設掃描範圍 從0×03到0x77.

輸出值:
“–“. 這個位置沒有裝置(chip 晶片)回應,就代表不是壞了就是本來就沒有.
“UU”. 目前有探測到裝置(chip 晶片)但被跳過,因為該地址是目前正在由驅動程序使用中.
如果回應的是兩個位元組的數值(上面的如 50)代表這個位置有裝置(chip 晶片)存在,並有回應.

查到有哪一些 I²C 裝置之後,就可以透過 #i2cdump 或是 #i2cget 的指令來查裝置暫存器的內容.#i2cset 則是可以修改暫存器的內容.
i2cdump

root@ubuntu:~# i2cdump
Usage: i2cdump [-f] [-y] [-r first-last] I2CBUS ADDRESS [MODE [BANK [BANKREG]]]
I2CBUS is an integer or an I2C bus name
ADDRESS is an integer (0x03 - 0x77)
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

i2cget

root@ubuntu:~# i2cget
Usage: i2cget [-f] [-y] I2CBUS CHIP-ADDRESS [DATA-ADDRESS [MODE]]
I2CBUS is an integer or an I2C bus name
ADDRESS is an integer (0x03 - 0x77)
MODE is one of:
  b (read byte data, default)
  w (read word data)
  c (write byte/read byte)
  Append p for SMBus PEC

i2cset

root@ubuntu:~# i2cset 
Usage: i2cset [-f] [-y] [-m MASK] I2CBUS CHIP-ADDRESS DATA-ADDRESS [VALUE] ... [MODE]
  I2CBUS is an integer or an I2C bus name
  ADDRESS is an integer (0x03 - 0x77)
  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

#i2cdump ,#i2cget 與 # i2cset 皆需要輸入這些參數值 I2CBUS ,CHIP-ADDRESS ,DATA-ADDRESS(僅 #i2cget, # i2cset 需要)

4 個網友的想法 “Linux command – i2c-dev

  1. 自動參照通知: Linux command – ipmitool – Benjr.tw

  2. 自動參照通知: PMbus – Power Management Bus – Benjr.tw

  3. 自動參照通知: PSMI – Power Supply Management Interface | Benjr.tw

  4. 自動參照通知: Temperature sensor with integrated SPD | Benjr.tw

發表迴響