第二章 硬件接口协议入门: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总线上。这样互不干扰,调试起来也清爽。

好了,这一章就到这里。三种协议的基础概念和电气特性,咱们都过了一遍。下一章,我会带大家实际动手,用逻辑分析仪抓波形,看看这些协议在示波器上长什么样。那才是真正有意思的部分。