如何找到I2c设备的地址以及读写寄存器
以下是从 反编译 DTB 文件为 DTS 文件、找到 I2C 总线地址,再到 利用 i2ctransfer 读取或写入设备寄存器 的完整流程:
1. 反编译 DTB 文件为 DTS 文件
DTB 文件是设备树的二进制形式,我们需要先将其反编译为设备树源文件(DTS 文件)来分析硬件配置信息。
步骤:
-
安装
dtc工具:
在 Linux 系统上,使用如下命令安装:sudo apt-get install device-tree-compiler -
反编译
dtb文件:
使用dtc工具将.dtb文件反编译为.dts文件。dtc -I dtb -O dts -o output_file.dts input_file.dtbinput_file.dtb是要反编译的设备树二进制文件。output_file.dts是输出的设备树源文件。
-
查看
dts文件:
使用文本编辑器(如vim、nano等)打开output_file.dts,查找设备的 I2C 配置。vim output_file.dts
2. 找到 I2C 总线和设备地址
在 dts 文件中,查找关键字 i2c,可以定位到设备树中与 I2C 相关的配置。通常,I2C 总线的配置会包含以下信息:
- I2C 总线编号:通常在
i2c@节点下。 - 设备地址:I2C 设备的地址是十六进制表示的,通常在
reg = <...>字段中。
示例:
你可能会在 dts 文件中看到类似如下的配置:
i2c@1a000 {compatible = "i2c-designware";reg = <0x1a000>; // I2C 总线的基地址...device@1a {compatible = "some-device";reg = <0x1a>; // I2C 设备地址...};
};
在这个例子中:
i2c@1a000表示 I2C 总线的基地址(这里是总线 1)。device@1a表示 I2C 设备的地址为0x1A。
在你找到 I2C 总线并想确认设备是否连接到指定总线上时,使用 i2cdetect 工具来扫描 I2C 总线,找到所有连接在该总线上的 I2C 设备及其地址。
i2cdetect 命令格式:
i2cdetect -y -r <总线号>
-y:跳过用户确认提示,直接执行扫描。-r:使用读模式扫描设备(大多数情况下,推荐使用-r,它避免一些可能干扰设备操作的写操作)。<总线号>:I2C 总线的编号(例如总线 1 则填1)。
示例:
如果你想扫描 I2C 总线 1 上的设备,运行以下命令:
i2cdetect -y -r 1
输出结果将显示一个 7 位地址表,其中包含已连接到该 I2C 总线的所有设备地址。如果在地址 0x1A 处发现设备,说明该地址的设备是连接在该总线上的。其中UU是DTB定义的设备
3. 使用 i2ctransfer 读取或写入设备的寄存器
找到 I2C 总线和设备地址后,使用 i2ctransfer 工具与 I2C 设备通信。
读取寄存器
假设设备在 I2C 总线 1 上,设备地址为 0x1A,需要读取寄存器地址 0x10 的值,使用如下命令:
i2ctransfer -y 1 w1@0x1A 0x10 r1@0x1A
w1@0x1A 0x10:写入 1 个字节0x10(寄存器地址)到设备0x1A。r1@0x1A:从设备0x1A读取 1 个字节(寄存器中的值)。
写入寄存器
如果需要向寄存器 0x10 写入值 0xFF,使用如下命令:
i2ctransfer -y 1 w2@0x1A 0x10 0xFF
w2@0x1A 0x10 0xFF:向设备地址0x1A写入两个字节:寄存器地址0x10和数据0xFF。
4. 总结操作流程
-
反编译 DTB 文件:
- 使用
dtc反编译.dtb文件,生成.dts文件。
- 使用
-
找到 I2C 总线和设备地址:
- 在
.dts文件中查找与 I2C 相关的节点,确定设备的总线编号和设备地址。
- 在
-
使用
i2ctransfer进行通信:- 使用
i2ctransfer命令读取或写入指定寄存器的值。
- 使用
这套流程帮助你从设备树信息中找到 I2C 设备的相关信息,并使用 Linux 系统的 I2C 工具与设备通信。
