ESP32 I²C 引脚与接线指南 · 上拉电阻、默认脚位与常见故障

ESP32 上 I²C 该接哪两个脚、上拉电阻用多大、为什么设备扫描不到——把踩过的坑一次讲清楚,附各型号默认脚位参考。

先说结论

ESP32 经典款上,绝大多数示例和 Arduino Core 的 I²C 默认是 SDA = GPIO21、SCL = GPIO22。这不是硬件限制——I²C 走的是 GPIO 交换矩阵,几乎所有能输出的脚都能复用成 I²C。真正的问题是另外三件事。

1. 上拉电阻必须外接

ESP32 的内部上拉大约 45 kΩ,对 I²C 来说弱得几乎没用,总线上升沿会拖得很慢,在 400 kHz 下几乎必然出错。请在 SDA 和 SCL 上各接一只 4.7 kΩ 到 3.3 V 的外部上拉(总线设备多、走线长时用 2.2 kΩ)。

最常见的故障现象:扫描能扫到地址,但读回来的数据全是 0x00 或 0xFF;或者把速率从 400 kHz 降到 100 kHz 就好了。十有八九是上拉太弱。

2. 别用有约束的脚

3. 地址是 7 位还是 8 位

数据手册里写的常常是包含读写位的 8 位地址(例如 0xD0 / 0xD1 代表同一个 MPU6050)。ESP-IDF 与 Arduino 的 Wire.beginTransmission() 都期待 7 位地址,所以要把手册里的值右移一位(0xD0 >> 1 = 0x68)。地址搞错时表现是「扫描不到任何设备」。

各型号默认脚位

型号常见默认 SDA常见默认 SCL说明
ESP32(经典款)GPIO21GPIO22Arduino / 多数示例的默认值
ESP32-S2 / S3 / C3 / C6 / H2 / P4以官方文档为准默认值随 ESP-IDF 版本与 Arduino Core 变化,请查阅对应型号的官方文档或 soc 头文件
不确定的字段以官方文档为准:新型号的 I²C 默认脚位在不同 ESP-IDF 版本中调整过,本站不给出可能过时的具体数字。建议在自己的代码里显式指定脚位,而不是依赖默认值。

总线挂死的恢复

如果某个从机在发送中途被复位,它可能一直把 SDA 拉低,此后整条总线都废了。标准做法是主机输出 9 个时钟脉冲让从机释放,实在不行就给从机断电重启。软件上可以在初始化失败时加一段 GPIO 模拟时钟的恢复代码。

数据核验:2026-10-20 · 以 Espressif 官方文档交叉核对。随型号或 ESP-IDF 版本变化的字段一律标注「以官方文档为准」,不编造具体数值。 官方外设文档 →

相关页面