树莓派与 ESP32 引脚冲突检查

把 I2C、SPI、UART 各用哪几根针选出来,重复占用、功能不支持、启动绑带针和 Flash 保留针会一次标出来。

开发板

3B / 4B / 5 / Zero 的排针布局相同,功能以每针的第一复用为准。

接线前多看一眼

排针上的物理编号和 GPIO 编号不是一回事。树莓派第 3 针是 GPIO2,第 11 针是 GPIO17;买模块时资料里写「接 GPIO17」,指的是 BCM 编号,不是物理位置。接错针轻则不工作,重则把 5V 灌进 3.3V 引脚,芯片当场报废。

电源引脚尤其要核对。树莓派排针同时有 5V 和 3.3V,丝印挨得近;ESP32 DevKit 的 VIN 可以吃 5V,但 3V3 是稳压输出,不能反灌。给传感器供电前先看它要几伏、能承受多大电流,别直接从 GPIO 取电驱动电机或继电器线圈。

总线设备数量也有上限。I2C 理论上可以挂一百多个地址,实际受总线电容限制,线长了上升沿变慢,通常三五米就是上限;SPI 的片选每多一个设备就多一根 CS,别把 CS 固定死。UART 是一对一,多个设备要加分时或切换。

ESP32 的 ADC2 和 Wi-Fi 互斥,这是新手最常踩的坑:GPIO25/26/27 读数在 Wi-Fi 开启后乱跳,不是模块坏了,是 ADC2 被射频占用。需要稳定模拟读数就用 GPIO32 到 39(ADC1),或者关了 Wi-Fi 再采。树莓派没有板载 ADC,读模拟量要外接 ADS1115 之类的芯片。

需要查具体针脚定义,用开发板 GPIO 引脚速查;串口波特率和定时器的计算在串口波特率误差 与单片机定时器计算。

常见问题

为什么两根针不能同时做 I2C 和 UART?

一根 GPIO 在某一时刻只能复用成一种外设功能。芯片内部是一个多路选择器,选了 I2C 的 SDA 就不能再选 UART 的 TX。软件层面也许能分时切换,但总线时序不允许,实际用起来就是两边都不工作。

ESP32 的 GPIO34 到 39 为什么不能做输出?

这几根针在芯片里只有输入通路,没有输出驱动。做 ADC 输入、按键读取没问题,但拿去驱动 LED、做 SPI 的 MOSI 或 UART 的 TX 就不会有信号。它们也没有内部上拉/下拉,接按键要外加电阻。

启动绑带针(strapping pin)有什么坑?

ESP32 上电或复位时会采样几根针的电平来决定启动模式。GPIO0 低电平进下载模式,GPIO2 必须为高,GPIO12 必须为低,GPIO15 影响启动日志。外设若在这些针上接了会拉低/拉高的电路,可能导致板子起不来或者进不了 Flash。

树莓派的 GPIO14/15 为什么最好别占用?

这两根是 UART0,默认是串口控制台。占用后系统启动日志看不到,救援时也没法用串口登录。确实要用就把控制台关掉(在 config.txt 里禁用 console),并确认没有其他服务占用串口。

I2C 到底要不要外加上拉?

树莓派的 GPIO2/3 板上已经有 1.8k 上拉,短距离接一两个模块通常不用再加;ESP32 的 GPIO21/22 没有板载上拉,必须靠模块自带的 4.7k 或自己补。上拉太小会增加总线电容充电电流,太大则上升沿变慢,4.7k 是常见折中。

为什么图里同一根针显示两个外设?

那正是冲突:你在两个外设的下拉框里选了同一个物理针。工具会把涉及的针标红,并在下面列出具体是哪两个功能。改掉其中一个即可。