03、使用I2C tools工具调试外设
当你拿到一块带有I2C接口的开发板,或者从硬件团队获得类似设备时,想快速测试I2C功能应该怎么做?其实有个现成的开源工具,能直接在Linux系统上帮你验证I2C设备是否正常工作,完全不用自己从头写测试代码。
这个工具被广泛用于嵌入式开发的快速验证场景。它就像一把"万能钥匙",能帮你快速检测I2C设备是否存在、读写是否正常,甚至直接读取传感器数据等基础操作。有了它,你可以省去底层驱动开发的繁琐步骤,直接通过命令行快速验证硬件功能。
1、I2C tools概述:
I2C工具是一套在Linux系统上测试I2C功能的实用工具。主要功能包括:
- 检测总线连接的探测工具
- 协助操作SMBus(I2C总线的一种扩展)的辅助程序
- 解码EEPROM存储器数据的脚本程序
- 编程操作EEPROM的专用工具
- 用于Python编程的SMBus接口模块
只要你的Linux内核已加载I2C设备驱动程序,就能在开发板上直接使用这些工具进行相关测试。
2、下载I2C tools源码:(若默认已有工具,可跳过)
关于I2C Tools的源代码,你可以通过两种方式获取:
- 直接下载:去Linux内核官网找I2C Tools的压缩包文件下载。
- 推荐方法:用Git下载 打开终端,输入这条命令:
git clone git://git.kernel.org/pub/scm/utils/i2c-tools/i2c-tools.git
这样就能把最新代码库拷贝到本地。
用Git的好处是能随时查看代码的历史更新记录,方便追踪功能改进或问题修复。作为开发者,掌握Git工具也很有必要。
3、编译I2C tools源码:(若默认已有工具,可跳过)
进入刚才利用git
下载好的i2c-tools
源码目录,修改编译工具为你当前使用的交叉编译工具:
26 CC ?= aarch64-linux-gnu-gcc
27 AR ?= aarch64-linux-gnu-ar
2
编译源码:如果你想编译静态版本,你可以输入命令:make USE_STATIC_LIB=1
;如果使用动态库的话,可以直接输入make
进行编译。
将tools文件夹里的五个文件(i2cdetect、i2cdump、i2cget、i2cset、i2ctransfer)复制到设备的/usr/sbin目录中。
如果用adb push传输时报错"只读文件系统",先运行命令
mount -o remount,rw /
将系统改为可写模式。给刚复制的五个文件添加执行权限:
chmod 777 文件名
(或用chmod +x
简化操作)。将lib文件夹里的libi2c.so.0.1.1文件复制到设备的/usr/lib目录,并重命名为libi2c.so.0。
4、i2cdetect 使用介绍
i2cdetect是一个用来查找I2C设备的工具。它能扫描指定的I2C总线,列出连接在该总线上的所有设备,并以表格形式显示结果。
使用方法: i2cdetect [选项] 总线编号 [起始地址 结束地址]
主要参数说明:
- -y:自动确认操作,无需手动确认
- -a:显示所有检测到的地址
- -q或-r:快速扫描模式(-q)或常规模式(-r)
- 总线编号:需要扫描的I2C总线号(如1代表"/dev/i2c-1")
- 起始地址/结束地址(可选):指定要扫描的地址范围,默认扫描全部地址(0x00-0x7f)
简单示例: 输入i2cdetect -y 1
即可快速扫描I2C总线1上的所有设备,结果会以表格形式展示检测到的设备地址。
- 第一,先通过
i2cdetect -l
查看当前系统中的I2C
的总线情况:
- 第二,若总线上挂载
I2C
从设备,可通过i2cdetect
扫描某个I2C
总线上的所有设备。可通过控制台输入i2cdetect -r -y 1
:(其中"--
"表示地址被探测到了,但没有芯片应答; "UU
"因为这个地址目前正在被一个驱动程序使用,探测被省略;
- 第三,查询
I2C
总线2
(I2C -2
)的功能,命令为i2cdetect -F 2
:
5、i2cget 使用介绍
i2cget命令的作用是从连接在I2C总线上的设备中读取某个寄存器的数据。它的基本用法是:
i2cget [选项] 总线号 设备地址 [寄存器地址 [模式]]
简单解释:
- 总线号:表示使用的I2C总线编号(比如i2c-1就是1)
- 设备地址:要读取的设备在总线上的地址(如0x50)
- 寄存器地址(可选):指定要读取的具体寄存器位置
- 模式(可选):定义数据读取方式(如8位或16位模式)
常用选项:
- -f:强制操作
- -y:跳过确认提示
- -a:显示完整输出
这个命令就像在总线上给特定设备发"请告诉我某个存储单元的内容"的指令,帮助用户直接获取硬件设备的内部状态信息。
下面是完成读取0总线上从地址为0x50的外设的0x10寄存器的数据,命令为:
i2cget -y -f 2 0x18 0x10
6、i2cdump 使用介绍
i2cdump
命令用于查看I2C设备的所有寄存器值。它的基本用法是:在指定的I2C总线上,读取某个设备的所有寄存器数据。
命令格式如下: i2cdump [选项] 总线号 设备地址 [模式 [寄存器 bank 参数]]
常用选项说明:
-r 起始-结束
:只读取指定寄存器范围-y
:跳过用户确认提示-a
:显示地址列-f
:强制输出原始数据
例如:i2cdump -y 1 0x50
表示在I2C总线1上读取地址0x50设备的所有寄存器值。
下面是完成读取2
总线上从地址为0x18
的数据,命令为:i2cdump -f -y 2 0x18
7、i2cset 使用介绍
i2cset命令的主要作用是通过I2C总线给设备的某个寄存器设置数值。它的基本用法是: i2cset [选项] 总线号 设备地址 寄存器地址 要设置的值 [数据格式]
具体说明:
- 总线号:系统中I2C总线的编号(比如
i2c-1
对应1
)。 - 设备地址:设备在I2C总线上的唯一地址(如
0x50
)。 - 寄存器地址:设备内部需要修改的寄存器位置。
- 要设置的值:希望写入寄存器的数值(如
0xFF
)。 - 数据格式:可选参数,指定数据类型(如
b
表示字节、w
表示字等)。
常用选项:
-f
:强制执行操作,忽略可能的错误提示。-y
:自动确认操作,避免交互式提示。-m 掩码
:结合掩码修改特定位,保留其他位不变。
简单来说,它就像用总线(总线号)找到目标设备(设备地址),定位到设备内部的某个存储位置(寄存器地址),然后写入指定数值(要设置的值)。
具体参数的含义同i2cdump
下面是完成向2
总线上从地址为0x18
的0x10
寄存器写入0x55
,然后用i2cget
读取确认。
8、i2ctransfer 使用介绍
i2ctransfer
是一个用于通过I2C总线发送自定义消息的工具。它的主要作用是:
- 一次发送多条消息:可以将多个用户定义的I2C操作(如写入或读取)组合成一个连续的传输过程。
- 自动显示读取结果:当包含读取操作时,接收到的数据会直接打印到屏幕,每条读取操作的结果单独占一行。
使用格式: i2ctransfer [选项] I2C总线号 描述符 [数据] [描述符 [数据]]
- 选项:可选参数(如
-f
、-y
等),用于控制传输细节(具体功能需参考帮助文档)。 - I2C总线号:指定操作的I2C总线编号(如
i2c-1
)。 - 描述符:定义操作类型(如
w
表示写入,r
表示读取)。 - 数据:与描述符对应的发送或接收的数据内容(如十六进制数值)。
下面是完成向2
总线上从地址为0x18
的0x10
开始的4
个寄存器写入0x01,0x02,0x03,0x04
命令为:i2ctransfer -f -y 2 w5@0x18 0x10 0x01 0x02 0x03 0x04
然后再通过命令i2ctransfer -f -y 2 w1@0x18 0x10 r4
将0x10
地址的4
个寄存器数据读出来,见下图: