Skip to main content
与连接到 Lager Box 的设备进行 I2C(集成电路间总线)数据传输。 I2C 是一种同步串行协议,使用两根线:SDA(数据)和 SCL(时钟)。

语法

参数

选项

不带子命令调用时,列出 Box 上的 I2C Net(或显示指定 Net 的配置)。

子命令

config

配置 I2C 总线参数。这些设置会在后续命令中保持有效。
示例:

scan

扫描 I2C 总线上连接的设备。它逐个探测地址,并报告回应 ACK 的那些地址。
默认范围 0x08-0x77 排除了 I2C 的保留地址。 示例:

read

从 I2C 设备读取字节。
示例:

write

向 I2C 设备写入字节。
数据可以作为 DATA 参数提供,也可以通过 --data-file 提供,但不能同时使用两者。 示例:

transfer

在一次 I2C 事务中先写后读,中间使用重复起始条件。这是读取寄存器的标准做法:先写入寄存器地址,然后在不释放总线的情况下读取寄存器值。
示例:

十六进制数据格式

数据参数接受多种十六进制写法: 所有数值都必须在字节范围内(0x00-0xFF)。

地址格式

I2C 地址是 7 位值(0x00-0x7F)。您可以用十六进制或十进制指定地址:

频率格式

时钟频率接受数值,并可带可选后缀:

受支持的硬件

LabJack T7 把请求的频率映射到一个时钟分频档位,最高约 450 kHz。如果 T7 固件拒绝计算出的档位,驱动程序会以最高速率运行并打印警告。

LabJack U3

U3 通过它自己的固件命令而不是 LJM 来运行 I2C。在 U3 上使用 I2C 需要 U3 硬件版本 1.21 或更高。U3 只能作为总线主机。 引脚: 默认通道 FIO6-FIO7 把 SDA 分配给 FIO6,SCL 分配给 FIO7。若要使用其他引脚,请用 lager nets add 配合 --sda--scl 选项创建 Net。 FIO0-FIO3 不能承载 I2C。EIO 和 CIO 线位于 U3 的 DB15 连接器上。 上拉: U3 没有上拉电阻。请从 SDA 和 SCL 各接一个外部电阻到 VS。 LabJack 建议 4.7 kΩ。没有上拉时,每个地址都会返回 NAK,scan 返回空列表。 --pull-ups 对 U3 不起作用,config 会打印 pull_ups=n/a (external resistors required) 限制:
  • 一次传输最多写 50 字节、读 52 字节。
  • 时钟约在 10 kHz 至 150 kHz 之间运行,并且 Box 绝不会超过您请求的速率。超出该范围的请求会被钳位。
  • config 打印硬件实际使用的速率,两者不同时会在括号中给出请求值:
CLI 不会为被钳位的时钟给出警告,因此请阅读 config 输出中的速率。 错误: U3 会检查地址的应答,以及它写入的每个字节的应答。错误信息会指出设备拒绝的第一个字节:
写入 31 字节或更多时,只会报告有字节被拒绝,不会指出是哪一个字节。

Net 配置

I2C Net 配置在 Box 的 saved_nets.json 中。Net 记录示例:
Aardvark 适配器:

输出格式


示例


故障排除

扫描不到任何设备

  • 检查 SDA 和 SCL 的接线
  • 确认已接上拉电阻(100kHz 时典型值为 4.7k)
  • Aardvark:可以尝试 --pull-ups on 启用内部上拉
  • LabJack U3:请加装外部上拉电阻。U3 本身没有,没有它们扫描不到任何设备
  • 确认设备的供电已连接

总线错误

  • LabJack T7:连接之后的第一次事务可能返回总线错误。这是正常的,驱动程序会自动处理
  • 可以尝试用 --frequency 100k 降低频率
  • 检查是否存在总线争用(多个主机)

NACK 错误

  • 核对设备地址(有些数据手册给出的是左移后的 8 位地址)
  • 确认设备已通电且不处于复位状态
  • 检查是否与总线上的其他设备存在地址冲突

说明

  • 默认 I2C Net 可以用 lager defaults add --i2c-net NETNAME 设置
  • LabJack T7 约在 130 Hz 至 450 kHz 之间运行,LabJack U3 约在 10 kHz 至 150 kHz 之间运行
  • config 会打印 LabJack U3 实际使用的时钟速率,它可能与请求值不同
  • Aardvark 适配器支持内部上拉,可以通过 config --pull-ups 切换
  • transfer 命令使用 I2C 重复起始条件,实现原子的先写后读操作

参见

  • SPI — SPI 总线通信(另一种常见的串行协议)
  • Python I2C API — 在 Python 脚本中自动进行 I2C 操作
  • 术语表 — I2C、SPI 及其他术语的定义