御风灰灰
发布于 2024-11-01 / 36 阅读
0
0

Linux-I2C工具使用

1. 工具安装

Ubuntu平台

sudo apt install i2c-tools

2. 工具介绍

i2c-tools软件包中有i2cdetecti2cdumpi2cgeti2cseti2ctransfer共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 附加到模式参数(iW 除外)以启用 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-

评论