当前位置: 首页 > news >正文

如何找到I2c设备的地址以及读写寄存器

以下是从 反编译 DTB 文件为 DTS 文件找到 I2C 总线地址,再到 利用 i2ctransfer 读取或写入设备寄存器 的完整流程:

1. 反编译 DTB 文件为 DTS 文件

DTB 文件是设备树的二进制形式,我们需要先将其反编译为设备树源文件(DTS 文件)来分析硬件配置信息。

步骤:
  1. 安装 dtc 工具
    在 Linux 系统上,使用如下命令安装:

    sudo apt-get install device-tree-compiler
    
  2. 反编译 dtb 文件
    使用 dtc 工具将 .dtb 文件反编译为 .dts 文件。

    dtc -I dtb -O dts -o output_file.dts input_file.dtb
    
    • input_file.dtb 是要反编译的设备树二进制文件。
    • output_file.dts 是输出的设备树源文件。
  3. 查看 dts 文件
    使用文本编辑器(如 vimnano 等)打开 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. 总结操作流程

  1. 反编译 DTB 文件

    • 使用 dtc 反编译 .dtb 文件,生成 .dts 文件。
  2. 找到 I2C 总线和设备地址

    • .dts 文件中查找与 I2C 相关的节点,确定设备的总线编号和设备地址。
  3. 使用 i2ctransfer 进行通信

    • 使用 i2ctransfer 命令读取或写入指定寄存器的值。

这套流程帮助你从设备树信息中找到 I2C 设备的相关信息,并使用 Linux 系统的 I2C 工具与设备通信。


http://www.mrgr.cn/news/48112.html

相关文章:

  • Flutter组合动画学习
  • 【初阶数据结构与算法】八大排序算法之归并排序与非比较排序(计数排序)
  • VSCode 插件开发实战(八):创建和管理任务 Task
  • 精准提升:从94.5%到99.4%——目标检测调优全纪录
  • Python 练习
  • 重温设计模式--组合模式
  • AI核身-金融场景凭证篡改检测Baseline实践
  • 1 线性系统性能分析方法1——时域分析法
  • AI-MO x Numina | 工具集成的数学推理
  • gradle build --offline idea怎么配置 打包命令使用gradle build --offline进行打包怎么操作
  • Redis的基础篇
  • makefile与gdb的使用
  • 如何挑选Axure元件库? Axure原型赏析
  • 【Java】类型转换与类型提升
  • Spring Boot 中 Bean 的机制详解
  • QInputDialog Class
  • 364_C++_通过类型定义、数组、指针、std::vector和内存复制来管理多个通道的记录数据
  • 养宠人崩溃的季节又到了,有什么吸浮毛宠物空气净化器推荐?
  • 多个pdf怎么合并成一个pdf?几个方法教你快速进行pdf合并不求人
  • V神应被提名诺贝尔经济学奖?以太坊对货币经济学的贡献无可取代?
  • Linux云计算 |【第四阶段】RDBMS2-DAY5
  • redis概述
  • MIDIPLUS 50周年丨中国国际乐器展览会首日盛况
  • 【笔记】Day1.1.24代码debug测试
  • 高可用之限流-04-fixed window 固定窗口
  • MES系统中人机接口设计和开发研究