I2C 接口¶
I2C 是控制器附近小微芯片和模块之间的通信接口。展开:集成电路间。在文档中,您经常看到 I2C 总线。
主要思想:如果多个设备具有不同的地址,它们可以连接到相同的两条信号线 SDA 和 SCL。
I2C 使用的地方¶
在 3D 打印机周围的简单设备中,I2C 通常用于:
- OLED 显示屏;
- 温度、湿度、压力和光传感器;
- 实时时钟;
- GPIO 扩展器;
- 一些编码器和按钮模块;
- I2C 多路复用器;
- 一些 RFID/NFC 模块;
- 小型辅助板。
I2C 在一个外壳内的短连接上工作良好。对于整个打印机上的长线或电源线附近,它变得更危险。
SDA、SCL、电源和 GND¶
I2C 模块通常有 4 个接点:
VCC或VIN- 电源;GND- 共同接地;SDA- 数据;SCL- 时钟信号。
有多个设备的电路如下所示:
来源:Wikimedia Commons, Cburnett, CC BY-SA 3.0
同一 I2C 总线上的所有设备连接到相同的 SDA、SCL 和 GND。电源可以共同,但其电压和逻辑电平必须针对每个模块进行验证。
设备地址¶
每个 I2C 设备都有一个地址。例如,小型 OLED 通常使用 0x3C,一些传感器使用 0x76、0x77、0x68、0x69 等。
如果同一总线上的两个设备具有相同的地址,控制器无法单独正确地对它们进行寻址。
处理地址冲突的方法:
- 通过跳线或焊接桥更改地址(如果模块支持);
- 选择不同的模块变体;
- 使用 I2C 多路复用器;
- 如果控制器和固件允许,在不同的 I2C 总线上分割设备。
地址通常以十六进制格式 (hex) 给出:0x3C。但一些固件或配置可能需要十进制格式 (decimal)。例如,十进制的 0x3C 是 60。您需要检查特定系统的文档。
上拉电阻¶
I2C 线通过上拉电阻工作。总线上的设备通常可以将 SDA 或 SCL 拉低,高电平来自于到逻辑电源的上拉。
没有上拉,总线可能无法工作。但在一个总线上有许多带自己上拉的模块也可能是一个问题:总阻力变得太小,线负载更硬,信号边缘和电平可能降级。
实际上:
- 许多 OLED 和传感器板已经有上拉电阻;
- 在短的简单总线上,这通常立即工作;
- 如果有许多设备,您需要检查模块原理图和总上拉;
- 如果总线不稳定,首先检查之一是上拉电阻。
单独总线的常见起始电阻约为 4.7 kOhm,但现成模块中的上拉可能有所不同。
3.3V 和 5V¶
I2C 对电压电平特别敏感,因为 SDA 和 SCL 通常被拉至某个电源电压。
ESP32、RP2040 和 STM32 通常以 3.3V 逻辑运行。Arduino Uno/Nano 通常以 5V 逻辑运行。
危险情况:
3.3V控制器;- 从
5V供电的 I2C 模块; - 模块上的上拉电阻将
SDA和SCL拉至5V。
在这种情况下,5V 可能出现在控制器的 GPIO 上。这可能会损坏微控制器。
连接前,验证:
- 模块从什么电压供电;
SDA和SCL被拉至什么;- 模块上是否有电平转换器;
- 模块是否与
3.3V控制器兼容。
如果有疑问,对 I2C 模块使用 3.3V 电源或电平转换器。
速度¶
典型的 I2C 速度:
对于短线和正常模块,400 kHz 通常有效。但对于长线、弱上拉、许多设备或噪声环境,最好以 100 kHz 开始。
在 Klipper 中,i2c_speed 参数在所有 MCU 中不是均等支持的。文档指出许多微控制器使用 100000,而某些平台支持 400000。所以你不能只写高速并假设它实际应用。
I2C 扫描器¶
I2C 扫描器是一个小程序或命令,迭代地址并显示总线上哪些设备响应。
它有助于理解:
- 控制器是否看到模块;
- 什么是设备地址;
SDA和SCL是否混淆;- 是否有电源和共同
GND; - 是否有地址冲突。
但扫描器不能证明设备完全工作。它只显示有人在该地址响应。
Klipper 中的 I2C¶
在 Klipper 中,I2C 设备连接到特定的 MCU。
配置可能包括参数:
i2c_mcu- 设备连接的 MCU;i2c_bus- 硬件 I2C 总线(如果有多个);i2c_software_scl_pin和i2c_software_sda_pin- 所选引脚上的软件 I2C;i2c_address- 设备地址;i2c_speed- 速度(如果支持)。
重要:Klipper 中的 i2c_address 通常指定为十进制数,不是十六进制格式。如果数据表说 0x3C,配置可能需要 60。
如果设备连接到附加 MCU,也必须指定该 MCU。否则 Klipper 将在主板上查找它。
线长和干扰¶
I2C 为短连接设计。在小外壳内或在一个板上,它很方便。在 3D 打印机中,条件更糟:
- 附近的电动机;
- 附近的加热器;
- 长线;
- 门上的连接器;
- 风扇和加热器的电源线;
- 电磁干扰。
实际规则:
- 保持
SDA和SCL短; - 在
GND附近路由它们; - 不要平行于加热器电源线路由;
- 不要无原因地对移动部件进行长丝带电缆;
- 如果有错误,将速度降低至
100 kHz; - 使用适当的连接器和应力消释;
- 对于长连接,选择另一个接口:UART、CAN、RS-485 或传感器附近的本地 MCU。
连接前要检查的事项¶
在连接 I2C 模块之前,验证:
- 模块电源;
- 逻辑电平;
SDA和SCL被拉至什么;- 设备地址;
- 是否可以更改地址;
- 是否与其他设备存在冲突;
- 线长;
- 是否有固件支持;
- 设备连接的 MCU 和总线;
- 是否需要硬件 I2C 或软件 I2C。
典型错误¶
- 混淆了
SDA和SCL; - 忘记了共同的
GND; - 对
3.3V控制器应用了5V上拉; - 两个设备具有相同的地址;
- 在需要十进制的地方指定了十六进制地址;
- 使用了太长的线;
- 连接了许多带上拉电阻的模块;
- 选择了固件不支持的模块;
- 将设备连接到附加 MCU 但未指定
i2c_mcu; - 混淆 I2C 和 I2S。
要点¶
I2C 对控制器附近的小显示器、传感器和辅助模块很方便。它需要 SDA、SCL、电源和共同的 GND。
连接前的主要检查:地址、3.3V/5V 电平、上拉电阻、线长和固件支持。在嘈杂的打印机环境中,保持 I2C 短。
相关资料¶
- SparkFun: I2C at the Hardware Level -
SDA、SCL、开漏线和上拉电阻的实际说明。 - SparkFun: I2C tutorial - 一般 I2C 指南、地址、总线上的多个设备和硬件功能。
- Adafruit: STEMMA QT technical specs - 标准化 I2C 连接器、引脚图、电源和
GND的示例。 - Adafruit: PCA9548 I2C multiplexer - 通过多路复用器解决重复 I2C 地址冲突的示例。
- Klipper Configuration Reference: common I2C settings -
i2c_address、i2c_mcu、i2c_bus、软件 I2C 和i2c_speed参数。