4. 数据采集通信协议:UART、I2C、SPI 与选型指南
做数据采集这些年,打交道最多的就是这三种协议:UART、I2C、SPI。说实话,刚入行那会儿我也分不清什么时候该用哪个,经常是「哪个顺手用哪个」,结果踩了不少坑。今天咱们就好好捋一捋,把它们的脾气秉性摸清楚。
核心观点:没有最好的协议,只有最合适的协议。选型的关键在于——你的传感器有多快?你的线能拉多长?你的引脚够不够用?
4.1 UART 串口通信——最老牌、最通用
UART,全称是通用异步收发传输器。说白了,就是一根线发、一根线收,两边约定好速度(波特率),就能聊起来。
我个人的习惯是:只要项目不急、距离不远、数据量不大,我首选 UART。为什么?因为它简单啊!你想想看,两根线(TX、RX)加一个地线,搞定。调试的时候拿个 USB 转串口模块往电脑上一插,串口助手一开,数据就出来了。这种「所见即所得」的感觉,其他协议给不了。
我在项目中遇到过一件事:一个温湿度传感器,输出就是 UART 格式,9600 波特率。我一开始想用 I2C 去读,结果发现传感器根本不支持。后来老老实实接了两根线,5 分钟调通。嗯,有时候别想太多,简单就是王道。
UART 的关键参数
- 波特率:常见的有 9600、115200、921600。越高越快,但线长了容易出错。我一般室内用 115200,超过 5 米就降到 9600。
- 数据位:通常是 8 位,也有 7 位或 9 位的,但 8 位最通用。
- 停止位:1 位或 2 位。我习惯用 1 位,省时间。
- 校验位:可选无校验、奇校验、偶校验。我一般不用,除非环境干扰大。
小技巧:调试 UART 时,先用示波器看 TX 脚有没有波形。如果波形正常但收不到数据,八成是波特率没对上。我曾经因为这个查了半小时,后来发现是代码里配成了 9600,但传感器是 19200。
4.2 I2C 协议——多设备、少引脚
I2C 是飞利浦(现恩智浦)发明的,两根线(SCL、SDA)就能挂一堆设备。每个设备有自己的地址,主机挨个点名,从机应答。
我建议:如果你的板子上要接好几个传感器,比如加速度计、陀螺仪、磁力计,而且它们都支持 I2C,那就用 I2C。两根线搞定所有,省下的 GPIO 可以干别的。
但 I2C 有个毛病——速度上不去。标准模式 100kHz,快速模式 400kHz,高速模式也就 3.4MHz。而且线一长(超过 30cm),信号就容易变形。我记得有一次做项目,传感器离主板 1 米远,I2C 死活不通,最后换成 UART 才解决。
I2C 的通信流程
- 主机发送起始信号(SCL 高电平时 SDA 从高变低)。
- 主机发送 7 位从机地址 + 1 位读写位。
- 从机应答(拉低 SDA)。
- 主机发送或接收数据,每字节后跟一个应答位。
- 主机发送停止信号(SCL 高电平时 SDA 从低变高)。
注意:I2C 的上拉电阻很关键。阻值太小,功耗大;阻值太大,信号上升沿变慢。我一般用 4.7kΩ,如果总线电容大(比如线长),就换成 2.2kΩ。
4.3 SPI 协议——速度之王
SPI 是摩托罗拉发明的,四根线(MOSI、MISO、SCLK、CS),全双工,速度可以跑到几十 MHz。如果你要采集高速数据,比如 ADC 采样、摄像头数据、SD 卡读写,SPI 是首选。
我个人经验:SPI 虽然快,但引脚占用多。每加一个设备就要多一根片选线(CS)。如果你有 8 个 SPI 设备,那就得 8 根 CS 线,加上其他 3 根,一共 11 根。相比之下,I2C 始终只要 2 根。
另外,SPI 没有标准的应答机制。主机发完数据,从机有没有收到,主机不知道。所以我在项目中一般会自己加一个「校验字节」,比如发完数据后,让从机回传一个固定值,确认通信正常。
SPI 的四种模式
SPI 有四种模式,由时钟极性(CPOL)和时钟相位(CPHA)决定。很多新手在这里栽跟头。
| 模式 | CPOL | CPHA | 说明 |
|---|---|---|---|
| 模式 0 | 0 | 0 | 空闲时低电平,第一个边沿采样 |
| 模式 1 | 0 | 1 | 空闲时低电平,第二个边沿采样 |
| 模式 2 | 1 | 0 | 空闲时高电平,第一个边沿采样 |
| 模式 3 | 1 | 1 | 空闲时高电平,第二个边沿采样 |
避坑指南:我曾经因为 SPI 模式没配对,调了整整一天。后来发现传感器手册里写的是「模式 0」,但我代码里配成了「模式 3」。所以拿到一个新器件,第一件事就是看数据手册里的时序图,确认 CPOL 和 CPHA。
4.4 协议对比与选型建议
好了,三种协议都讲完了。咱们来做个对比,方便你选型。
| 特性 | UART | I2C | SPI |
|---|---|---|---|
| 引脚数 | 2(TX、RX) | 2(SCL、SDA) | 4+(MOSI、MISO、SCLK、CS) |
| 速度 | 慢(最高约 1Mbps) | 中(最高约 3.4Mbps) | 快(最高 50Mbps+) |
| 通信方式 | 异步 | 同步 | 同步 |
| 多设备支持 | 点对点 | 多从机(地址寻址) | 多从机(片选寻址) |
| 传输距离 | 远(可达 10m+) | 近(通常 < 1m) | 近(通常 < 1m) |
| 硬件复杂度 | 低 | 中 | 高 |
我的选型口诀
- 距离远、速度慢、设备少 → UART(比如 GPS 模块、串口屏)
- 距离近、设备多、速度中等 → I2C(比如传感器阵列、EEPROM)
- 距离近、速度快、实时性高 → SPI(比如 ADC、SD 卡、LCD 屏)
最后说一句:实际项目中,这三种协议经常混用。比如一个采集板,主控和 WiFi 模块用 UART 通信,主控和传感器用 I2C,主控和 SD 卡用 SPI。没什么好纠结的,哪个合适就用哪个。
知识体系图:三种协议的核心逻辑
公众号:蓝海资料掘金营,微信 deep3321