提示:Linux 驱动-i2c工具篇
文章目录
- 前言
- 一、资料参考
- 二、开发工具下载-安装
- 下载方式
- 安装
- 安装-使用思路
- 下载对应版本-准备安装包
- 二、工具使用
- i2cdetect
- 基础原理
- (1) i2cdetect -V: 输出版本信息
- (2) i2cdetect -l: 列出所有的 I2C 总线
- (3) i2cdetect -F 查询总线上设备支持的功能集
- (4) i2cdetect -a 扫描总线上 0x00 到 0xFF 范围内的所有 I2C 设备地址
- (5) 常用核心参数清单
- i2cdump
- 底层原理
- (1) i2cdump -V 查看版本号
- (2) 读取设备寄存器
- (3) 指定寄存器范围读取
- (4) FT5x06 调试标准命令组合
- i2cset
- i2cget
- i2ctransfer
- 写操作
- 读操作
- 总结
前言
i2c 有调试开发工具,利用工具来调试、验证各种问题还是特别有必要的,提高开发效率,查找各种问题。
一、资料参考
RK3568驱动指南|第十五篇 I2C-第180章 I2C Tools工具讲解
可以看看讯为电子提供的开发指导篇,i2c 开发工具的安装、使用。
二、开发工具下载-安装
下载方式
I2C Tools
这里有两种方式,直接下载包和git clone 工具源码的方式进行下载,如下:
如下,我们会用第一种方式,下载对应的版本然后再解压并安装。
安装
安装-使用思路
- 无论哪种方式得到对应版本的开发工具源码或者压缩包
- 在Linux 系统中进行解压缩
- 进入工具包会看到
Makefile文件,对工具进行编译生成工具包 - 把工具包push 到开发板,工具就可以使用了
- 对于部分开发板,比如讯为开发板,工具本身在系统里面不需要额外的去编译的,但是实际开发中还是需要push 工具到开发板进行开发的
下载对应版本-准备安装包
比如我们下载的是
push 到linux 系统里面并解压:tar -vxf i2c-tools-4.3.tar.xz
进入到工具目录,并编译工具源码,命令:make -B CC=/home/topeet/wfc/RK3568Linux/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc AR=/home/topeet/wfc/RK3568Linux/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-ar USE_STATIC_LIB=1
注意点,一定要搞清楚自己的预编译工具位置,用全路径。
进入工具的tools目录,就看到编译后生成的工具了。
二、工具使用
i2cdetect
基础原理
i2cdetect作用:扫描一条 I2C 总线上所有 7 位从机地址,探测哪些 I2C 设备存在。
底层通过发送 I2C 消息,尝试与每个地址握手;收到应答(ACK)代表设备在线。
(1) i2cdetect -V: 输出版本信息
(2) i2cdetect -l: 列出所有的 I2C 总线
(3) i2cdetect -F 查询总线上设备支持的功能集
(4) i2cdetect -a 扫描总线上 0x00 到 0xFF 范围内的所有 I2C 设备地址
这里的 0x38 就是 FT5X06 触摸芯片的 I2C 设备地址。
0x38 就是 FT5x06 触控芯片 7 位 I2C 从地址,硬件通信正常,如果无应答表示i2c 外设根本没有挂载上来。
(5) 常用核心参数清单
| 参数 | 作用 |
|---|---|
| -y | 跳过交互式确认,自动执行(开发板必加)不加 -y 会等待你输入 YES 确认,脚本 / 调试直接卡死 |
| -a | 扫描全部 0~127 地址;默认会跳过一部分 I2C 保留地址 |
| -r | 使用 read 方式探测(默认 write 探测),部分特殊芯片才需要 |
| -q | 使用简易 quick-write 探测(不推荐,兼容性差) |
| -V | 打印工具版本 |
| -h | 帮助信息 |
i2cdump
i2cdump 可以读取设备上所有寄存器的值
底层原理
持续发起寄存器读操作,依赖芯片支持随机地址读 / 自动地址自增。
绝大多数触控 IC、传感器支持;少数外设不支持连续读,会读出乱码。
(1) i2cdump -V 查看版本号
(2) 读取设备寄存器
读取设备寄存器:使用 i2cdump -f -a 1 0x38 命令可以读取 I2C 设备地址为 0x38 的所有寄存
器值(从 0x00 到 0xFF)。 -f 选项用于强制使用设备地址,而 -a 选项则是用于读取整个地址范围。
(3) 指定寄存器范围读取
指定寄存器范围读取, 使用 i2cdump -f -r 0x80-0xff 1 0x38 命令可以只读取 I2C 设备地址为
0x38 的 0x80 到 0xff 范围内的寄存器值。 -r 选项用于指定要读取的寄存器地址范围
(4) FT5x06 调试标准命令组合
#1.扫描确认设备在线 i2cdetect-y1#2.批量查看0~0x40寄存器(触摸状态、坐标区域) i2cdump-y-r0x00-0x4010x38#3.单独读取触摸状态寄存器 i2cget-y10x380x02i2cset
向 I2C 从设备寄存器写入数据。
支持单字节写入、多字节连续写入、16 位字写入。
底层时序:START → 从机地址 (写) → 寄存器地址 → [数据] → STOP。
和你驱动内i2c_transfer写操作时序完全一致。
i2cset 命令用于向 I2C 设备的特定寄存器写入数据。 它的用法如下:i2cset -f -r 1 0x38 0x80 0x11,意思如下:
( 1) 强制使用 I2C 总线 1 上的设备地址 0x38
( 2) 向该设备的寄存器地址 0x80 写入值 0x11
写入完成后,该命令会返回一个确认信息,表示写入是否成功
i2cget
读取 I2C 设备指定寄存器的数据,标准时序:START → 发送从机写地址 + 寄存器地址 → 重复起始RESTART → 发送从机读地址 → 读取数据 → STOP
时序和你驱动内2个i2c_msg(先写寄存器地址、再读数据)逻辑完全一致,最适合寄存器型 I2C 芯片(FT5x06、传感器)。
命令语法
i2cget[选项]BUS从机地址[寄存器地址][数据模式]命令i2cget -f 1 0x38 0x80
这条命令的意思是:
( 1) 强制使用 I2C 总线 1 上的设备地址 0x38
( 2) 从该设备的寄存器地址 0x80 读取数据
该命令会返回寄存器 0x80 的值。 读取成功后,会显示类似 0x11 的十六进制值。 如果读取
失败,则会返回一个错误信息
i2ctransfer
i2ctransfer 是一个更加强大和灵活的 I2C 操作工具,与之前介绍的 i2cset 和 i2cget 命令相比,它可以在单个命令中完成读写操作。
写操作
命令:i2ctransfer 1 w2@0x38 0x80 0x22
( 1) 1 表示操作的 I2C 总线编号为 1
( 2) w2 表示写入 2 个字节的数据
( 3) @0x38 表示设备地址为 0x38
( 4) 0x80 表示要写入的寄存器地址为 0x80
( 5) 0x22 表示要写入寄存器的值为 0x22
读操作
命令:i2ctransfer 1 w1@0x38 0x80 r1
( 1) 1 表示操作的 I2C 总线编号为 1
( 2) w1 表示写入 1 个字节的数据
( 3) @0x38 表示设备地址为 0x38
( 4) 0x80 表示要写入的寄存器地址为 0x80
( 5) r1 表示读取 1 个字节的数据
总结
- 这里介绍了i2c 工具的几个命令
- 这些命令在调试阶段特别重要