SPI和I2C的差别

SPI(Serial Peripheral Interface)和 I2C(Inter-Integrated Circuit)是两种常见的同步串行通信协议,在嵌入式系统和电子设备中广泛应用。以下是它们的核心差别对比:

一、物理层(硬件连接)

信号线数量

至少 4 根:

- SCK(时钟)

- MOSI(主发从收)

- MISO(主收从发)

- SS/CS(从设备选择,多从设备时必备)

仅 2 根:

- SDA(数据线)

- SCL(时钟线)

拓扑结构

星型拓扑:每个从设备独立连接 SS 线,主设备通过 SS 线选择目标从设备。

总线拓扑:所有设备共享 SDA 和 SCL 线,通过设备地址区分。

驱动方式

推挽输出(可主动输出高低电平),无需上拉电阻。

开漏 / 开集输出(仅能拉低电平),需外接上拉电阻(通常 4.7kΩ)到 VCC。

通信距离

短距离(通常 < 1m),高速传输时更短(受信号衰减和干扰影响)。

中短距离(通常 < 10m),速率较低时可延长(开漏结构抗干扰能力稍强)。

二、协议层(通信规则)

通信方式

全双工:主从设备可同时收发数据(通过 MOSI 和 MISO 双线传输)。

半双工:同一时刻只能单向传输(主→从或从→主),通过 SDA 线分时复用。

寻址机制

无地址概念,通过硬件 SS 线直接选择从设备(低电平有效)。

有 7 位或 10 位设备地址,主设备通过发送地址帧选择从设备。

时序模式

4 种模式(由 CPOL 和 CPHA 定义时钟极性和相位),需主从设备匹配。

固定时序:起始信号(SCL 高时 SDA 下降沿)、停止信号(SCL 高时 SDA 上升沿)。

数据单位

灵活,可自定义位数(通常 8 位 / 字节)。

固定 8 位 / 字节,每个字节后需跟随 1 位 ACK/NACK(应答位)。

错误检测

无内置机制,需软件实现校验(如 CRC)。

有 ACK/NACK 应答机制,接收方通过拉低 SDA 表示确认。

三、性能与应用场景

传输速率

高速:通常可达 10~100MHz(取决于芯片能力),适合大数据量高速传输(如 SD 卡、显示屏)。

中低速:标准模式 100kHz,快速模式 400kHz,高速模式 3.4MHz,适合传感器、EEPROM 等。

多设备支持

支持多从设备,但需额外 SS 线(每个从设备 1 根),硬件成本较高。

支持多设备(理论上 2^7=128 个 7 位地址设备),仅需 2 根线,硬件成本低。

主从关系

严格主从:从设备不能主动发起通信,必须由主设备控制。

支持多主模式:总线上可存在多个主设备,通过仲裁机制避免冲突。

典型应用

高速外设:

- SD 卡、SPI Flash

- OLED/LCD 显示屏

- 高速传感器(如摄像头)

低速多设备互联:

- 温湿度传感器(SHT30)

- 加速度计(MPU6050)

- EEPROM 存储器

四、优缺点总结

SPI

1. 高速全双工,适合大数据量传输

2. 协议简单,无复杂寻址和应答机制

3. 时序灵活(4 种模式)

1. 信号线多,硬件成本高

2. 不支持远距离通信

3. 无硬件错误检测机制,需软件实现校验

I2C

1. 仅需 2 根线,支持多设备,硬件成本低

2. 有应答机制,可靠性较高

3. 支持多主模式

1. 半双工,速率受限

2. 地址空间有限(7 位地址仅 128 个)

3. 开漏结构需上拉电阻,功耗稍高

五、选择建议

  • 选 SPI:当需要高速传输全双工通信简单直接的控制(如与 SD 卡、显示屏通信)时。
  • 选 I2C:当需要多设备共享总线中低速通信减少布线复杂度(如连接多个传感器)时。

例如:

  • 微控制器与 WiFi 模块通信(大数据量)→ SPI
  • 微控制器同时连接温度传感器、压力传感器和 EEPROM → I2C

更多内容全在下方专栏

全网最受欢迎的嵌入式笔试专栏

笔试专栏包含全部最新的笔试必考考点,非常适合在找工作面经薄弱的同学

3000+订阅还会涨价,提前订阅提前享受,持续更新中。

专栏链接:https://www.nowcoder.com/creation/manager/columnDetail/mPZ4kk

#嵌入式秋招##嵌入式#
全部评论
确实
点赞 回复 分享
发布于 07-17 11:57 山东
点赞 回复 分享
发布于 07-17 11:57 江苏
还帖子
点赞 回复 分享
发布于 07-17 11:57 北京

相关推荐

读的很难受,但是不后悔读研本身。首先说说后悔的,后悔自己选了个压榨的导师,干了一年的横向,科研没科研,技术没技术,也不知道自己研一一年在干啥,同门个个都被压榨的咬牙切齿,跟导师没一个关系好的,甚至闹到退学相逼,动手威胁的地步。再就是不后悔的,不后悔读研,自己从硬件转到软件,尽管与保研失之交臂,但是庆幸自己还是回到了自己喜欢的专业。硬件的玄学找bug我一直很讨厌,出了问题永远不知道是虚焊了还是电容坏了还是程序bug还是硬件出错。喜欢软件的逻辑性,自己能够安安稳稳地排查,哪怕自己不会也是自己蠢,而非代码自己在变。不后悔读研,研究生三年给了我喘息的机会,让我有时间考了软高证书,也考了自己心心念念的日语证书,认清了当前计算机的就业现状,认清了自己几斤几两,从而有机会去学很多开发相关的知识(而不是算法)。不后悔读研,认识了各种有能力的大佬,尤其感谢学长,不仅在为我们和导师斗争的途中指点迷津,也给我们的就业探索了很多的方向,告诉我们什么时间节点该做什么事——这是很多实验室做不到的,很多计算机实验室都缺少两代人之间交互,而我们实验室因为交接横向的缘故也有了人情积蓄,这是我们组为数不多的优点了。不后悔读研,读研&nbsp;让自己跟女友继续在同一所学校上学,实习也在同一片地区实习,虽没有进大厂,但至少生活是过的充实有趣的。路还得向前走,很难说自己能够看清未来的具体方向,但我所希望的就是:未来回头自己看我以前做的努力时,能够说一声我不后悔,我已全力以赴。而面临抉择,处在人生十字路口时,未来结果已非人力所定,至于如何,交给命吧!
你后悔自己读研吗?
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-02 18:35
简历上把1个月实习写成了3个月,会进行背调吗?
码农索隆:一个月有一个月的实习经历,三个月有三个月的实习经历
简历当中有水分算不算造假...
点赞 评论 收藏
分享
评论
2
3
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务