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。它采用「总线」结构,一条总线上可以挂多个设备,每个设备有唯一的地址。

通信过程是这样的:

  1. 主机发起起始信号(SCL高电平时,SDA从高变低)
  2. 主机发送7位或10位从机地址 + 读写位
  3. 从机应答(ACK)
  4. 传输数据(每字节后跟一个ACK)
  5. 主机发起停止信号(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 本章知识体系

下面这张图,帮你理清三种协议的核心逻辑:

三种通信协议核心对比 UART 异步串行通信 接线: TXD, RXD (2根) 特点: • 点对点通信 • 无时钟线 • 需约定波特率 速度: 低 (典型115200bps) 典型应用: 调试口、GPS、蓝牙 I2C 同步总线通信 接线: SDA, SCL (2根+上拉) 特点: • 多设备总线 • 有应答机制 • 设备有唯一地址 速度: 中 (典型400kHz) 典型应用: 传感器、EEPROM SPI 同步全双工通信 接线: SCK, MOSI, MISO, CS 特点: • 全双工通信 • 片选控制从机 • 无应答机制 速度: 高 (典型10MHz+) 典型应用: 显示屏、SD卡、ADC 选型口诀:调试用UART,多传感器用I2C,高速传输用SPI

嗯,以上就是三种通信协议的核心内容。你想想看,其实它们各有各的适用场景,没有绝对的好坏。关键是要根据项目需求,选最合适的那个。

下一章,我们会把这些协议用在实际的遥测数据采集系统中。到时候,你会看到它们是怎么协同工作的。


公众号:蓝海资料掘金营,微信deep3321