4、i2c-tools工具
i2c-tools是嵌入式常用的I2C調試工具,主要包含4個工具,分别有i2cdetect、i2cdump、i2cget、i2cset
工具 | 作用 |
---|---|
i2cdetect | 列出I2C總線上的所有裝置 |
i2cdump | 列出指定裝置的所有寄存器值 |
i2cget | 列出指定寄存器的值 |
i2cset | 寫入指定值到裝置的寄存器 |
安裝i2c-tools工具
i2c-tools在多個平台均可使用,列舉以下平台中的安裝步驟
Ubuntu
$ sudo apt-get install i2c-tools python-smbus
Buildroot
buildroot系統menuconfig中添加以下選項
BR2_PACKAGE_I2C_TOOLS=y
Android
-
下載下傳i2c-tools源碼
下載下傳位址:https://mirrors.edge.kernel.org/pub/software/utils/i2c-tools/
- 拷貝解壓到Android源碼external目錄下
$ cp i2c-tools-3.0.0.tar.gz external/ $ cd external $ tar -zxvf i2c-tools-3.0.0.tar.gz
- 添加Android.mk編譯腳本
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE_TAGS := optional LOCAL_C_INCLUDES += $(LOCAL_PATH) $(LOCAL_PATH)/$(KERNEL_DIR)/include LOCAL_SRC_FILES := tools/i2cbusses.c tools/util.c LOCAL_MODULE := i2c-tools include $(BUILD_STATIC_LIBRARY) include $(CLEAR_VARS) LOCAL_MODULE_TAGS := optional LOCAL_SRC_FILES:=tools/i2cdetect.c LOCAL_MODULE:=i2cdetect LOCAL_CPPFLAGS += -DANDROID LOCAL_SHARED_LIBRARIES:=libc LOCAL_STATIC_LIBRARIES := i2c-tools LOCAL_C_INCLUDES += $(LOCAL_PATH) $(LOCAL_PATH)/$(KERNEL_DIR)/include include $(BUILD_EXECUTABLE) include $(CLEAR_VARS) LOCAL_MODULE_TAGS := optional LOCAL_SRC_FILES:=tools/i2cget.c LOCAL_MODULE:=i2cget LOCAL_CPPFLAGS += -DANDROID LOCAL_SHARED_LIBRARIES:=libc LOCAL_STATIC_LIBRARIES := i2c-tools LOCAL_C_INCLUDES += $(LOCAL_PATH) $(LOCAL_PATH)/$(KERNEL_DIR)/include include $(BUILD_EXECUTABLE) include $(CLEAR_VARS) LOCAL_MODULE_TAGS := optional LOCAL_SRC_FILES:=tools/i2cset.c LOCAL_MODULE:=i2cset LOCAL_CPPFLAGS += -DANDROID LOCAL_SHARED_LIBRARIES:=libc LOCAL_STATIC_LIBRARIES := i2c-tools LOCAL_C_INCLUDES += $(LOCAL_PATH) $(LOCAL_PATH)/$(KERNEL_DIR)/include include $(BUILD_EXECUTABLE) include $(CLEAR_VARS) LOCAL_MODULE_TAGS := optional LOCAL_SRC_FILES:=tools/i2cdump.c LOCAL_MODULE:=i2cdump LOCAL_CPPFLAGS += -DANDROID LOCAL_SHARED_LIBRARIES:=libc LOCAL_STATIC_LIBRARIES := i2c-tools LOCAL_C_INCLUDES += $(LOCAL_PATH) $(LOCAL_PATH)/$(KERNEL_DIR)/include include $(BUILD_EXECUTABLE)
- 編譯i2c-tools
$ source build/envsetup.sh $ lunch $ mm external/i2c-tools-3.0.0
- i2c-tools工具生成路徑
$ ls out/target/product/rk3399/system/bin/ i2cdetect i2cdump i2cget i2cset
- 拷貝生成工具到開發闆系統
$ adb push i2cdetect /system/bin/
常用示例
擷取開發闆的I2C總線數
$ i2cdetect -l
i2c-0 i2c rk3x-i2c I2C adapter
i2c-1 i2c rk3x-i2c I2C adapter
i2c-2 i2c rk3x-i2c I2C adapter
i2c-4 i2c rk3x-i2c I2C adapter
i2c-7 i2c rk3x-i2c I2C adapter
i2c-8 i2c rk3x-i2c I2C adapter
i2c-9 i2c DesignWare HDMI I2C adapter
i2c-10 i2c DP-AUX I2C adapter
目前開發闆I2C總線有8條,可确定I2C總線是否注冊成功
讀取總線上的所有裝置
$ i2cdetect -r -y 0
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: UU -- -- -- -- -- -- -- -- -- -- -- UU -- -- --
20: UU -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- 34 -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
I2C0總線上有0x10、0x20、0x1c、0x34四個裝置
UU代表目前裝置被驅動占用
34代表I2C裝置位址,并且該裝置沒有驅動程式
-y 表示同意
讀取所有寄存器值
$ i2cdump -f -y 0 0x20
0 1 2 3 4 5 6 7 8 9 a b c d e f 0123456789abcdef
00: e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 ????????????????
10: e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 ????????????????
20: e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 ????????????????
30: e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 ????????????????
40: e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 ????????????????
50: e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 ????????????????
60: e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 ????????????????
70: e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 ????????????????
80: e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 00 e8 e8 e8 b8 e8 ??????????.?????
90: e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 ????????????????
a0: e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 ????????????????
b0: e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 ????????????????
c0: e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 ????????????????
d0: e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 ????????????????
e0: e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 ????????????????
f0: e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 e8 ????????????????
-f 表示強制通路該裝置,否則會通路失敗
寫寄存器(SMBus協定)
向I2C0總線上的0x20裝置的0xff寄存器寫入0x01值
$ i2cset -f -y 0 0x20 0xff 0x01
讀寄存器(SMBus協定)
$ i2cget -f -y 0 0x20 0xff //讀取一個位元組
0x01
$ i2cget -f -y 0 0x20 0xff w //讀取兩個位元組
0x0101
讀寄存器(I2C協定)
$ i2ctransfer -f -y 0 0x20 0xff
讀寫I2C裝置
利用i2c-tools實作I2C裝置初始化、讀寫資料
// 探測I2C裝置
$ i2cdetect -r -y 8
// 初始化裝置
$ i2cset -f -y 8 0x4a 0x01 0x00
$ i2cset -f -y 8 0x4a 0x02 0x80
// 讀取資料
$ i2cget -f -y 8 0x4a 0x03 w