2. 传感器通信协议:I2C、SPI、UART 协议详解与对比,时序图分析
做嵌入式这些年,打交道最多的就是传感器。而传感器跟MCU怎么说话?靠的就是通信协议。今天咱们就把I2C、SPI、UART这三个老伙计彻底聊透。
我个人习惯,拿到一个新传感器,第一件事就是看它用什么接口。这决定了你的电路怎么画、代码怎么写、甚至调试用什么工具。你想想看,选错了协议,后面全是坑。
2.1 UART——最朴实的串行通信
UART,全称通用异步收发传输器。说白了就是一根线发、一根线收,再加一根地线,三根线搞定。
核心特点:
- 异步通信:没有时钟线,靠双方约定好波特率
- 全双工:可以同时收发
- 点对点:只能两个设备之间通信
时序图(SVG):
嗯,这里要注意:UART的起始位是低电平,停止位是高电平。我刚开始做项目时,有一次把停止位配成了1.5位,结果死活收不到数据。后来查手册才发现,有些老芯片支持1.5位停止位,但大部分现代传感器只用1位。
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的上拉电阻选太大了。10kΩ的电阻,总线电容一大,波形就变圆了,通信时好时坏。后来换成4.7kΩ,稳如老狗。
2.3 SPI——速度之王
SPI,Serial Peripheral Interface,摩托罗拉发明的。四根线:SCLK(时钟)、MOSI(主出从入)、MISO(主入从出)、CS(片选)。
SPI的优势:
- 全双工:同时收发
- 速度快:轻松上MHz,甚至几十MHz
- 硬件简单:没有地址,靠片选区分设备
SPI时序图(SVG):
SPI有四种模式,由时钟极性(CPOL)和时钟相位(CPHA)决定。我刚开始学的时候,被这四种模式搞晕过。后来总结了一个规律:看数据手册里的时序图,找到采样沿,就知道用哪个模式了。
| 特性 | UART | I2C | SPI |
|---|---|---|---|
| 线数 | 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单独一个片选。整个系统跑得很稳,没出过通信问题。
好了,这三种协议的核心区别和时序,咱们就聊到这儿。你想想看,理解了这些,以后选型、调试、排错,心里就有底了。