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

描述

在嵌入式开发中,设备之间的通信是绕不开的话题。常见的三种总线接口—— UART、SPI、I2C —— 各有优缺点。不同项目需求决定了选择哪一种协议最合适。本文结合实战经验,逐项对比三者,并附带实战代码,帮助你快速做出判断。

 

一、UART(通用异步收发器)

工作方式:点对点通信,使用 TX/RX 两根数据线(加上 GND)。

优点

  • 实现简单,硬件资源少
  • 常用于调试、日志打印、模块通信(如 GPS、蓝牙模块)
  • 波特率可调,支持从几百 bps 到几 Mbps

缺点

  • 只能点对点,无法挂多个设备
  • 没有统一的时钟,容易受波特率误差影响

常见应用场景

  • 串口调试
  • 与 GSM、WiFi、GPS 模块通信
  • 简单传感器数据读取

 UART 实战代码示例(STM32 HAL)

  1. // 初始化 UART,波特率 115200
  2. HAL_UART_Init(&huart1);
  3.  
  4. // 发送字符串
  5. char msg[]="Hello UART!\r\n";
  6. HAL_UART_Transmit(&huart1,(uint8_t*)msg, strlen(msg), HAL_MAX_DELAY);
  7.  
  8. // 接收数据(阻塞模式)
  9. uint8_t rx;
  10. HAL_UART_Receive(&huart1,&rx,1,1000);

二、SPI(串行外设接口)

工作方式:主从模式,通常需要 4 根线(MOSI、MISO、SCLK、CS),多从机时可增加片选线。

优点

  • 全双工,速度快,常见速率可达 10 Mbps 以上
  • 协议简单,延迟低
  • 可连接多个从设备(通过片选信号)

缺点

  • 需要的 IO 口较多
  • 多从机设计时,布线复杂
  • 没有标准化的帧结构,需要自定义协议

常见应用场景

  • 连接 Flash、SD 卡
  • LCD 显示屏驱动
  • 高速传感器数据采集

 SPI 实战代码示例(读取 Flash ID)

  1. uint8_t tx =0x9F;// Flash 读 ID 指令
  2. uint8_t rx[3];// 接收 ID 数据
  3.  
  4. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);// CS 低电平
  5. HAL_SPI_Transmit(&hspi1,&tx,1, HAL_MAX_DELAY);
  6. HAL_SPI_Receive(&hspi1, rx,3, HAL_MAX_DELAY);
  7. HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);// CS 高电平

三、I2C(内部集成电路总线)

工作方式:主从架构,仅用两根线(SCL、SDA)即可挂载多个设备。

优点

  • 协议标准化,设备寻址简单(7 位或 10 位地址)
  • 占用引脚少,便于 PCB 设计
  • 硬件生态丰富,几乎所有传感器都支持

缺点

  • 通信速率有限(标准模式 100 kbps,高速模式 3.4 Mbps)
  • 总线电容和上拉电阻影响信号质量
  • 仲裁和时钟同步机制使得实现稍复杂

常见应用场景

  • 温湿度传感器、加速度计
  • EEPROM 存储器
  • 低速配置类寄存器访问

 I2C 实战代码示例(读取寄存器)

  1. uint8_t reg =0x0F;// WHO_AM_I 寄存器
  2. uint8_t val;
  3.  
  4. // 写寄存器地址
  5. HAL_I2C_Master_Transmit(&hi2c1, DEVICE_ADDR<<1,®,1, HAL_MAX_DELAY);
  6.  
  7. // 读寄存器数据
  8. HAL_I2C_Master_Receive(&hi2c1, DEVICE_ADDR<<1,&val,1, HAL_MAX_DELAY);

四、三者对比表

特性UARTSPII2C
引脚数2≥42
通信模式点对点主从,多从机主从,多从机
速率kbps~Mbps高速,常达数十 Mbps100 kbps~3.4 Mbps
复杂度简单中等,需要协议约定较复杂,标准协议
常见应用调试、模块通信Flash、显示屏、ADC传感器、配置类设备

五、如何选择?

  • 调试/模块通信:选 UART
  • 高速数据传输(屏幕、存储器、ADC):选 SPI
  • 多传感器、低速配置:选 I2C

经验法则:

  • MCU 引脚紧张 → I2C
  • 对速率要求高 → SPI
  • 仅单模块通信 → UART

总结

UART、SPI、I2C 没有绝对的好坏,只有是否适合你的项目:

  • UART:简单直接,适合点对点通信
  • SPI:高速稳定,但占用引脚较多
  • I2C:节省资源,适合挂载多个外设

掌握三者的差异与使用场景,就能在设计系统时更加灵活,避免返工,提高效率。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分