第二章 硬件接口与通信协议:GPIO、I2C、SPI、UART

各位同学,咱们今天聊点硬核的。传感器要跟处理器说话,靠的就是这些物理接口和通信协议。说白了,这就是硬件世界的“语言”。

我刚开始做嵌入式那会儿,总觉得协议就是一堆时序图,看着就头疼。后来被逻辑分析仪“教育”了几次,才明白——不懂协议,你连传感器为啥不干活都查不出来。

本章核心脉络:从最基础的GPIO开始,逐步深入到I2C、SPI、UART这三种主流串行协议。最后教你用逻辑分析仪“看”懂这些信号。

硬件接口与通信协议 GPIO 通用输入输出 高低电平 · 中断 · 上拉下拉 I2C 两线式串行总线 SCL · SDA · 地址 · 主从模式 SPI 串行外设接口 全双工 · 四线 · 高速 UART 异步串行通信 TX · RX · 波特率 · 起始/停止位 🔧 逻辑分析仪 抓波形 · 解码 · 调试利器 树莓派 / ESP32 引脚定义 + 实战接线

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 逻辑分析仪——硬件工程师的“听诊器”

逻辑分析仪这东西,说白了就是抓数字信号的波形。你写好了代码,传感器不工作,是协议不对还是接线错了?逻辑分析仪一看便知。

我常用的逻辑分析仪用法:

  1. 把通道夹子夹到目标信号线上(比如SCL、SDA)
  2. 设置采样率(一般用24MHz就够)
  3. 触发条件设成“下降沿”或“上升沿”
  4. 运行程序,抓取波形
  5. 用软件自带的解码器(I2C/SPI/UART)直接看数据内容

举个例子。有一次我调试一个I2C温度传感器,读回来的温度一直是0。用逻辑分析仪抓了波形,发现SDA线上只有主控发的地址,从设备根本没应答。查了一下,原来是传感器地址我写错了——数据手册写的是0x44,我写成了0x88。

💡 小技巧:便宜的USB逻辑分析仪(比如Saleae的仿品)就够用。别花大几千买高端货,除非你要抓几百兆的高速信号。我手头那个几十块钱的,用了五年,修了三次,还在用。

嗯,到这里,硬件接口和通信协议的核心内容就讲完了。GPIO是基础,I2C省引脚,SPI跑得快,UART简单可靠。再加上逻辑分析仪这个调试利器,你基本能搞定90%的传感器接入问题。

记住:理论看十遍,不如动手焊一次。拿块ESP32,接个OLED屏,用I2C把“Hello World”显示出来——这比看任何文章都管用。

可可精品资料库