I2C 驱动程序

[English]


ESP8266 是否支持 I2C 从机模式?

不支持,如果要使用此功能,推荐使用 ESP32 或者 ESP32-S2 芯片。ESP32 参考示例: i2C_self_test


ESP8266 I2C 是软件模拟的吗?

ESP8266 I2C 是使用 GPIO 软件模拟。


当 ESP32 芯片 I2C 在工作时(尤其是处于快速模式时),数据线上经常出现一些尖峰,往往在第 8/9 个时钟的下降沿之后,这是否正常?

发生在 8/9 个时钟时数据线上的尖峰是由于 I2C 主从机控制权交接导致的,属于 I2C 协议里提到的正常现象。


ESP32 芯片作为 I2C 主机怎样才能等待从机处理数据后再接收?例如通过 i2c_master_read_to_device 读取数据时, 需要从机接受命令后立即返回数据,但是实际的一些从机设备接收到命令后需要等待一段时间才能返回数据。

可以自行将 i2c_master_read_device 拆分成三部分进行实现:

  1. 写命令和地址:i2c_cmd_link_create_static > i2c_master_start > i2c_master_write_byte > i2c_master_cmd_begin > i2c_cmd_link_delete_static

  2. 延时

  3. 读从机数据:i2c_cmd_link_create_static > i2c_master_read > i2c_master_stop > i2c_master_cmd_begin > i2c_cmd_link_delete_static


使用 ESP32 芯片时,能否将 GPIO32 和 GPIO33 分别配置为 I2C_SDA 和 I2C_SCL?

可以,ESP32 的 I2C 管脚可以使用任何空闲的 GPIO 进行重映射。请参阅 ESP32 技术规格书 的 2.2 小节,管脚概述部分。如果不需要外部 32.768 kHz 晶振,则可以使用 GPIO32 和 GPIO33 作为 I2C 管脚。


使用 ESP32 芯片时,如果启用蓝牙或 Wi-Fi 功能,为什么 I2C 总线有概率接收到错误数据?

这是由于 ESP32 的 I2C FIFO 存在问题,可能导致 I2C 主机在读取数据时出现数据错乱。该问题已在 release/v5.4 及后续版本中进行了软件修复。在 ESP32 之后的芯片(如 ESP32-S3、ESP32-C3)中,已通过硬件修复解决了此问题。


ESP32-C6 未进入 DeepSleep 模式时,是否可以同时使用 I2C 和 LP I2C?

可以。在 esp_driver_i2c 驱动中,可以选择 LP_I2C_PORT 以启用 LP I2C 功能。具体实现请参考例程:esp-idf/components/esp_driver_i2c/test_apps/i2c_test_apps/main/test_lp_i2c


如何为 I2C 设置时钟延展?

esp_driver_i2c 驱动中,可以设置 i2c_master_dev_t 中的 scl_wait_us 参数来更改 SCL 等待时间,从而实现时钟延展。