描述
在嵌入式开发中,设备之间的通信是绕不开的话题。常见的三种总线接口—— UART、SPI、I2C —— 各有优缺点。不同项目需求决定了选择哪一种协议最合适。本文结合实战经验,逐项对比三者,并附带实战代码,帮助你快速做出判断。
一、UART(通用异步收发器)
工作方式:点对点通信,使用 TX/RX 两根数据线(加上 GND)。
优点
- 实现简单,硬件资源少
- 常用于调试、日志打印、模块通信(如 GPS、蓝牙模块)
- 波特率可调,支持从几百 bps 到几 Mbps
缺点
- 只能点对点,无法挂多个设备
- 没有统一的时钟,容易受波特率误差影响
常见应用场景
- 串口调试
- 与 GSM、WiFi、GPS 模块通信
- 简单传感器数据读取
UART 实战代码示例(STM32 HAL)
- // 初始化 UART,波特率 115200
- HAL_UART_Init(&huart1);
-
- // 发送字符串
- char msg[]="Hello UART!\r\n";
- HAL_UART_Transmit(&huart1,(uint8_t*)msg, strlen(msg), HAL_MAX_DELAY);
-
- // 接收数据(阻塞模式)
- uint8_t rx;
- HAL_UART_Receive(&huart1,&rx,1,1000);
二、SPI(串行外设接口)
工作方式:主从模式,通常需要 4 根线(MOSI、MISO、SCLK、CS),多从机时可增加片选线。
优点
- 全双工,速度快,常见速率可达 10 Mbps 以上
- 协议简单,延迟低
- 可连接多个从设备(通过片选信号)
缺点
- 需要的 IO 口较多
- 多从机设计时,布线复杂
- 没有标准化的帧结构,需要自定义协议
常见应用场景
- 连接 Flash、SD 卡
- LCD 显示屏驱动
- 高速传感器数据采集
SPI 实战代码示例(读取 Flash ID)
- uint8_t tx =0x9F;// Flash 读 ID 指令
- uint8_t rx[3];// 接收 ID 数据
-
- HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);// CS 低电平
- HAL_SPI_Transmit(&hspi1,&tx,1, HAL_MAX_DELAY);
- HAL_SPI_Receive(&hspi1, rx,3, HAL_MAX_DELAY);
- HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);// CS 高电平
三、I2C(内部集成电路总线)
工作方式:主从架构,仅用两根线(SCL、SDA)即可挂载多个设备。
优点
- 协议标准化,设备寻址简单(7 位或 10 位地址)
- 占用引脚少,便于 PCB 设计
- 硬件生态丰富,几乎所有传感器都支持
缺点
- 通信速率有限(标准模式 100 kbps,高速模式 3.4 Mbps)
- 总线电容和上拉电阻影响信号质量
- 仲裁和时钟同步机制使得实现稍复杂
常见应用场景
- 温湿度传感器、加速度计
- EEPROM 存储器
- 低速配置类寄存器访问
I2C 实战代码示例(读取寄存器)
- uint8_t reg =0x0F;// WHO_AM_I 寄存器
- uint8_t val;
-
- // 写寄存器地址
- HAL_I2C_Master_Transmit(&hi2c1, DEVICE_ADDR<<1,®,1, HAL_MAX_DELAY);
-
- // 读寄存器数据
- HAL_I2C_Master_Receive(&hi2c1, DEVICE_ADDR<<1,&val,1, HAL_MAX_DELAY);
四、三者对比表
| 特性 | UART | SPI | I2C |
|---|
| 引脚数 | 2 | ≥4 | 2 |
| 通信模式 | 点对点 | 主从,多从机 | 主从,多从机 |
| 速率 | kbps~Mbps | 高速,常达数十 Mbps | 100 kbps~3.4 Mbps |
| 复杂度 | 简单 | 中等,需要协议约定 | 较复杂,标准协议 |
| 常见应用 | 调试、模块通信 | Flash、显示屏、ADC | 传感器、配置类设备 |
五、如何选择?
- 调试/模块通信:选 UART
- 高速数据传输(屏幕、存储器、ADC):选 SPI
- 多传感器、低速配置:选 I2C
经验法则:
- MCU 引脚紧张 → I2C
- 对速率要求高 → SPI
- 仅单模块通信 → UART
总结
UART、SPI、I2C 没有绝对的好坏,只有是否适合你的项目:
- UART:简单直接,适合点对点通信
- SPI:高速稳定,但占用引脚较多
- I2C:节省资源,适合挂载多个外设
掌握三者的差异与使用场景,就能在设计系统时更加灵活,避免返工,提高效率。
打开APP阅读更多精彩内容