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 北京

相关推荐

点赞 评论 收藏
分享
这几天在小看一下&nbsp;Freertos&nbsp;,了解了内存管理、任务调度、同步互斥、队列及信号量的一些小玩意,写一下小总结:在内存管理方面,Freertos&nbsp;感觉就是比较灵活,有五种内存分配。每种策略都有不一样的适配场景,像&nbsp;heap_1&nbsp;适用于不需要内存释放的简单应用,能在资源受限的小型嵌入式设备中稳定运行;heap_5&nbsp;则支持动态内存分配,可以管理多个不连续的内存块,对于内存需求复杂多变的系统就比较适用。​任务调度机制是&nbsp;Freertos&nbsp;实现多任务高效运行的关键。其中,时间片轮转调度模式按照固定的时间片长度,让处于同一优先级的多个任务轮流获得&nbsp;CPU&nbsp;,避免了某一任务长期占用资源的情况;而优先级抢占调度模式则相当于给高优先级任务开小门,当高优先级任务就绪时,能立即打断当前正在执行的低优先级任务,抢&nbsp;CPU&nbsp;资源,这种机制保障了系统对紧急事件的快速响应。​同步互斥机制中,就是信号量和互斥锁嘛。信号量本质上是一个具有计数功能的内核对象,它可以用来表示可用资源的数量,信号量还分为二进制和技术型信号量,当多个任务需要访问有限的共享资源时,信号量能有效控制任务的访问顺序和数量,防止资源竞争导致的错误。今天做了个小实验就是小车通行证的,我这里就不多说了,这个方法比较好理解。互斥锁是专门针对优先级反转问题设计,当低优先级任务有着高优先级任务所需要的资源时,互斥锁会将低优先级任务的优先级临时提升至与高优先级任务相同,等到资源释放后再恢复原优先级,这样就可以避免高优先级任务因为等待低优先级任务而被延误的情况,确保了系统的优先级秩序和实时性能。​队列是&nbsp;Freertos&nbsp;中任务间通信的东西。它采用先进先出(FIFO)的默认数据处理方式,同时也支持按消息优先级进行排序,满足了不同场景下的数据传递需求。队列可以传递各种类型的数据,不管是简单的整型变量、字符,还是复杂的结构体、指针,都能通过队列在任务间安全、可靠地传递。而且,队列具有异步通信的特点,发送任务和接收任务无需同步等待,发送任务将数据放入队列后即可继续执行其他操作,接收任务在需要时从队列中获取数据,这种特性可以提高了任务间协作的灵活性。​信号量在同步互斥中除了作为资源计数器,还能用于任务间的同步。比如说,在中断服务程序中,当某个事件发生后,可通过释放信号量的方式通知等待该事件的任务,任务在获取到信号量后就知道事件已发生,从而执行相应的处理操作(这里举例就是占厕所,a上厕所,b就上不了,a上完释放信号量厕所可以上了,b去上),实现了中断与任务、任务与任务之间的有效同步。​
点赞 评论 收藏
分享
评论
3
3
分享

创作者周榜

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