第二章 硬件接口与通信协议:GPIO、I2C、SPI、UART
各位同学,咱们今天聊点硬核的。传感器要跟处理器说话,靠的就是这些物理接口和通信协议。说白了,这就是硬件世界的“语言”。
我刚开始做嵌入式那会儿,总觉得协议就是一堆时序图,看着就头疼。后来被逻辑分析仪“教育”了几次,才明白——不懂协议,你连传感器为啥不干活都查不出来。
本章核心脉络:从最基础的GPIO开始,逐步深入到I2C、SPI、UART这三种主流串行协议。最后教你用逻辑分析仪“看”懂这些信号。
2.1 GPIO——最基础的数字接口
GPIO,全称是General Purpose Input Output。说白了,就是芯片上那些可以编程控制的引脚。你想让它输出高电平就输出高电平,想让它读外部信号就读外部信号。
核心就三件事:
- 输出模式:控制LED亮灭、继电器通断
- 输入模式:读取按键状态、传感器数字信号
- 中断模式:引脚电平变化时触发CPU处理
💡 我的经验:GPIO最容易被忽略的是“上拉/下拉电阻”。我做过一个温控项目,传感器输出端没接上拉电阻,结果引脚一直浮空,读数乱跳。折腾了两天才发现——浮空引脚是魔鬼。
树莓派和ESP32的GPIO不太一样。树莓派是3.3V逻辑电平,ESP32也是3.3V,但有些引脚有特殊功能。我习惯用一张表记下来:
| 平台 | 工作电压 | GPIO数量 | 注意事项 |
|---|---|---|---|
| 树莓派4B | 3.3V | 26个可用 | GPIO2/3有1.8kΩ上拉(I2C专用) |
| ESP32 | 3.3V | 25个可用 | GPIO6-11用于Flash,别乱接 |
⚠️ 警告:千万别把5V信号直接怼到3.3V的GPIO上。我曾经烧过一块树莓派——就一下,冒烟了。电平转换芯片不贵,但换主板很贵。
2.2 I2C——两线制,省引脚
I2C只有两根线:SCL(时钟)和SDA(数据)。所有设备挂在同一根总线上,靠地址区分。你想想看,一个传感器一个地址,主控轮流点名,多省引脚。
I2C的特点:
- 半双工:同一时刻只能一个方向传数据
- 多主多从:但实际项目中99%是一主多从
- 速度:标准模式100kHz,快速模式400kHz
- 每个设备有7位或10位地址
我常用的I2C传感器有:温湿度传感器SHT30、气压计BMP280、OLED显示屏SSD1306。这些器件地址都是固定的,查数据手册就能找到。
🔑 关键点:I2C总线需要上拉电阻(通常4.7kΩ)。没有上拉电阻,总线拉不高电平,通信直接挂掉。我见过有人忘了焊电阻,查了三天代码——结果就是两颗电阻的事。
2.3 SPI——四线制,跑得快
SPI比I2C快得多。它用四根线:MOSI(主出从入)、MISO(主入从出)、SCLK(时钟)、CS(片选)。每个从设备独占一根CS线,所以片选引脚多的话,布线会麻烦点。
SPI的优势:
- 全双工:可以同时收发数据
- 速度高:轻松跑到几十MHz
- 协议简单:没有地址帧,没有应答机制
我一般在需要高速数据采集时用SPI。比如用ADS1256做24位ADC采集,SPI时钟跑到10MHz,一秒钟能读几万个数据点。I2C在这种场景下就吃力了。
💡 避坑指南:SPI有四种模式(CPOL和CPHA的组合)。我曾经把一个LCD屏幕的SPI模式配错了,屏幕死活不显示。后来用逻辑分析仪一看,时钟极性和相位全反了。记住:先查数据手册的时序图,再配模式。
2.4 UART——老牌异步通信
UART就是串口。它不需要时钟线,靠双方约定好的波特率来同步。一根TX发,一根RX收,地线共地,就这么简单。
UART的数据帧:
- 起始位(1位,低电平)
- 数据位(通常8位)
- 校验位(可选,奇校验或偶校验)
- 停止位(1位或2位,高电平)
我最常用UART来调试。树莓派和ESP32的串口一接,打开minicom或者Putty,就能看到打印信息。很多GPS模块、蓝牙模块也用UART通信。
⚠️ 注意:UART的TX要接对方的RX,RX接对方的TX。交叉连接,这个叫“零调制解调器”。我第一次焊串口线的时候焊成了直连,结果两边都在发,没人收——通信失败。
2.5 树莓派与ESP32的引脚定义
这两个平台是物联网项目的主力。我分别说说它们的引脚布局。
树莓派40针引脚(以Pi 4B为例):
- 物理引脚1、17:3.3V电源
- 物理引脚2、4:5V电源
- 物理引脚3(SDA)、5(SCL):I2C1总线
- 物理引脚19(MOSI)、21(MISO)、23(SCLK)、24(CE0):SPI0
- 物理引脚8(TX)、10(RX):UART0
ESP32常用引脚(以ESP32-DevKitC为例):
- GPIO21(SDA)、GPIO22(SCL):I2C默认
- GPIO23(MOSI)、GPIO19(MISO)、GPIO18(SCLK)、GPIO5(CS):SPI常用
- GPIO1(TX)、GPIO3(RX):UART0(串口打印)
📌 我的习惯:每次接线前,我都会打印一份引脚图贴在桌面上。别靠记忆——我记错过三次了。尤其是ESP32,有些引脚在芯片内部已经连了Flash或者PSRAM,用了会出奇怪的问题。
2.6 逻辑分析仪——硬件工程师的“听诊器”
逻辑分析仪这东西,说白了就是抓数字信号的波形。你写好了代码,传感器不工作,是协议不对还是接线错了?逻辑分析仪一看便知。
我常用的逻辑分析仪用法:
- 把通道夹子夹到目标信号线上(比如SCL、SDA)
- 设置采样率(一般用24MHz就够)
- 触发条件设成“下降沿”或“上升沿”
- 运行程序,抓取波形
- 用软件自带的解码器(I2C/SPI/UART)直接看数据内容
举个例子。有一次我调试一个I2C温度传感器,读回来的温度一直是0。用逻辑分析仪抓了波形,发现SDA线上只有主控发的地址,从设备根本没应答。查了一下,原来是传感器地址我写错了——数据手册写的是0x44,我写成了0x88。
💡 小技巧:便宜的USB逻辑分析仪(比如Saleae的仿品)就够用。别花大几千买高端货,除非你要抓几百兆的高速信号。我手头那个几十块钱的,用了五年,修了三次,还在用。
嗯,到这里,硬件接口和通信协议的核心内容就讲完了。GPIO是基础,I2C省引脚,SPI跑得快,UART简单可靠。再加上逻辑分析仪这个调试利器,你基本能搞定90%的传感器接入问题。
记住:理论看十遍,不如动手焊一次。拿块ESP32,接个OLED屏,用I2C把“Hello World”显示出来——这比看任何文章都管用。