2. 传感器通信协议:I2C、SPI、UART 协议详解与对比,时序图分析

做嵌入式这些年,打交道最多的就是传感器。而传感器跟MCU怎么说话?靠的就是通信协议。今天咱们就把I2C、SPI、UART这三个老伙计彻底聊透。

我个人习惯,拿到一个新传感器,第一件事就是看它用什么接口。这决定了你的电路怎么画、代码怎么写、甚至调试用什么工具。你想想看,选错了协议,后面全是坑。

2.1 UART——最朴实的串行通信

UART,全称通用异步收发传输器。说白了就是一根线发、一根线收,再加一根地线,三根线搞定。

核心特点:

  • 异步通信:没有时钟线,靠双方约定好波特率
  • 全双工:可以同时收发
  • 点对点:只能两个设备之间通信

时序图(SVG):

UART 数据帧(8-N-1) 起始位(0) D0 D1 D2 D3 D4 D5 D6 D7 停止位(1) 空闲(高电平)

嗯,这里要注意:UART的起始位是低电平,停止位是高电平。我刚开始做项目时,有一次把停止位配成了1.5位,结果死活收不到数据。后来查手册才发现,有些老芯片支持1.5位停止位,但大部分现代传感器只用1位。

实战小贴士: 调试UART时,先用示波器看TX脚有没有波形。如果波形正常但收不到数据,八成是波特率没对上。我习惯在代码里先发一个0x55(01010101),这样波形最容易看。

2.2 I2C——总线上的多设备通信

I2C,Inter-Integrated Circuit,飞利浦发明的。两根线:SCL(时钟)和SDA(数据),就能挂一堆设备。

为什么我喜欢I2C? 因为它省引脚。一个MCU的I2C接口,理论上可以挂127个设备。实际项目中我最多挂过8个传感器,完全没问题。

I2C的关键要素:

  • 主从架构:MCU是主机,传感器是从机
  • 7位或10位地址:每个从机有唯一地址
  • 开漏输出:需要上拉电阻(4.7kΩ常用)
  • 速率:标准模式100kHz,快速模式400kHz

I2C时序图(SVG):

I2C 起始条件 + 数据传输 SCL SDA 起始条件: SDA下降沿, SCL高 数据位: SCL高时采样SDA

我曾经踩过一个坑:I2C的上拉电阻选太大了。10kΩ的电阻,总线电容一大,波形就变圆了,通信时好时坏。后来换成4.7kΩ,稳如老狗。

注意: I2C总线上的设备地址不能冲突。我见过有人把两个相同地址的传感器挂同一条总线上,结果一个都读不到。解决办法:用I2C多路复用器,或者换用不同地址的型号。

2.3 SPI——速度之王

SPI,Serial Peripheral Interface,摩托罗拉发明的。四根线:SCLK(时钟)、MOSI(主出从入)、MISO(主入从出)、CS(片选)。

SPI的优势:

  • 全双工:同时收发
  • 速度快:轻松上MHz,甚至几十MHz
  • 硬件简单:没有地址,靠片选区分设备

SPI时序图(SVG):

SPI 模式0(CPOL=0, CPHA=0) SCLK MOSI MISO CS CS低电平有效,SCLK上升沿采样

SPI有四种模式,由时钟极性(CPOL)和时钟相位(CPHA)决定。我刚开始学的时候,被这四种模式搞晕过。后来总结了一个规律:看数据手册里的时序图,找到采样沿,就知道用哪个模式了。

核心对比:
特性UARTI2CSPI
线数2(TX/RX)2(SCL/SDA)4(SCLK/MOSI/MISO/CS)
速度慢(典型115200bps)中(100kHz~400kHz)快(MHz级)
通信方式异步同步同步
多设备点对点总线(地址)总线(片选)
硬件复杂度低中高
典型应用GPS、蓝牙模块温湿度、加速度计显示屏、SD卡、高速ADC

2.4 如何选择?我的经验法则

说实话,没有绝对的好坏,只有合不合适。

  • 传感器数量少、距离近、速度要求不高 → 用I2C。省引脚,代码好写。
  • 需要高速传输大量数据 → 用SPI。比如摄像头、显示屏、高速ADC。
  • 设备简单、只需要发几个字节 → 用UART。比如GPS模块、蓝牙串口。

我记得有一次做多传感器融合项目,用了3个I2C传感器和1个SPI加速度计。I2C总线上挂了3个设备,地址分别是0x68、0x76、0x77。SPI单独一个片选。整个系统跑得很稳,没出过通信问题。

避坑指南: 我曾经在SPI线上走得太长(超过20cm),结果信号反射导致数据错位。解决办法:降低SPI时钟频率,或者在靠近MCU端加33Ω串联电阻。

好了,这三种协议的核心区别和时序,咱们就聊到这儿。你想想看,理解了这些,以后选型、调试、排错,心里就有底了。