嵌入式系统 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  

作者:积步千里

物联沃分享整理
物联沃-IOTWORD物联网 » 嵌入式系统 i2c-tools 工具安装与使用指南

发表回复