嵌入式系统 i2c-tools 工具安装与使用指南
前言
i2c-tools 是一组用于 Linux 内核的 I2C 工具。这些工具最初是 lm-sensors 项目的一部分,但最终被拆分为独立的软件包了。这些轻巧的工具,在嵌入式底层开发中是有非常实用的,它不仅支持 I2C 设备探测,而且还支持寄存器读写功能。
一、开发环境
本文将重点介绍如何在嵌入式平台移植、使用 i2c-tools 工具。开发环境准备如下:
1. 虚拟机:ubuntu22.0.4
2. 交叉编译器:arm-mix410-linux
3. 嵌入式开发平台:例如,SS524V100
二、i2c-tools 下载及交叉编译
2.1 官网下载
目前最新版本是 i2c-tools-4.3,我们选择最新的版本下载即可 。
i2c-tools 下载地址:Download
2.2 交叉编译
1. 将下载的 i2c-tools 软件包拷贝到虚拟机,并解压:
tar -zxf i2c-tools-4.3.tar.gz
2. 配置交叉编译器,修改 Makefile:
cd i2c-tools-4.3
vi Makefile
# 编译器修改为交叉编译器
------------------------------
CC := arm-mix410-linux-gcc
------------------------------
注意:如上图所示,这里有一个细节,必须改为 CC := xxx-gcc, 而不是 CC ?= xxx-gcc。否则编译时依然会使用默认的 gcc,而不是 xxx-gcc 交叉编译器。
3. 静态编译(推荐):
如果不是基于多进程开发,优先推荐静态编译,因为所有工具加起来也不过 132KB 而已。
make USE_STATIC_LIB=1
4. 动态编译(根据实际情况选择):
如果是基于多进程开发,或者有使用动态开发的需求 ,可选择动态编译。
make BUILD_DYNAMIC_LIB=1 BUILD_STATIC_LIB=0
三. i2c-tools 工具移植
1. 查看 i2c-tools-4.3/tools 目录下所生成的工具,并移植到嵌入式平台。
ls i2c-tools-4.3/tools
i2cdetect i2cdump i2cget i2cset i2ctransfer
注意:如果是动态编译,除了将 tools/ 工具移植到开发平台的 /usr/bin 以外,也不要忘了将 lib/ 目录下的动态库一起移植到 /usr/lib。
四、i2c-tools 工具使用教程
将 tools/ 工具移植到开发平台的 /usr/bin/i2c-tools 目录下(大家也可根据实际情况移植到其他目录)。
4.1 i2cdetect 工具
i2cdetect:用于扫描 i2c 总线上的设备,并显示地址。
-y | 取消交互模式。默认情况下,i2cdetect 将等待用户的确认,当使用此标志时,它将直接执行操作。 |
-a | 强行扫描非规则地址(一般不推荐)。 |
-q | 使用 SMBus “快速写入” 命令进行探测(一般不推荐)。 |
-r | 使用 SMBus “接收字节” 命令进行探测(一般不推荐)。 |
-F | 显示系统总线支持的功能列表。 |
-V | 显示 I2C 工具版本。 |
-l | 显示已经在系统中使用的 I2C 总线。 |
i2cbus | 表示要扫描的 I2C 总线的编号或名称。 |
fisrt last | 表示要扫描的从设备地址范围。 |
4.1.1 查看系统的 I2C 总线
i2cdetect -l
如上图所示,可以看到我当前的系统总共有两条 I2C 总线。
4.1.2 查看总线的 I2C 设备
如果总线挂载了 I2C 设备,可通过 i2cdetect 扫描每一条总线的所有设备。例如,查看总线 0 (i2c-0) 上的所有从设备。
i2cdetect -y -r 0
以上参数的含义如下:
1. "
--
" 表示地址被检测到了,但是没有芯片2. "
UU
" 表示地址正在被某一个驱动使用(嵌入式平台阉割了这个参数)3. "
44
" 表示16进制的地址为 0x44
4.1.3 查询总线支持的功能
查询总线 0 (i2c-0) 的功能,命令如下:
i2cdetect -F 0
4.2 i2cget 工具
获取某一个总线上某一个从设备的寄存器值。
例如:获取 0 总线从设备 0x44 寄存器 0xfe 的值
i2cget -f -y 0 0x44 0xfe
-f: 强制访问设备
-y: 取消交互模式。默认情况下,i2cget 将等待用户的确认,当使用此标志时,它将直接执行操作。
4.3 i2cset 工具
设置某一个总线上某一个从设备的寄存器的值。
例如:设置 0 总线从设备 0x44 寄存器 0x40 的值为 0x00
i2cset -f -y 0 0x44 0x40 0x00
设置 i2c-0 上从地址为 0x44 的外设 0x40 寄存器的值为 0x00
4.4 i2cdump 工具
查看某一个总线上某一个从设备所有寄存器的值(寄存器地址为8位
)。
例如:查看 i2c-0 上 0x44 外设所有寄存器的值
i2cdump -f -y 0 0x44
4.5 i2ctransfer 工具
向寄存器地址为 16 位的从设备读取或者写入数据。
1. 读取寄存器数据
i2ctransfer -f -y 0 w2@0x44 0x40 0x40 r32
-f: 强制访问设备
-y: 取消交互模式0:哪条总线
w2: 写两个字节地址
0x40 0x40: 寄存器地址
r32: 往后32个寄存器所对应的寄存器值
2. 向寄存器写入数据
i2ctransfer -f -y 0 w2@0x44 0x40 0x10
-f: 强制访问设备
-y: 取消交互模式0:哪条总线
w2: 写两个字节地址
0x40: 寄存器地址
0x10: 0x40 寄存器地址往后的寄存器写入 0x10
作者:积步千里