关于SPI通信的详细解释

介绍

 SPI(Serial Peripheral Interface)是由Motorola公司开发的一种通用数据总线

 四根通信线:SCK(Serial Clock)、MOSI(Master Output Slave Input)、MISO(Master Input Slave Output)、SS(Slave Select)

 同步,全双工

 支持总线挂载多设备(一主多从)

SPI相较于I2C的优缺点

相较于I2C协议,SPI具备更高的传输速率,且协议本身未对最大通信速率做出严格限制,可适配高速数据传输场景。其次,SPI协议架构简洁,功能实现相对精简,未包含复杂的总线仲裁、地址应答等机制,便于理解与工程实现。但与此同时,SPI需占用更多通信信号线,硬件资源开销显著高于I2C;且在全双工工作模式下,收发数据通常同步进行,易出现总线带宽与硬件资源的闲置浪费,总线利用率有待优化。

硬件电路

所有SPI设备的SCK、MOSI、MISO分别连在一起

主机另外引出多条SS控制线,分别接到各从机的SS引脚

 输出引脚配置为推挽输出,输入引脚配置为浮空或上拉输入

SCK的意思是串行时钟线

MOSI意思是主机输出从机输入

MISO意思是主机输入从机输出

SS用于选中对应的从设备,这些是SPI的典型引脚。

SPI时序基本单元

起始条件:SS从高电平切换到低电平

终止条件:SS从低电平切换到高电平

SCK用于提供同步时钟信号,数据位的输出与采样均在SCK的上升沿或下降沿触发,可精确定位数据收发时序,其功能等效于I2C总线中的SCL。全双工通信指数据发送与接收通路相互独立、互不干扰,MOSI与MISO分别承担主机发送、从机接收及主机接收、从机发送的单向传输任务,两条线路共同承担与I2C中SDA线类似的数据传输功能。SS为从机片选信号,用于寻址指定通信对象;总线可支持多个从机,通常每个从机对应独立的SS引脚,通信时将目标从机的SS置为低电平以完成设备选中。

移位示意图

SPI时序基本单元

交换一个字节(模式1)

 CPOL=0:空闲状态时,SCK为低电平

 CPHA=1:SCK第一个边沿移出数据,第二个边沿移入数据

顺序:SS>SCK>MOSI\MISO

CPHA 表示的是时钟相位,决定的是第一个时钟采样移入还是第二个时钟采用移入,并不是规定上升沿采样还是下降沿采样的,比如模式零的时候是SCK上升沿采样移入,模式一的时候是SCK下降沿采样移入。

在SPI模式1下进行单字节数据传输的过程如下:

在SCK的第一个上升沿,主机与从机同步移出待发送数据:主机通过MOSI引脚输出数据最高位B7,从机通过MISO引脚输出自身数据最高位B7。随后SCK产生下降沿,主机与从机同步对数据进行采样;此时主机移出的B7位移入从机移位寄存器最低位,从机移出的B7位移入主机移位寄存器最低位,完成一位数据的传输。后续时钟周期重复上述移位与采样过程,直至完成全部8位数据传输。 传输结束后,片选信号SS置为高电平,此时主机可停止驱动MOSI,而从机需将MISO置为高阻态。若主机对应引脚配置为上拉输入,则MISO默认保持高电平;若配置为浮空输入,则引脚电平处于不确定状态。如需连续传输下一字节,可保持SS有效,重复上述移位与采样流程即可。

发送指令

向SS指定的设备,发送指令(0x06)

指定地址写

向SS指定的设备发送写指令(0x02)

随后在指定地址下,写入指定数据

SPI的应用

W25Q64简介

 W25Qxx系列是一种低成本、小型化、使用简单的非易失性存储器,常应用于数据存储、字库存储、固件程序存储等场景

 存储介质:Nor Flash(闪存)

 时钟频率:80MHz / 160MHz (Dual SPI) / 320MHz (Quad SPI)

 存储容量(24位地址):

  W25Q40:4Mbit / 512KByte

  W25Q80:8Mbit / 1MByte

  W25Q16:16Mbit / 2MByte

  W25Q32:32Mbit / 4MByte

  W25Q64:64Mbit / 8MByte

  W25Q128:128Mbit / 16MByte

  W25Q256:256Mbit / 32MByte

应用:如果我们想在OLED屏幕上显示汉字,就得把汉字的点阵数据存起来,当只要少量汉字时,可以直接把字库存在M32的内部,如果汉字比较多,就需要将汉字存在这个芯片中,在显示某个汉字前先读取芯片,查询字库,然后再在显示屏上显示数据,这样就能任意显示中文了。固件存储是把我们要运行的程序存储到这个芯片中,然后要学习的时候直接读取这个外挂芯片的程序文件。

注:时钟频率是80的1,2,4倍

Flash操作注意事项

写入操作时:

写入操作前,必须先进行写使能

 每个数据位只能由1改写为0,不能由0改写为1

 写入数据前必须先擦除,擦除后,所有数据位变为1

 擦除必须按最小擦除单元进行

 连续写入多字节时,最多写入一页的数据,超过页尾位置的数据,会回到页首覆盖写入

 写入操作结束后,芯片进入忙状态,不响应新的读写操作

读取操作时:

 直接调用读取时序,无需使能,无需额外操作,没有页的限制,读取操作结束后不会进入忙状态,但不能在忙状态时读取

第二行的意思是新数据不能直接覆盖原数据

注:由于状态寄存器1,在写使能后进行写入后会自动写失能,故每次写入后要重新写使能

指令集

这两张表是 W25Qxx 系列 Flash 的 SPI 指令集,定义了主机(如 STM32)如何通过 SPI 命令与 Flash 交互。下面按 “常用度” 给你拆解,重点标了开发中最核心的几条指令。

一、基础控制类指令(开发必用)

表格

指令名称

指令码

功能说明

核心作用

Write Enable

06h

写使能

Flash 默认处于写保护状态,执行写、擦除操作前,必须先发送这条指令,否则操作会被忽略。

Write Disable

04h

写禁止

关闭写使能,防止误写,一般不常用。

Read Status Register-1

05h

读状态寄存器 1

读取 Flash 的状态位,最关键的是BUSY 位(S0):• BUSY=1:芯片正在忙(写 / 擦除中),不能接收新指令• BUSY=0:芯片空闲,可执行新操作

Sector Erase (4KB)

20h

扇区擦除

擦除一个 4KB 的扇区,擦除后该扇区所有位变为1写入数据前必须先擦除对应扇区,因为 Flash 只能把1改写为0,不能反向改写。

Page Program

02h

页编程(写入)

以 “页” 为单位写入数据,W25Q64 的页大小通常为 256 字节。・写入时需先发送 3 字节地址(A23-A0),再发送数据・单页内可连续写入,但不能跨页写入,否则会在页首自动覆盖数据

Read Data

03h

读取数据

以字节为单位读取 Flash 数据,发送指令码后,发送 3 字节地址,随后 Flash 会持续输出数据,直到片选取消。

二、其他常用指令(了解即可)

表格

指令名称

指令码

功能说明

Block Erase (32KB/64KB)

52h/D8h

块擦除,擦除 32KB 或 64KB 的大块区域,效率比扇区擦除更高,适合批量擦除

Chip Erase

C7h/60h

整片擦除,擦除整个 Flash 的所有数据,耗时较长(数秒)

Read Status Register-2

35h

读状态寄存器 2,用于获取更多状态位(如 Quad SPI 模式相关配置)

JEDEC ID

9Fh

读取设备 ID,返回厂商 ID、设备型号、容量信息,可用于识别芯片是否正常连接

Power-down / Release Power-down

B9h/ABh

低功耗控制,进入 / 退出掉电模式,降低功耗

三、指令的执行流程(以 “写数据” 为例)

Flash 的写操作必须遵循固定流程,否则会失败:

  1. 发送写使能指令 06h
  2. 发送扇区擦除指令 20h,并指定要擦除的扇区地址
  3. 循环读取状态寄存器 05h,直到BUSY=0(擦除完成)
  4. 再次发送写使能指令 06h
  5. 发送页编程指令 02h,并指定写入地址和数据
  6. 再次循环读取状态寄存器 05h,直到BUSY=0(写入完成)

读取操作则简单得多:直接发送读指令 03h + 3 字节地址,Flash 就会输出数据,无需写使能,也没有忙等待(只要芯片不处于写 / 擦除忙状态即可)。

四、读指令表的关键信息

Read Data 指令为例,表格中的每一列含义如下:

  • BYTE 1 (CODE):指令码,主机发送的第一个字节,告诉 Flash 要执行什么操作。
  • BYTE 2-4:地址段,A23-A16A15-A8A7-A0,合起来是 24 位地址,可寻址 W25Q64 的 8MB 空间。
  • BYTE 5 及以后:数据段,主机发送的数据(写指令)或 Flash 返回的数据(读指令)。

如果你需要,我可以帮你整理一份W25Q64 读写操作的完整 C 语言代码框架,直接基于这些指令实现扇区擦除、页写入和数据读取功能。

硬件SPI

SPI外设简介

STM32内部集成了硬件SPI收发电路,可以由硬件自动执行时钟生成、数据收发等功能,减轻CPU的负担

 可配置8位/16位数据帧、高位先行/低位先行

 时钟频率:f<sub>PCLK</sub> / (2, 4, 8, 16, 32, 64, 128, 256)

 支持多主机模型、主或从操作

 可精简为半双工/单工通信

 支持DMA

 兼容I2S协议

 STM32F103C8T6 硬件SPI资源:SPI1、SPI2

时钟频率:一个SCK时钟交换一个bit,所以时钟频率体现传输速度,PCLK就是外设时钟

SPI1挂载在APB2,PCLK是72M,SPI2挂载在APB1,PCLK是36M

半双工:一条线有时发有时收;单工:只发或只收

SPI、I²C 与 USART 的收发通路架构差异分析

在串行通信协议中,双工模式同步 / 异步机制是决定收发通路硬件实现方式的核心因素,其直接影响了数据寄存器与移位寄存器的分离 / 复用设计,具体差异如下:

1. SPI(同步全双工)通信架构

SPI 为同步全双工协议,发送与接收可在同一时钟周期内同时进行:

  • 数据寄存器:发送数据寄存器(TDR)与接收数据寄存器(RDR)相互独立,分别作为 CPU 访问的发送缓冲与接收缓冲。
  • 移位寄存器:收发通路可共用移位寄存器,在 SCK 时钟的驱动下,数据位在移出 MOSI 引脚的同时,外部数据位同步移入 MISO 引脚,实现单一时钟边沿下的双向数据交换。

2. I²C(同步半双工)通信架构

I²C 为同步半双工协议,发送与接收分时复用总线,同一时刻仅支持单向数据传输:

  • 数据寄存器:发送与接收可共用同一数据寄存器,在发送阶段写入数据,接收阶段读取数据。
  • 移位寄存器:收发通路可共用移位寄存器,发送时将数据移出至 SDA 线,接收时从 SDA 线移入数据,通过方向切换实现分时复用。

3. USART(异步全双工)通信架构

USART 为异步全双工协议,发送与接收拥有独立的波特率时钟,可异步并行工作:

  • 数据寄存器:发送数据寄存器(TDR)与接收数据寄存器(RDR)相互独立,为 CPU 提供分离的读写接口。
  • 移位寄存器:发送移位寄存器与接收移位寄存器完全独立,分别由各自的波特率发生器驱动,实现发送与接收时序的异步同步,保障双向数据传输的独立性与可靠性。

核心规律总结

表格

协议类型双工模式同步 / 异步数据寄存器移位寄存器
SPI全双工同步分离复用
I²C半双工同步复用复用
USART全双工异步分离分离
  • 全双工协议:无论同步 / 异步,收发数据寄存器均需分离,以支持 CPU 同时发起读写操作。
  • 同步协议:收发通路共享同一时钟,移位寄存器可复用,实现单一时钟边沿下的双向数据交换。
  • 异步协议:收发通路拥有独立时钟,移位寄存器必须分离,以适配异步采样与发送时序。

右下角配置寄存器中,第1位用于设定数据传输顺序(高位先行或低位先行);第2位为SPI外设使能位;第3至第5位用于配置串行时钟频率;第6位为主从模式选择位,置1时为主模式,置0时为从模式;其余两位则用于配置SPI四种工作模式。上方状态寄存器SR的最低两位中,TXE标志位表示发送寄存器为空,RXNE标志位表示接收寄存器非空,在数据收发过程中需重点监测。控制寄存器CR2等主要用于相关功能使能配置。

SPI 外设硬件架构与全双工数据交换机制解析

该图展示了 SPI 外设的内部硬件结构,其核心为全双工同步收发架构,通过波特率发生器、数据控制器、移位寄存器与双缓冲寄存器的协同工作,实现主机与从机间的同步串行数据交换。

各模块功能与工作机制如下:

一、核心模块功能解析

1. 波特率发生器

波特率发生器是 SPI 通信的时序基准单元,由系统总线时钟分频生成固定频率的同步时钟信号(SCK),并通过复用 GPIO 引脚输出至外部总线,为收发双方提供统一的同步节拍,确保数据采样与移位的时序一致性。

2. 数据控制器

数据控制器为 SPI 外设的核心控制单元,负责协调移位寄存器、缓冲寄存器与状态标志的工作流程,控制数据的加载、移位与存储过程,实现收发通路的同步管理,保障全双工数据交换的有序执行。

3. 双缓冲寄存器与移位寄存器

SPI 外设采用双缓冲 + 移位寄存器的架构实现数据收发,该结构可实现连续数据流传输:

  • 发送通路:发送数据寄存器(TDR)作为 CPU 可直接访问的发送缓冲,待发送数据由 TDR 加载至移位寄存器后,移位寄存器在 SCK 时钟的驱动下,按高位先行规则将数据逐位移出,经 GPIO 复用引脚输出至 MOSI 线。当 TDR 中的数据全部加载至移位寄存器时,硬件自动置位发送缓冲器空标志(TXE),指示 CPU 可写入下一个待发送数据。
  • 接收通路:外部设备发送的数据通过 MISO 线经 GPIO 复用引脚输入,在 SCK 时钟的同步下逐位移入移位寄存器;完成一个字节的接收后,移位寄存器中的并行数据自动加载至接收数据寄存器(RDR),同时硬件置位接收缓冲器非空标志(RXNE),指示 CPU 可读取已接收数据。该标志无需软件手动清除,CPU 读取 RDR 后硬件自动清除该标志。

4. 外设使能控制

框图右下角的 “开关控制” 对应 SPI 外设的使能逻辑,通过配置控制寄存器中的使能位实现。在完成时钟、数据格式、引脚复用等基础配置后,软件置位该使能位,即可启动 SPI 外设的收发功能,开启同步串行通信。

二、数据交换时序机制

SPI 通信采用同步全双工数据交换模式,数据在 SCK 时钟的边沿驱动下完成收发:

  • 主机 / 从机在SCK 时钟的下降沿将数据位从移位寄存器移出,通过 MOSI 引脚输出至外部总线;
  • 同时,外部设备发送的数据在SCK 时钟的上升沿被采样,通过 MISO 引脚移入移位寄存器。

该过程循环执行 8 次后,完成一个字节数据的双向交换,实现主机与从机间的同步数据交互。

三、连续数据传输保障机制

TDR 与 RDR 的双缓冲设计是 SPI 外设实现连续数据流传输的关键:

  • 当移位寄存器正在发送当前字节时,CPU 可提前将下一个待发送数据写入 TDR,待移位寄存器数据发送完成后,TDR 中的数据可立即加载至移位寄存器,实现无缝衔接;
  • 同理,当移位寄存器正在接收当前字节时,CPU 可读取 RDR 中已接收的上一个字节数据,避免数据溢出丢失,保障全双工通信的连续性与可靠性。

(注:本文是学习笔记,素材来源于b站up江协科技)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值