SPI通信协议详解

SPI(Serial Peripheral Interface,串行外设接口)是一种高速、全双工、同步的串行通信协议,由摩托罗拉(Motorola)公司开发,广泛应用于短距离设备间通信(如微控制器与传感器、EEPROM、显示屏等外设的连接)。其核心特点是通过少数几根线实现高速数据传输,结构简单且灵活。

一、SPI 协议的基本结构

SPI 通信涉及一个主设备(Master) 和一个或多个从设备(Slave),采用 “主从模式” 工作(主设备主动发起通信,从设备被动响应)。

核心信号线包括 4 根(部分场景可简化):

SCK

Serial Clock

串行时钟线,由主设备产生,用于同步主从设备的数据传输节奏(决定通信速率)。

MOSI

Master Out Slave In

主设备输出、从设备输入线,主设备通过此线向从设备发送数据。

MISO

Master In Slave Out

主设备输入、从设备输出线,从设备通过此线向主设备返回数据。

SS/CS

Slave Select/Chip Select

从设备选择线(低电平有效),主设备通过拉低某从设备的 SS 线选中该设备进行通信(多从设备时必备)。

二、SPI 通信的核心原理

1. 同步通信机制

SPI 是同步通信,数据传输由主设备产生的 SCK 时钟信号同步:

  • 主设备控制 SCK 的频率(通常可配置,如 1MHz~100MHz),决定通信速度。
  • 数据在 SCK 的特定边沿(上升沿或下降沿)被采样或发送,主从设备需约定一致的时钟极性和相位(见下文 “时序模式”)。

2. 全双工数据传输

SPI 支持全双工通信,主从设备可同时发送和接收数据:

  • 数据通过 MOSI 和 MISO 线同时传输,传输单位为 “字节(8 位)” 或 “位(可自定义)”。
  • 传输过程类似 “移位寄存器”:主设备发送 1 位数据到 MOSI 的同时,从设备通过 MISO 返回 1 位数据,8 个时钟周期后完成 1 字节的双向传输。

3. 从设备选择(SS/CS 线的作用)

  • 当系统存在多个从设备时,每个从设备都有独立的 SS 线,主设备通过拉低目标从设备的 SS 线(置为低电平)选中它,未被选中的从设备 SS 线为高电平,不响应通信。
  • 若只有一个从设备,SS 线可固定接低电平(简化电路)。

三、SPI 的时序模式(时钟极性与相位)

SPI 的时序由时钟极性(CPOL) 和时钟相位(CPHA) 定义,共 4 种组合(称为 SPI 模式),主从设备必须使用相同的模式才能正常通信。

0

0

0

SCK 空闲时为低电平(0),数据在 SCK 的上升沿采样,下降沿发送。

1

0

1

SCK 空闲时为低电平(0),数据在 SCK 的下降沿采样,上升沿发送。

2

1

0

SCK 空闲时为高电平(1),数据在 SCK 的下降沿采样,上升沿发送。

3

1

1

SCK 空闲时为高电平(1),数据在 SCK 的上升沿采样,下降沿发送。

  • CPOL:定义 SCK 在空闲状态(无数据传输时)的电平(0 = 低电平,1 = 高电平)。
  • CPHA:定义数据采样的时刻(0 = 第 1 个边沿采样,1 = 第 2 个边沿采样)。

示例(模式 0 的时序)

  1. SCK 空闲时为低电平(CPOL=0)。
  2. 主设备拉低 SS 线选中从设备,启动通信。
  3. 主设备发送 SCK 时钟,在 SCK 的上升沿(从低到高)采样 MISO 上的数据(读取从设备发送的位),在下降沿(从高到低)通过 MOSI 发送数据位。
  4. 8 个时钟周期后,主设备拉高 SS 线,结束通信。

四、SPI 的通信流程(单字节传输示例)

以 “模式 0” 和 “单个从设备” 为例,流程如下:

  1. 主设备拉低从设备的 SS 线(选中设备)。
  2. 主设备产生 SCK 时钟信号,同时通过 MOSI 线逐位发送数据(如 0x55)。
  3. 从设备在 SCK 的上升沿采样 MOSI 数据,同时通过 MISO 线逐位返回数据(如 0xAA)。
  4. 8 个时钟周期后,1 字节数据传输完成,主设备和从设备分别接收到对方的数据。
  5. 主设备拉高 SS 线(结束通信),从设备退出选中状态。

五、SPI 协议的优缺点

优点:

  1. 高速传输:同步通信 + 全双工,速率远高于 I2C(通常可达几十 MHz,甚至数百 MHz)。
  2. 结构简单:无需复杂的地址机制(通过 SS 线选择从设备),协议逻辑简单,易实现。
  3. 灵活性高:支持多从设备,可自定义数据位数(不限于 8 位)和时序模式。
  4. 全双工支持:可同时收发数据,适合需要双向高速通信的场景(如显示屏、无线模块)。

缺点:

  1. 信号线较多:相比 I2C(仅 2 根线),SPI 最少需要 3 根线(无 SS 时),多从设备时需更多 SS 线,不适合长距离布线。
  2. 无硬件应答机制:协议本身没有错误检测(如奇偶校验、ACK 信号),需软件实现校验(如 CRC)。
  3. 主从模式限制:必须有主设备控制,从设备不能主动发起通信。

六、SPI 的典型应用场景

  • 短距离高速通信:如微控制器与传感器(加速度计、陀螺仪)、SD 卡、OLED 显示屏、无线模块(蓝牙、WiFi)的连接。
  • 全双工需求场景:如数据采集系统(主设备发送配置指令,同时接收传感器数据)。
  • 多从设备系统:如嵌入式主板连接多个外设(通过 SS 线独立控制)。

总结

SPI 是一种高效、灵活的同步串行通信协议,以高速全双工和简单结构为核心优势,适合短距离内主从设备的高速数据传输。理解其时序模式、信号线作用及与其他协议的差异,有助于在嵌入式开发中正确选型和实现通信功能。

更多内容全在下方专栏

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

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

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

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

#嵌入式秋招##嵌入式#
全部评论
好帖子
点赞 回复 分享
发布于 昨天 12:12 江苏
谢谢哈
点赞 回复 分享
发布于 昨天 12:12 湖北
点赞 回复 分享
发布于 昨天 12:12 上海

相关推荐

1. FreeRTOS的核心功能是什么?是一个实时操作系统内核,主要提供任务管理、时间管理、信号量、消息队列、事件组等功能,支持抢占式调度,确保实时任务的及时响应。2. 任务的状态有哪些?运行态(Running):当前正在执行的任务。就绪态(Ready):任务就绪,等待调度器分配CPU。阻塞态(Blocked):任务因等待事件(如延时、信号量)暂时无法运行。挂起态(Suspended):任务被强制暂停,需通过特定函数唤醒。3. FreeRTOS的调度算法是什么?主要采用基于优先级的抢占式调度:高优先级任务可抢占低优先级任务的CPU使用权;同优先级任务默认采用时间片轮转调度(需使能配置)。4. 什么是任务堆栈?作用是什么?每个任务有独立的堆栈,用于保存任务的上下文(寄存器值、局部变量等)。当任务被切换时,堆栈负责保存当前状态,确保下次恢复时能继续执行。5. 信号量和互斥锁的区别?信号量:用于资源计数或同步,允许多个任务同时访问有限资源(如计数信号量),或实现任务间同步(如二进制信号量)。互斥锁(Mutex):专为解决互斥问题设计,支持优先级继承机制,可避免“优先级反转”(高优先级任务因低优先级任务占用资源而等待的问题)。6. 消息队列的作用?如何实现任务间通信?消息队列是任务间传递数据的缓冲区,支持异步通信。一个任务可向队列发送消息,另一个任务从队列接收消息(可设置超时时间),数据通过拷贝方式传递,支持不同长度的数据类型。7. 什么是优先级反转?如何解决?优先级反转:低优先级任务占用资源时,中优先级任务抢占CPU,导致高优先级任务因等待资源被阻塞,优先级被“反转”。解决方式:使用互斥锁的优先级继承机制(低优先级任务暂时继承高优先级任务的优先级,避免被中优先级任务抢占)。8. 任务通知和消息队列相比,有什么优势?任务通知是轻量级通信机制,直接向任务发送事件/数据,无需创建队列,减少内存开销,效率更高(适用于一对一通信场景);但功能较简单,不支持多任务向同一队列发送消息。9. 如何实现任务的延时?vTaskDelay()和vTaskDelayUntil()的区别?vTaskDelay(t) :从调用时刻开始延时 t 个时钟节拍,延时时间是相对的(受任务调度影响)。vTaskDelayUntil() :确保任务按固定周期执行,延时到绝对时间点,适合周期性任务。10. FreeRTOS中的堆管理方案有哪些?提供5种堆内存分配方案(heap_1到heap_5),例如:heap_1:最简单,只分配不释放,适合内存固定的场景。heap_4:支持动态分配和释放,使用链表管理内存,可用于大多数场景。
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

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