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. 别用有约束的脚
- Flash 脚:ESP32 经典款的 GPIO 6–11 接内部 Flash,绝对不能用。
- Strapping 脚:GPIO 0 / 2 / 5 / 12 / 15 上电时参与启动配置,接上拉/下拉可能让芯片起不来。GPIO2 上还挂着开发板的 LED。
- 仅输入脚:GPIO 34–39 没有输出驱动,做不了 SDA(SDA 是双向的)。
3. 地址是 7 位还是 8 位
数据手册里写的常常是包含读写位的 8 位地址(例如 0xD0 / 0xD1 代表同一个 MPU6050)。ESP-IDF 与 Arduino 的 Wire.beginTransmission() 都期待 7 位地址,所以要把手册里的值右移一位(0xD0 >> 1 = 0x68)。地址搞错时表现是「扫描不到任何设备」。
各型号默认脚位
| 型号 | 常见默认 SDA | 常见默认 SCL | 说明 |
|---|---|---|---|
| ESP32(经典款) | GPIO21 | GPIO22 | Arduino / 多数示例的默认值 |
| 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 版本变化的字段一律标注「以官方文档为准」,不编造具体数值。
官方外设文档 →
相关页面
SPIESP32 的 HSPI 与 VSPI 默认接哪几个脚、能跑多快、为什么屏幕就是点不亮——含可直接抄的引脚对照。UARTESP32 三个串口各自默认接哪两个脚、为什么 UART1 用不了、下载失败时该检查什么。RMT 红外与 WS2812RMT 是 ESP32 上最被低估的外设:红外遥控、WS2812 灯带、单总线传感器都靠它。这里讲清通道数、分辨率和 Wi-Fi 干扰问题。LEDC PWMESP32 的 LEDC 有 16 路 PWM。频率和分辨率是此消彼长的关系,这里给出换算表和常用场景的推荐值。深度睡眠深度睡眠能到多少 µA、哪些脚能唤醒、醒来后数据还在吗——配合续航计算器一起用,把电池项目的账算清楚。