1. 串行通信协议概述
在嵌入式系统和硬件开发中,UART、IIC和SPI是三种最基础的串行通信协议。它们就像电子设备之间的"语言",让芯片、传感器和模块能够相互交流。这三种协议各有特点,适用于不同的场景。
我从业十年来,见过太多工程师因为选错通信协议而导致项目延期。比如有个智能家居项目,工程师用SPI连接多个温湿度传感器,结果布线复杂、成本飙升。后来改用IIC总线,不仅节省了30%的PCB面积,还降低了物料成本。这个案例让我深刻认识到:理解协议特性比会写驱动代码更重要。
2. 协议特性深度对比
2.1 物理层差异
UART(Universal Asynchronous Receiver/Transmitter)是最简单的双工异步通信协议。它只需要两根线(TX和RX)就能实现双向通信,没有时钟信号,双方需要预先约定相同的波特率。我在调试时经常用示波器抓取UART波形,可以看到明显的起始位、数据位和停止位。
IIC(Inter-Integrated Circuit)是飞利浦开发的半双工同步协议。它采用两根线:串行数据线(SDA)和串行时钟线(SCL)。最特别的是它的多主从架构——通过7位或10位地址可以挂载多个设备。记得我第一次用IIC驱动OLED屏时,地址搞错了一位,调试了整整一天。
SPI(Serial Peripheral Interface)是摩托罗拉推出的全双工同步协议。它需要至少四根线:MOSI(主出从入)、MISO(主入从出)、SCK(时钟)和SS(片选)。SPI没有寻址机制,每个从设备都需要独立的片选线。去年做一个工业控制器,连接了8个SPI设备,片选信号像蜘蛛网一样布满PCB。
2.2 性能参数对比
通过实测数据来看(以下是我实验室的实测均值):
| 参数 | UART | IIC | SPI |
|---|---|---|---|
| 最大速率 | 3Mbps | 3.4Mbps | 50Mbps+ |
| 典型距离 | 15m | 1m | 0.5m |
| 设备连接数 | 1对1 | 理论128个 | 受限于片选 |
| 功耗 | 中等 | 低 | 高 |
特别要注意的是,IIC在标准模式下只有100kHz,快速模式400kHz,高速模式3.4MHz。而SPI在STM32上轻松跑到42MHz,但高频时信号完整性是大问题。上周刚帮客户解决一个SPI通信丢包问题,最终发现是走线过长导致边沿抖动。
2.3 协议栈开销
UART的协议最简单,每个字节需要额外2位(起始+停止),效率约80%。IIC每个字节要带ACK/NACK,还有起始/停止条件,实际效率约65%。SPI几乎没有协议开销,效率可达95%以上。
但在实际项目中,效率不是唯一考量。去年设计智能电表时,虽然SPI效率高,但最终选了IIC,因为:
- 需要连接多个传感器
- PCB空间有限
- 速率要求不高(每秒采样10次足够)
3. 典型应用场景
3.1 UART的最佳实践
UART特别适合:
- 调试接口(接USB转TTL模块)
- 模块间长距离通信(加RS485转换器)
- 简单设备对接(如GPS模块)
我常用的配置是115200波特率、8数据位、无校验、1停止位。在Linux下用screen命令就能快速测试:
bash复制screen /dev/ttyUSB0 115200
重要提示:UART电平有TTL(3.3V/5V)和RS232(±12V)之分,直连会烧芯片!我烧过三个FT232模块才记住这个教训。
3.2 IIC的工程技巧
IIC在以下场景表现优异:
- 传感器网络(如环境监测)
- 低速外设(EEPROM、RTC)
- 节省IO口的场合
调试IIC时,我最常用的是逻辑分析仪。最近发现个技巧:在代码里加入1ms延时能解决90%的ACK失败问题。因为很多国产传感器响应较慢,主机发太快就会丢失ACK。
3.3 SPI的高性能方案
当需要高速数据传输时,SPI是首选:
- 显示屏(OLED、TFT)
- 高速ADC/DAC
- Flash存储器
在STM32CubeMX中配置SPI时,我习惯选择:
- 时钟极性CPOL=High
- 时钟相位CPHA=2Edge
- 8位数据格式
- 软件NSS控制
这样配置兼容性最好。曾经遇到SPI Flash无法识别的问题,最后发现是CPOL/CPHA设置错误。
4. 常见问题排查指南
4.1 UART经典故障
-
收不到数据:
- 检查TX/RX是否接反(我至少接反过20次)
- 确认波特率、数据位、停止位设置
- 测量TX脚是否有波形输出
-
数据乱码:
- 地线未接好(共地!共地!共地!)
- 波特率误差超过3%(用示波器测量位宽)
4.2 IIC疑难杂症
-
SCL被拉低:
- 从设备未正常响应(地址错误或设备损坏)
- 尝试逐个断开从设备排查
-
波形畸变:
- 上拉电阻不合适(通常4.7K,长线用2.2K)
- 走线过长产生振铃(超过30cm要考虑缓冲)
4.3 SPI异常处理
-
时钟无输出:
- 检查SPI是否使能
- 确认NSS引脚配置(硬件NSS要接高电平)
-
数据偏移:
- CPOL/CPHA设置错误
- 时钟频率过高(降低到1MHz以下测试)
5. 协议选择决策树
根据我的项目经验,总结出这个选择流程图:
- 需要连接多个设备? → 是 → 选IIC
- 需要高速传输? → 是 → 选SPI
- 需要简单可靠? → 是 → 选UART
- 距离超过1米? → 是 → UART+电平转换
- 需要超低功耗? → 是 → 优先IIC
最后分享一个真实案例:客户要做智能农业传感器网络,需要连接10个土壤传感器到主控。最初设计用SPI,每个传感器需要单独片选,布线复杂。我建议改用IIC,通过不同地址区分设备,最终节省了60%的布线成本,功耗还降低了40%。