在嵌入式开发中,设备之间的通信是绕不开的话题。常见的三种总线接口——UART、SPI、I2C—— 各有优缺点。不同项目需求决定了选择哪一种协议最合适。本文结合实战经验,逐项对比三者,并附带实战代码,帮助你快速做出判断。
一、UART(通用异步收发器)
工作方式:点对点通信,使用 TX/RX 两根数据线(加上 GND)。
优点
- 实现简单,硬件资源少
- 常用于调试、日志打印、模块通信(如 GPS、蓝牙模块)
- 波特率可调,支持从几百 bps 到几 Mbps
缺点
- 只能点对点,无法挂多个设备
- 没有统一的时钟,容易受波特率误差影响
常见应用场景
- 串口调试
- 与 GSM、WiFi、GPS 模块通信
- 简单传感器数据读取
UART 实战代码示例(STM32 HAL)
- // 初始化 UART,波特率 115200
- HAL_UART_Init(&huart1);
- // 发送字符串
- charmsg[]="Hello UART!\r\n";
- HAL_UART_Transmit(&huart1,(uint8_t*)msg,strlen(msg),HAL_MAX_DELAY);
- // 接收数据(阻塞模式)
- uint8_trx;
- HAL_UART_Receive(&huart1,&rx,1,1000);
二、SPI(串行外设接口)
工作方式:主从模式,通常需要 4 根线(MOSI、MISO、SCLK、CS),多从机时可增加片选线。
优点
- 全双工,速度快,常见速率可达 10 Mbps 以上
- 协议简单,延迟低
- 可连接多个从设备(通过片选信号)
缺点
- 需要的 IO 口较多
- 多从机设计时,布线复杂
- 没有标准化的帧结构,需要自定义协议
常见应用场景
- 连接 Flash、SD 卡
- LCD 显示屏驱动
- 高速传感器数据采集
SPI 实战代码示例(读取 Flash ID)
- uint8_ttx=0x9F;// Flash 读 ID 指令
- uint8_trx[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 设计
- 硬件生态丰富,几乎所有传感器都支持
缺点
常见应用场景
I2C 实战代码示例(读取寄存器)
- uint8_treg=0x0F;// WHO_AM_I 寄存器
- uint8_tval;
- // 写寄存器地址
- 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:节省资源,适合挂载多个外设
掌握三者的差异与使用场景,就能在设计系统时更加灵活,避免返工,提高效率。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
SPI
+关注
关注
17文章
1866浏览量
99791 -
I2C
+关注
关注
28文章
1547浏览量
130474 -
uart
+关注
关注
22文章
1304浏览量
106098
发布评论请先 登录
相关推荐
热点推荐
SPI,UART,I2C区别与特点
本内容详细介绍了SPI,UART,I2C区别与特点,SPI:高速同步串行口。3~4线接口,收发独立、可同步进行,UART:通用异步串行口。按
发表于 02-02 16:15
•6882次阅读
MAX3107 SPI/I2C UART,提供128字FIF
MAX3107 SPI/I2C UART,提供128字FIFO和内部振荡器
概述
The MAX3107 is an advanced universal asynchronous receiver-transmitter
发表于 01-15 15:16
•2178次阅读
spi与i2c总线协议的对比分析
通信协议非常适合近距离低速芯片间通信。Philips(for I2C)和Motorola(for SPI) 出于不同背景和市场需求制定了这两种标准通信协议。
发表于 12-06 11:57
•3350次阅读
UART和SPI及I2C接口的详解解释资料说明
做单片机开发时UART,SPI和I2C都是我们最经常使用到的硬件接口,我收集了相关的具体材料对这三种接口进行了详细的解释。
发表于 05-15 18:09
•7次下载
一文搞懂UART、I2C、SPI协议
UART、I2C、SPI都是常见的低速板级通信协议,目前主流的SoC都内置了这些通讯协议的控制器,同样,各种传感器、Touch控制器、指纹模块、蓝牙模块、WIFI模块也都兼容这三种通信方式的一种或几种。
I2C与SPI与UART:如何布局这些通用总线
如果您要为项目构建开发板或使用通用MCU,则会发现许多用于通信其他活动组件的协议。USB和以太网之类的标准已内置在大多数控制器中,用于与计算机外围设备一起使用。尽管如此,仍使用I2C,SPI

UART、SPI、I2C 实战对比:哪个更适合你的项目?
评论