1. 工具安装
Ubuntu平台
sudo apt install i2c-tools
2. 工具介绍
i2c-tools软件包中有i2cdetect,i2cdump,i2cget,i2cset,i2ctransfer共5个工具。
2.1 i2cdetect
2.1.1 语法
i2cdetect [-y] [-a] [-q|-r] I2CBUS [first last]
i2cdetect -F I2CBUS
i2cdetect -V
i2cdetect -l
2.1.2 选项
-y
:关闭交互模式-a
:强制扫描非常规地址(不推荐)-q
:使用 SMBus 的 "quick write" 命令进行探测(不推荐)-r
:使用 SMBus 的 "receive byte" 命令进行探测(不推荐)-F
:显示适配器实现的功能列表并退出-V
:显示版本信息并退出-l
:输出已安装 I2C 总线的列表
2.1.3 常用方法
2.1.3.1 查看总线
i2cdetect -l
2.1.3.2 扫描指定总线
# 0为设备索引,通过上述命令查询。
i2cdetect -y -r -a 0
2.1.3.3 查看总线功能
i2cdetect -F 0
2.2 i2cdump
i2cdump命令用于在 Linux 系统用户空间读取连接到系统的 I2C 设备的数据,并以可读的格式显示 I2C 设备的寄存器内容。I2C(Inter-Integrated Circuit)是一种串行通信协议,常用于连接各种外设和传感器。i2cdump
命令支持对不同类型的 I2C 设备进行读取。
2.2.1 语法
i2cdump [-f] [-r first-last] [-y] [-a] I2CBUS ADDRESS [MODE [BANK [BANKREG]]]
i2cdump -V
2.2.2 选项
-f
:即使设备繁忙,也强制访问该设备。默认情况下,i2cdump 将拒绝访问已在内核驱动程序控制下的设备。注意,使用此标志是危险的,因为它可能会严重混淆相关的内核驱动程序,还可能导致 i2cdump 返回无效结果。因此,只有在你知道自己在做什么的情况下才可以使用,风险自负。-r first-last
:限制正在访问的寄存器的范围。此选项仅适用于模式 b、w、c 和 W。对于模式 W,第一个必须是偶数,最后一个必须是奇数。-y
:禁用交互模式。默认情况下,i2cdump 将等待用户的确认,然后再访问 I2C 总线。当使用该标志时,将直接执行操作,这主要是为了在脚本中使用。-a
:允许使用 0x00 - 0x02 和 0x78 - 0x7f 之间的地址。一般不建议使用。-V
:显示版本信息并退出。
2.2.3 参数
I2CBUS
:I2C 总线数字序号,对应于i2cdetect -l
扫描的序号。ADDRESS
:是一个整数,范围 0x03 - 0x77,或 0x00 - 0x7f(如果使用-a
选项)。MODE
:模式支持以下任意一种:b
(byte,默认)w
(word)W
(word on even register addresses)s
(SMBus block)i
(I2C block)c
(consecutive byte)
另外,还可以将 p
附加到模式参数(i
和 W
除外)以启用 PEC。如果省略 MODE
参数,i2cdump 默认使用不带 PEC 的字节访问。
2.2.4 用法
2.2.4.1 导出所有寄存器
将I2C总线9上的0x50设备的全部内容导出
i2cdump -y 9 0x50
2.2.4.2 导出部分寄存器
将I2C总线9上的0x50设备的0x00至0x3f的寄存器导出来
i2cdump -y -r 0x00-0x3f 9 0x50
2.3 i2cget
I2C(Inter-Integrated Circuit)是一种串行通信协议,常用于连接各种外设和传感器。i2cget
允许用户以不同的格式从指定的 I2C 设备和寄存器地址中读取数据,支持读取不同类型的数据,如字节、字、块等;并提供不同的输出格式,包括字节、字和其他格式。
2.3.1 语法
i2cget [-f] [-y] [-a] i2cbus chip-address [data-address [mode]]
i2cget -V
2.3.2 选项
-f
:即使设备繁忙,也强制访问该设备。注意这是危险操作,只有在你知道自己在做什么的情况下才可以使用,风险自负。-y
:关闭交互模式。-a
:允许使用非常规地址(0x00 - 0x02 和 0x78 - 0x7f 之间的地址),一般不建议使用。-V
:显示版本信息并退出。
2.3.3 参数
i2cbus
:I2C 总线数字序号,对应于i2cdetect -l
扫描的序号。chip-address
:指定 I2C 设备的地址,默认是 0x08 到 0x77 之间的整数。data-address
:指定要读取的设备上的寄存器地址,是 0x00 到 0xFF 之间的整数。如果省略,则将读取当前活动的寄存器(如果所用芯片支持)。mode
:模式支持以下任意一种:b
(byte,默认)w
(word)c
(consecutive byte)
2.3.4 用法
2.3.4.1 获取单字节的寄存器值
获取I2C0总线上0x20设备的0x11寄存器值
i2cget 0 0x20 0x11
2.3.4.2 获取16位寄存器的值
获取I2C0总线上0x20设备的0x11寄存器值,寄存器值为16位
i2cget 0 0x20 0x11 w
2.4 i2cset
i2cset 是 Linux 系统中的一个命令行工具,用于向 I2C 设备写入数据。
I2C(Inter-Integrated Circuit)是一种串行通信协议,常用于连接各种外设和传感器。i2cset
允许用户以不同的格式向指定的 I2C 设备和寄存器地址中写入数据,支持多种输入格式,包括字节、字和其他格式。
2.4.1 语法
i2cset [-f] [-y] [-m mask] [-r] [-a] i2cbus chip-address data-address [value] ... [mode]
i2cset -V
2.4.2 选项
-f
:即使设备繁忙,也强制访问该设备。注意这是危险操作,只有在你知道自己在做什么的情况下才可以使用,风险自负。-y
:关闭交互模式。-m mask
:掩码参数 mask(如果指定)描述了哪些位值将实际写入数据地址。掩码中设置为 1 的位是从值中获取的,而设置为 0 的位将从数据地址中读取,从而由操作保留。-r
:写入后立即读回,并将结果与写入的值进行比较。这曾经是默认行为。-a
:允许使用非常规地址(0x00 - 0x02 和 0x78 - 0x7f 之间的地址),一般不建议使用。-V
:显示版本信息并退出。
2.4.3 参数
i2cbus
:I2C 总线数字序号,对应于i2cdetect -l
扫描的序号。chip-address
:指定 I2C 设备的地址,默认是 0x08 到 0x77 之间的整数。data-address
:指定要读取的设备上的寄存器地址,是 0x00 到 0xFF 之间的整数。如果省略,则将读取当前活动的寄存器(如果所用芯片支持)。value
: 要写入芯片上该位置的值。如果省略此参数,则发出短写入(short write)。mode
:模式支持以下任意一种:b
(byte,默认)w
(word)c
(consecutive byte)
2.4.4 用法
2.4.4.1 单字节写入
将值 0x42 写入总线 1(i2c-1)上地址为 0x2d 的 I2C 设备的 8 位寄存器 0x11 中(需要用户确认):
i2cset 1 0x2d 0x11 0x42
2.4.4.2 清除指定位
立即清除总线 1(i2c-1)上地址为 0x2d 的 I2C 设备的 8 位寄存器 0x11 的 3 个最低有效位
i2cset -y -m 0x07 1 0x2d 0x11 0x00
2.4.4.3 16位寄存器值写入
将值 0x5000 写入总线 1(i2c-1)上地址为 0x48 的 I2C 设备的 16 位寄存器 0x02 中
i2cset -y 1 0x48 0x02 0x5000 w
2.5 i2ctransfer
i2ctransfer 是 Linux 系统中的一个命令行工具,用于创建 I2C 消息并将它们作为一次传输合并发送到 I2C 总线。同时,i2ctransfer
也可以用于读取消息,将接收到的缓冲区的内容将打印到标准输出,每条读取消息打印一行。
2.5.1 语法
i2ctransfer [-f] [-y] [-v] [-a] i2cbus desc [data] [desc [data]] ...
i2ctransfer -V
2.5.2 选项
-f
:即使设备繁忙,也强制访问该设备。注意这是危险操作,只有在你知道自己在做什么的情况下才可以使用,风险自负。-y
:关闭交互模式。-v
:开启详细输出模式。-a
:允许使用非常规地址(0x00 - 0x02 和 0x78 - 0x7f 之间的地址),一般不建议使用。-V
:显示版本信息并退出。
2.5.3 参数
- i2cbus:I2C 总线数字序号,对应于 i2cdetect -l 扫描的序号。
- desc:一个或多个 desc 块,用于描述读写属性、消息大小以及设备地址等信息。块的数量受到 Linux 内核的限制,并由 I2C_RDWR_IOCTL_MAX_MSGS 定义(从内核 v4.10 开始为 42)。
desc 块的组成如下:
{r|w}[@address]
- data:要传输的数据。
2.5.4 用法
2.5.4.1 写寄存器值到指定地址
在I2C0总线上向设备地址0x50写入2个寄存器值
i2ctransfer 0 w2@0x50 64 0x20
2.5.4.2 从指定地址读取寄存器
在I2C0总线上向设备地址0x50写入1个寄存器值,并读取8个字节数据
i2ctransfer 0 w1@0x50 0x64 r8
2.5.4.3 特殊用法
对于同一个 EEPROM,在偏移量 0x42 处写入 0xff 0xfe ... 0xf0(一条写入消息;第一个字节将内存指针设置为 0x42,0xff 是第一个数据字节,所有后续数据字节减一):
i2ctransfer 0 w17@0x50 0x42 0xff-