3、通信协议入门:串口通信(UART)、I2C、SPI协议原理与对比
各位同学,咱们今天聊聊嵌入式系统里最基础的三个通信协议。说实话,我刚入行那会儿,面对UART、I2C、SPI这三个名字,也是一头雾水。它们到底有什么区别?什么时候该用哪个?
别急,今天我就带你把它们彻底搞明白。我会结合自己踩过的坑,给你讲清楚每个协议的核心原理、优缺点,以及实战中的选择技巧。
3.1 为什么需要通信协议?
先问个问题:两个芯片之间要传数据,直接拉根线行不行?
理论上可以。但实际中,你总得知道:
- 什么时候开始发数据?
- 什么时候结束?
- 数据是几位?
- 怎么保证对方能正确收到?
通信协议,说白了就是一套「约定」。它规定了数据怎么打包、怎么传输、怎么校验。没有协议,芯片之间就是鸡同鸭讲。
核心要点:通信协议 = 物理层(怎么接线)+ 数据链路层(怎么传数据)+ 应用层(数据代表什么含义)。
3.2 UART:最经典的异步串口
UART,全称是Universal Asynchronous Receiver/Transmitter。你平时调试单片机用的串口,就是它。
3.2.1 工作原理
UART是异步通信。什么意思?就是收发双方没有共同的时钟线。它们各自用自己的时钟来采样数据。
那怎么保证同步呢?靠的是「波特率」。比如你设置9600波特率,就意味着每秒传9600个比特。收发双方必须设置相同的波特率,否则数据就乱了。
我记得有一次调试一个GPS模块,死活收不到正确数据。折腾了半天,发现是波特率设错了——我设的115200,模块默认是9600。嗯,这种低级错误,谁还没犯过呢?
3.2.2 数据帧格式
UART传一帧数据,通常长这样:
起始位(1bit) + 数据位(5~8bit) + 校验位(可选) + 停止位(1~2bit)
举个例子,传一个字符'A'(ASCII码0x41,二进制01000001):
0(起始位) + 10000010(数据位,LSB先发) + 0(校验位,偶校验) + 1(停止位)
3.2.3 硬件接线
UART只需要两根数据线:
- TXD:发送数据
- RXD:接收数据
注意:两个设备要交叉连接——A的TXD接B的RXD,A的RXD接B的TXD。这个我见过太多人接反了,包括我自己第一次焊板子的时候。
3.2.4 优缺点
| 优点 | 缺点 |
|---|---|
| 硬件简单,只需两根线 | 只能点对点通信 |
| 不需要时钟线 | 速度有限(通常不超过1Mbps) |
| 很多MCU自带硬件UART | 收发双方必须约定好波特率 |
实战建议:调试阶段,我习惯把UART的波特率设成115200。这个速度够快,而且大多数USB转串口芯片都支持得很好。如果传输距离超过3米,建议降到9600或更低,否则容易丢数据。
3.3 I2C:总线型同步通信
I2C,全称Inter-Integrated Circuit。它是飞利浦公司发明的,专门用来连接低速外设。
3.3.1 工作原理
I2C是同步通信,有专门的时钟线SCL。它采用「总线」结构,一条总线上可以挂多个设备,每个设备有唯一的地址。
通信过程是这样的:
- 主机发起起始信号(SCL高电平时,SDA从高变低)
- 主机发送7位或10位从机地址 + 读写位
- 从机应答(ACK)
- 传输数据(每字节后跟一个ACK)
- 主机发起停止信号(SCL高电平时,SDA从低变高)
3.3.2 硬件接线
I2C只需要两根线:
- SDA:数据线
- SCL:时钟线
两根线都需要上拉电阻(通常4.7kΩ)。这个上拉电阻很关键,阻值太小会拉低信号质量,太大则上升沿变慢。
注意:我曾经在一个项目里,I2C总线上挂了5个传感器,结果通信时好时坏。查了半天,发现是上拉电阻用了10kΩ,总线电容太大导致信号变形。换成2.2kΩ后,问题解决了。所以,总线设备多了,上拉电阻要适当减小。
3.3.3 优缺点
| 优点 | 缺点 |
|---|---|
| 只需两根线,可挂多个设备 | 速度较慢(标准模式100kHz,快速模式400kHz) |
| 有应答机制,可靠性高 | 总线电容限制设备数量 |
| 每个设备有唯一地址 | 没有片选信号,地址冲突时无法工作 |
3.4 SPI:高速全双工通信
SPI,全称Serial Peripheral Interface。摩托罗拉公司发明的,主打一个「快」字。
3.4.1 工作原理
SPI也是同步通信,但它采用主从模式。主机通过片选信号(CS)选择要通信的从机。
SPI有四种工作模式,由时钟极性(CPOL)和时钟相位(CPHA)决定:
| 模式 | CPOL | CPHA | 说明 |
|---|---|---|---|
| 模式0 | 0 | 0 | 空闲时SCK为低,第一个边沿采样 |
| 模式1 | 0 | 1 | 空闲时SCK为低,第二个边沿采样 |
| 模式2 | 1 | 0 | 空闲时SCK为高,第一个边沿采样 |
| 模式3 | 1 | 1 | 空闲时SCK为高,第二个边沿采样 |
我建议你刚开始用SPI时,先试试模式0。大多数SPI设备都支持这个模式,兼容性最好。
3.4.2 硬件接线
SPI需要四根线:
- SCK:时钟线
- MOSI:主机输出,从机输入
- MISO:主机输入,从机输出
- CS:片选信号(每个从机一根)
注意:SPI是全双工通信。什么意思?就是主机发数据的同时,也能收数据。这一点比UART和I2C都强。
3.4.3 优缺点
| 优点 | 缺点 |
|---|---|
| 速度快(可达几十MHz) | 需要4根线,占引脚多 |
| 全双工通信 | 没有应答机制,可靠性靠上层保证 |
| 硬件实现简单 | 从机数量受限于主机引脚 |
3.5 三种协议对比总结
好了,三种协议都讲完了。咱们来做个对比:
| 特性 | UART | I2C | SPI |
|---|---|---|---|
| 通信方式 | 异步 | 同步 | 同步 |
| 接线数量 | 2根 | 2根 | 4根(最少3根) |
| 传输速度 | 低(典型115200bps) | 中(典型400kHz) | 高(典型10MHz+) |
| 通信方向 | 半双工/全双工 | 半双工 | 全双工 |
| 设备数量 | 点对点 | 多设备(总线) | 多设备(片选) |
| 硬件复杂度 | 低 | 中 | 中 |
| 典型应用 | 调试、GPS、蓝牙 | 传感器、EEPROM | 显示屏、SD卡、ADC |
3.6 实战选型建议
你可能会问:那我做项目时,到底该用哪个?
我个人习惯这样选:
- 调试和日志输出:无脑选UART。简单、方便、电脑上随便找个串口助手就能看。
- 挂多个低速传感器:选I2C。两根线搞定所有传感器,省引脚。
- 需要高速传输数据:选SPI。比如驱动TFT屏幕、读写SD卡,SPI是首选。
- 传输距离超过1米:别用I2C和SPI了,老老实实用UART,或者转成RS485/RS232。
避坑指南:我曾经在一个项目里,用I2C连接了一个温湿度传感器和一个气压传感器。结果两个传感器的地址都是0x76,冲突了。最后只能换了一个地址不同的传感器型号。所以,选I2C设备时,一定要先确认地址会不会冲突。
3.7 本章知识体系
下面这张图,帮你理清三种协议的核心逻辑:
嗯,以上就是三种通信协议的核心内容。你想想看,其实它们各有各的适用场景,没有绝对的好坏。关键是要根据项目需求,选最合适的那个。
下一章,我们会把这些协议用在实际的遥测数据采集系统中。到时候,你会看到它们是怎么协同工作的。
公众号:蓝海资料掘金营,微信deep3321