找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

1352

积分

0

好友

189

主题
发表于 6 天前 | 查看: 22| 回复: 0

电子设备之间的通信如同人类对话,双方需要使用共同的语言。在嵌入式系统和微控制器领域,这些“语言”就是通信协议。本文将深入对比三种最常用的串行通信协议:SPI、UART和I2C,解析它们的工作原理、特点及典型应用场景,帮助开发者在项目中做出合适的选择。

串行通信与并行通信

电子设备通过发送数据位(Bit)来实现信息交换。位是二进制的基本单位,其值只能是0或1。在典型的5V系统中,逻辑“0”通常由0V的短脉冲表示,而逻辑“1”则由5V的短脉冲表示。这些数据位可以通过并行串行的方式进行传输。

在并行通信中,数据的各个位通过多根导线同时传输。下图展示了字母“C”的ASCII码二进制形式(01000011)的并行传输过程:
并行通信示意图

而在串行通信中,数据位通过单根导线一位接一位地顺序发送。下图展示了同一数据的串行传输过程:
串行通信示意图

串行通信虽然速度相对较慢,但其布线简单、成本低廉,成为芯片间和设备间短距离通信的主流方式。SPI、UART和I2C均属于串行通信协议。理解这些通信协议的基础,有助于我们更好地进行网络与系统编程

SPI通信协议详解

SPI(Serial Peripheral Interface)是一种高速、全双工的同步通信协议,由摩托罗拉公司开发。其最大特点是允许数据连续传输而无需中断,可以发送或接收任意数量的位,这与以数据包形式传输的I2C和UART不同。

在SPI系统中,设备分为主设备(Master)和从设备(Slave)。主设备(通常是微控制器)控制通信的发起和时钟,而从设备(如传感器、存储芯片)接收指令并响应。
SPI主从设备连接示意图

一套完整的SPI通信需要四根信号线:

  • MOSI (Master Output Slave Input):主设备输出,从设备输入的数据线。
  • MISO (Master Input Slave Output):主设备输入,从设备输出的数据线。
  • SCLK (Serial Clock):由主设备产生的时钟信号线。
  • SS/CS (Slave Select / Chip Select):片选信号线,由主设备控制,用于选择特定的从设备。

SPI协议核心特点

  1. 同步通信:SPI属于同步协议,通信双方在同一个时钟信号(SCLK)下工作,数据传输速率取决于时钟频率。时钟由主设备产生,因此通信始终由主设备发起。
  2. 片选机制:主设备通过将目标从设备的CS线拉至低电平来激活通信。一个主设备可以通过多个CS引脚连接多个从设备。
    SPI单主多从连接方式1
    如果主设备只有一个CS引脚,可以采用菊花链方式连接多个从设备:
    SPI单主多从连接方式2-菊花链
  3. 全双工传输:主设备通过MOSI线发送数据给从机的同时,从机也可以通过MISO线向主机发送数据,实现同时收发。

SPI数据传输步骤

  1. 主设备产生时钟信号(SCLK)。
    步骤1:产生时钟
  2. 主设备拉低目标从设备的SS/CS引脚,选中该从设备。
    步骤2:片选使能
  3. 主设备通过MOSI线逐位发送数据给从设备。
    步骤3:主机发送数据
  4. 从设备通过MISO线逐位将响应数据返回给主设备。
    步骤4:从机回复数据

SPI优缺点总结

  • 优点
    • 传输速率高(通常比I2C快)。
    • 支持全双工连续传输,无数据包开销。
    • 协议简单,硬件实现容易。
  • 缺点
    • 需要4根线,布线占用资源较多。
    • 没有硬件级的应答机制来确认数据是否被成功接收。
    • 不支持多主设备系统。
    • 从设备数量增加会受总线负载电容限制。

UART通信协议详解

UART(Universal Asynchronous Receiver/Transmitter,通用异步收发器)严格来说不是一种通信协议,而是一种物理电路(常内置于微控制器中)或独立IC。它负责实现异步串行通信,最大的优势是仅需两根线(Tx和Rx)即可完成数据交换。

在UART通信中,两个UART设备直接对等连接。发送方将来自CPU的并行数据转换为串行格式,通过Tx引脚发出;接收方通过Rx引脚接收串行数据,再转换回并行格式交给CPU处理。
UART点对点连接示意图

UART是异步通信,没有时钟信号。为了协调收发时序,它在数据包中添加了起始位和停止位来界定数据帧,并依赖双方预先约定好的波特率(Baud Rate)(如9600 bps, 115200 bps)来同步采样。

UART数据帧结构
一个完整的UART数据帧包含以下部分:
UART数据帧结构图

  • 起始位:通信开始时,Tx线从高电平(空闲状态)被拉低一个位时间,标志着数据帧的开始。
  • 数据帧:有效载荷,通常是8位数据(一个字节)。
  • 奇偶校验位(可选):用于简单的错误检测,检查数据位中“1”的个数是奇数还是偶数。
  • 停止位:通常为1或2个位时间的高电平,标志数据帧结束。

UART数据传输步骤

  1. 发送UART从数据总线获取并行数据。
    步骤1:并行数据输入
  2. 发送UART生成并添加起始位、奇偶校验位和停止位,组成完整数据包。
    步骤2:组帧
  3. 数据包从Tx引脚串行发出。接收UART在检测到起始位后,以约定的波特率对Rx线进行采样。
    步骤3:串行发送与采样
  4. 接收UART丢弃起始位、校验位和停止位。
    步骤4:去除帧头帧尾
  5. 接收UART将串行数据转换为并行数据,送至接收端数据总线。
    步骤5:并行数据输出

UART优缺点总结

  • 优点
    • 仅需两根线,硬件连接简单。
    • 无需时钟信号,依靠波特率同步。
    • 数据帧结构可配置(数据位、停止位、校验位),灵活性高。
    • 应用极其广泛,是调试和PC通信的常用接口。
  • 缺点
    • 标准帧大小通常只有8位数据。
    • 不支持多主机或多从机系统,只能点对点。
    • 双方波特率必须严格匹配(误差通常需在10%以内)。

异步通信的时序概念是理解UART和许多其他网络协议的基础。

I2C通信协议详解

I2C(Inter-Integrated Circuit)是由飞利浦公司开发的一种双向、半双工、同步串行总线。它结合了SPI和UART的部分优点:仅使用两根线(SDA-数据线和SCL-时钟线),却能支持多主多从的拓扑结构,非常适合连接多个低速外设。
I2C总线示意图

I2C工作原理
I2C通信以消息(Message)为单位,每个消息包含:

  • 起始条件(S):当SCL为高时,SDA从高到低的跳变。
  • 从设备地址帧:7位或10位的唯一地址,用于寻址目标从设备。
  • 读/写位:指示主设备是要写入(0)还是读取(1)数据。
  • 应答位(ACK/NACK):接收方在每个地址或数据帧后返回的确认信号(ACK为低电平)。
  • 数据帧:8位的数据块。
  • 停止条件(P):当SCL为高时,SDA从低到高的跳变。
    I2C消息格式图

I2C寻址与传输
I2C没有片选线,而是通过软件寻址。主设备在通信开始时先广播目标从设备的地址。总线上所有从设备都会将接收到的地址与自身地址比较,只有地址匹配的从设备会拉低SDA线(发送ACK)作出响应,继而参与后续通信。
I2C寻址过程

I2C总线拓扑

  • 单主多从:这是最常见的模式。总线上需要为SDA和SCL线各接一个上拉电阻(通常为4.7kΩ)。
    I2C单主多从连接
  • 多主多从:I2C支持多主机,通过总线仲裁机制防止数据冲突。连接方式类似,同样需要上拉电阻。
    I2C多主多从连接

I2C优缺点总结

  • 优点
    • 仅需两根线(SDA, SCL),节省引脚和布线。
    • 支持多主设备和多从设备系统。
    • 具有硬件应答机制(ACK),通信更可靠。
    • 拥有成熟的规范和广泛的支持。
  • 缺点
    • 通信速率通常低于SPI(标准模式100kbps,快速模式400kbps)。
    • 数据帧固定为8位。
    • 协议比SPI复杂,软件开销稍大。
    • 总线电容会限制挂载设备数量和通信速度。

总结与选型建议

特性 SPI UART I2C
通信类型 同步 异步 同步
线数 4根 (SCLK, MOSI, MISO, CS) 2根 (TX, RX) 2根 (SDA, SCL)
最大传输速率 高 (可达数十Mbps) 中等 (通常<1Mbps) 中低 (标准100kbps, 快速400kbps)
拓扑结构 单主多从 点对点 多主多从
寻址方式 硬件片选 (CS) 无 (点对点) 软件地址 (7/10 bit)
全双工 支持 支持 (需两对TX/RX) 半双工
错误检查 奇偶校验位 (可选) 应答位 (ACK)

如何选择?

  • 选择SPI:当需要高速数据传输(如存储器、高分辨率ADC/DAC、显示屏),且引脚资源充裕、系统结构简单(单主机)时。
  • 选择UART:当进行简单、可靠的点对点通信(如微控制器与电脑串口调试、GPS模块通信),或作为设备调试端口时。它也是许多嵌入式开发项目中与上位机通信的首选。
  • 选择I2C:当引脚资源紧张,需要连接多个低速外设(如传感器、EEPROM、RTC时钟芯片),且对速率要求不高时。

理解这三种基础通信协议的差异,是进行嵌入式系统设计和外设驱动开发的关键一步。在实际项目中,应根据速度、复杂性、引脚数量和系统架构等因素综合考量,选择最合适的通信方式。




上一篇:DeepSeek模型性能体验分析:多轮对话幻觉与风格退化问题探讨
下一篇:Facebook Messenger Kids漏洞分析:利用GraphQL业务逻辑缺陷绕过消息限制
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2025-12-24 17:17 , Processed in 0.170670 second(s), 40 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2025 云栈社区.

快速回复 返回顶部 返回列表