跳转至

I2C 接口

I2C 是控制器附近小微芯片和模块之间的通信接口。展开:集成电路间。在文档中,您经常看到 I2C 总线

主要思想:如果多个设备具有不同的地址,它们可以连接到相同的两条信号线 SDASCL

I2C 使用的地方

在 3D 打印机周围的简单设备中,I2C 通常用于:

  • OLED 显示屏;
  • 温度、湿度、压力和光传感器;
  • 实时时钟;
  • GPIO 扩展器;
  • 一些编码器和按钮模块;
  • I2C 多路复用器;
  • 一些 RFID/NFC 模块;
  • 小型辅助板。

I2C 在一个外壳内的短连接上工作良好。对于整个打印机上的长线或电源线附近,它变得更危险。

SDA、SCL、电源和 GND

I2C 模块通常有 4 个接点:

  • VCCVIN - 电源;
  • GND - 共同接地;
  • SDA - 数据;
  • SCL - 时钟信号。

有多个设备的电路如下所示:

I2C 总线:一个主设备和三个设备在共同的 SDA/SCL

来源:Wikimedia Commons, Cburnett, CC BY-SA 3.0

同一 I2C 总线上的所有设备连接到相同的 SDASCLGND。电源可以共同,但其电压和逻辑电平必须针对每个模块进行验证。

设备地址

每个 I2C 设备都有一个地址。例如,小型 OLED 通常使用 0x3C,一些传感器使用 0x760x770x680x69 等。

如果同一总线上的两个设备具有相同的地址,控制器无法单独正确地对它们进行寻址。

处理地址冲突的方法:

  • 通过跳线或焊接桥更改地址(如果模块支持);
  • 选择不同的模块变体;
  • 使用 I2C 多路复用器;
  • 如果控制器和固件允许,在不同的 I2C 总线上分割设备。

地址通常以十六进制格式 (hex) 给出:0x3C。但一些固件或配置可能需要十进制格式 (decimal)。例如,十进制的 0x3C60。您需要检查特定系统的文档。

上拉电阻

I2C 线通过上拉电阻工作。总线上的设备通常可以将 SDASCL 拉低,高电平来自于到逻辑电源的上拉。

没有上拉,总线可能无法工作。但在一个总线上有许多带自己上拉的模块也可能是一个问题:总阻力变得太小,线负载更硬,信号边缘和电平可能降级。

实际上:

  • 许多 OLED 和传感器板已经有上拉电阻;
  • 在短的简单总线上,这通常立即工作;
  • 如果有许多设备,您需要检查模块原理图和总上拉;
  • 如果总线不稳定,首先检查之一是上拉电阻。

单独总线的常见起始电阻约为 4.7 kOhm,但现成模块中的上拉可能有所不同。

3.3V 和 5V

I2C 对电压电平特别敏感,因为 SDASCL 通常被拉至某个电源电压。

ESP32、RP2040 和 STM32 通常以 3.3V 逻辑运行。Arduino Uno/Nano 通常以 5V 逻辑运行。

危险情况:

  • 3.3V 控制器;
  • 5V 供电的 I2C 模块;
  • 模块上的上拉电阻将 SDASCL 拉至 5V

在这种情况下,5V 可能出现在控制器的 GPIO 上。这可能会损坏微控制器。

连接前,验证:

  • 模块从什么电压供电;
  • SDASCL 被拉至什么;
  • 模块上是否有电平转换器;
  • 模块是否与 3.3V 控制器兼容。

如果有疑问,对 I2C 模块使用 3.3V 电源或电平转换器。

速度

典型的 I2C 速度:

100000   # standard mode, 100 kHz
400000   # fast mode, 400 kHz

对于短线和正常模块,400 kHz 通常有效。但对于长线、弱上拉、许多设备或噪声环境,最好以 100 kHz 开始。

在 Klipper 中,i2c_speed 参数在所有 MCU 中不是均等支持的。文档指出许多微控制器使用 100000,而某些平台支持 400000。所以你不能只写高速并假设它实际应用。

I2C 扫描器

I2C 扫描器是一个小程序或命令,迭代地址并显示总线上哪些设备响应。

它有助于理解:

  • 控制器是否看到模块;
  • 什么是设备地址;
  • SDASCL 是否混淆;
  • 是否有电源和共同 GND
  • 是否有地址冲突。

但扫描器不能证明设备完全工作。它只显示有人在该地址响应。

Klipper 中的 I2C

在 Klipper 中,I2C 设备连接到特定的 MCU。

配置可能包括参数:

  • i2c_mcu - 设备连接的 MCU;
  • i2c_bus - 硬件 I2C 总线(如果有多个);
  • i2c_software_scl_pini2c_software_sda_pin - 所选引脚上的软件 I2C;
  • i2c_address - 设备地址;
  • i2c_speed - 速度(如果支持)。

重要:Klipper 中的 i2c_address 通常指定为十进制数,不是十六进制格式。如果数据表说 0x3C,配置可能需要 60

如果设备连接到附加 MCU,也必须指定该 MCU。否则 Klipper 将在主板上查找它。

线长和干扰

I2C 为短连接设计。在小外壳内或在一个板上,它很方便。在 3D 打印机中,条件更糟:

  • 附近的电动机;
  • 附近的加热器;
  • 长线;
  • 门上的连接器;
  • 风扇和加热器的电源线;
  • 电磁干扰。

实际规则:

  • 保持 SDASCL 短;
  • GND 附近路由它们;
  • 不要平行于加热器电源线路由;
  • 不要无原因地对移动部件进行长丝带电缆;
  • 如果有错误,将速度降低至 100 kHz
  • 使用适当的连接器和应力消释;
  • 对于长连接,选择另一个接口:UART、CAN、RS-485 或传感器附近的本地 MCU。

连接前要检查的事项

在连接 I2C 模块之前,验证:

  • 模块电源;
  • 逻辑电平;
  • SDASCL 被拉至什么;
  • 设备地址;
  • 是否可以更改地址;
  • 是否与其他设备存在冲突;
  • 线长;
  • 是否有固件支持;
  • 设备连接的 MCU 和总线;
  • 是否需要硬件 I2C 或软件 I2C。

典型错误

  • 混淆了 SDASCL
  • 忘记了共同的 GND
  • 3.3V 控制器应用了 5V 上拉;
  • 两个设备具有相同的地址;
  • 在需要十进制的地方指定了十六进制地址;
  • 使用了太长的线;
  • 连接了许多带上拉电阻的模块;
  • 选择了固件不支持的模块;
  • 将设备连接到附加 MCU 但未指定 i2c_mcu
  • 混淆 I2C 和 I2S。

要点

I2C 对控制器附近的小显示器、传感器和辅助模块很方便。它需要 SDASCL、电源和共同的 GND

连接前的主要检查:地址、3.3V/5V 电平、上拉电阻、线长和固件支持。在嘈杂的打印机环境中,保持 I2C 短。

相关资料