什麼是 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:~# 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 需要)
- I2CBUS – bus address
這個好理解就是一個系統的 I²C 有好幾條,需要指定該裝置存在的 Bus ,如果系統設計成備援模式那該裝置可能會出現在不同 Bus 上. - CHIP-ADDRESS – slave address
這個就有點複雜,slave address 需要作轉換,請參考 7-bit-8-bit-and-10-bit-I2C-Slave-Addressing – https://www.totalphase.com/support/articles/200349176-7-bit-8-bit-and-10-bit-I2C-Slave-Addressing . - DATA-ADDRESS – slave address
讀取到的資料通常是 Raw data 需要作轉換,不同的裝置有不同的轉換方式,如 Temperature sensor with integrated SPD – https://benjr.tw/93901, Power Supply Management Interface – https://benjr.tw/93924
4 thoughts on “Linux command – i2c-dev”