第二章 硬件接口协议入门:UART、I2C、SPI基础概念与电气特性对比
做嵌入式这些年,我调试过最多的就是这三种接口:UART、I2C、SPI。说它们是嵌入式工程师的「三件套」,一点不过分。你想想看,从最简单的温度传感器,到复杂的九轴惯性测量单元,几乎都是用这三种协议跟主控芯片打交道。
这一章,咱们就把它们掰开揉碎了讲清楚。不搞那些虚的,直接上干货。
2.1 UART:最朴实的串行通信
UART,全称是通用异步收发传输器。名字挺长,说白了就是「一根线发,一根线收,不用时钟线」。
为什么叫异步? 因为没有专门的时钟线。发送方和接收方得事先约定好一个速率,比如9600、115200。这个速率就是波特率。我刚开始学的时候,总搞混波特率和比特率。其实在UART里,波特率就等于比特率,一个符号就是一位数据。
UART的电气特性要点:
- 空闲时,信号线保持高电平
- 起始位:一个低电平脉冲,告诉接收方「我要开始发了」
- 数据位:5到9位,常用8位
- 校验位:可选,奇校验或偶校验
- 停止位:1位或2位的高电平,表示一帧结束
我记得有一次调试一个GPS模块,死活收不到数据。用示波器一看,波形乱成一团。后来发现是波特率设错了。模块默认是9600,我代码里配成了115200。嗯,这种低级错误,犯过一次就记住了。
我的小技巧: 调试UART时,先用逻辑分析仪抓一下波形。看起始位和停止位对不对,波特率对不对。这比盯着代码看有效多了。
2.2 I2C:两根线走天下
I2C,Inter-Integrated Circuit,集成电路间总线。只需要两根线:SCL(时钟线)和SDA(数据线)。
I2C最大的特点是「主从结构」。一个主设备可以挂多个从设备,每个从设备有唯一的地址。你想想看,一个单片机通过两根线,就能控制几十个传感器,是不是很划算?
I2C的电气特性:
- SCL和SDA都是开漏输出,需要上拉电阻
- 标准模式100kHz,快速模式400kHz,高速模式3.4MHz
- 每个从设备有7位或10位地址
- 数据在SCL低电平时变化,高电平时采样
我曾经在一个项目里,I2C总线上挂了5个传感器。其中一个传感器地址冲突了,结果整个总线都瘫痪。排查了半天,最后用万用表量SDA线上的电压,发现一直拉低。这就是典型的「总线锁死」现象。
避坑指南: 我曾经遇到过I2C总线被锁死的情况。原因是某个从设备没有正确释放SDA线。解决办法是:给SCL线发9个时钟脉冲,让从设备复位。或者直接断电重启。
2.3 SPI:速度之王
SPI,Serial Peripheral Interface,串行外设接口。它比I2C快得多,但用的线也多。
SPI需要四根线:
- SCLK:时钟线,由主设备产生
- MOSI:主设备输出,从设备输入
- MISO:主设备输入,从设备输出
- SS:片选线,每个从设备一根
SPI是全双工的,意思是发送和接收可以同时进行。这一点比I2C强。I2C是半双工,同一时间只能一个方向传输。
SPI的四种模式:
| 模式 | 时钟极性(CPOL) | 时钟相位(CPHA) | 说明 |
|---|---|---|---|
| 模式0 | 0 | 0 | 空闲低电平,第一个边沿采样 |
| 模式1 | 0 | 1 | 空闲低电平,第二个边沿采样 |
| 模式2 | 1 | 0 | 空闲高电平,第一个边沿采样 |
| 模式3 | 1 | 1 | 空闲高电平,第二个边沿采样 |
我调试SPI时,最常犯的错误就是模式配错了。传感器手册上写的是模式0,我代码里配成了模式3。结果数据全是乱的。后来我养成了一个习惯:先看手册里的时序图,确认CPOL和CPHA,再写代码。
三种协议对比总结:
| 特性 | UART | I2C | SPI |
|---|---|---|---|
| 线数 | 2(TX/RX) | 2(SCL/SDA) | 4+(SCLK/MOSI/MISO/SS) |
| 通信方式 | 异步 | 同步 | 同步 |
| 传输方向 | 全双工 | 半双工 | 全双工 |
| 速度 | 慢(最高几Mbps) | 中(最高3.4Mbps) | 快(最高几十Mbps) |
| 从设备数量 | 点对点 | 多设备(地址区分) | 多设备(片选区分) |
| 硬件复杂度 | 低 | 中 | 高 |
2.4 如何选择?
这个问题,我经常被问到。其实没有绝对的好坏,看场景。
- 调试用: 首选UART。简单,可靠,用一根USB转串口线就能跟电脑通信。我调试代码时,printf输出全靠它。
- 挂多个传感器: 选I2C。两根线能挂几十个设备,省GPIO。但要注意总线电容,线太长或设备太多,信号会变形。
- 要速度: 选SPI。比如驱动LCD屏幕、读取高速ADC数据,SPI是首选。但线多,占用的GPIO也多。
我的经验: 如果项目里既有I2C又有SPI设备,我会优先把高速设备放SPI总线上,低速设备放I2C总线上。这样互不干扰,调试起来也清爽。
好了,这一章就到这里。三种协议的基础概念和电气特性,咱们都过了一遍。下一章,我会带大家实际动手,用逻辑分析仪抓波形,看看这些协议在示波器上长什么样。那才是真正有意思的部分。