SPI理论知识

Tutorial: 电子电路 Category: 嵌入式 Published: 2026-10-08 01:26:37 Views: 0 Likes: 0 Comments: 0

159.12.1 SPI理论知识

本节是 SPI 与 W5500 实验的理论准备,没有编写新的业务代码,因此不在标题下强行补入代码。课程后续要把一个 STM32F10x 标准外设库的 W5500 客户端例程移植到 HAL 库工程;本节先建立信号线、主从关系、工作模式和时序的概念。

一、实验演示

实验的数据路径是:

STM32F103ZET6 → SPI → W5500 → 10/100 Mbit/s 以太网 → 网线 → 电脑网络助手

网络助手被配置成 TCP Server,STM32/W5500 一端作为 TCP Client。连接建立后,W5500 例程约每 500 ms 向电脑发送一条测试字符串,并可把电脑发来的数据回传。这里有两段完全不同的通信:

  • STM32 与 W5500 之间走板级 SPI,距离短、由 STM32 提供时钟。
  • W5500 与电脑之间走以太网和 TCP/IP,使用网线、MAC/IP 地址和端口。

不能把 W5500 简单理解为只做电平转换的“SPI 转网口插头”。W5500 芯片内部集成 10/100 Ethernet MAC、PHY、硬件 TCP/IP 协议栈、8 个硬件 Socket 和 32 KiB 收发缓冲区;STM32 通过 SPI 读写其寄存器和缓冲区。

标准库例程给出的主要连线如下:

STM32F103 引脚W5500 信号方向(以 STM32 为主机)作用
PA5SCK/SCLKSTM32 → W5500SPI 串行时钟
PA7MOSISTM32 → W5500主机发、从机收
PA6MISOW5500 → STM32从机发、主机收
PA4SCSn/CSSTM32 → W5500低电平选中 W5500,界定一帧
PC5RSTnSTM32 → W5500低电平硬件复位,虽不属于四根基本 SPI 线,但本实验需要
GNDGND公共参考两块板必须共地,否则逻辑电平没有共同基准
电源VCC电源按具体模块标注供电;裸 W5500 芯片使用 3.3 V,不能凭模块外观猜 5 V/3.3 V

W5500 还有低有效 INTn 中断输出,但本例采用轮询寄存器的方式,课堂连线与主流程没有依赖这个引脚。模块上的 RJ45、网络变压器和指示灯也不属于 SPI 信号。

二、任务安排

课程分为两项任务:

  1. 学习 SPI 与网络基础,理解 STM32、W5500 和电脑各自承担什么工作。
  2. 分析 STM32F10x Standard Peripheral Library(标准外设库)例程,并把与硬件相关的底层接口迁移到 STM32 HAL 工程。

标准库与 HAL 库不能只按“函数名是否带 HAL”区分。两者都在 CMSIS 和寄存器之上提供 C 接口,但初始化结构体、句柄、状态管理、中断入口、回调与错误处理方式都不同。移植时应先划分驱动层与业务层,再替换底层 SPI/GPIO/延时接口,而不是全局搜索并给函数名加 HAL_。

三、SPI理论知识

SPI(Serial Peripheral Interface,串行外设接口)通常是一种同步、串行、主从式、可全双工的板级通信接口。它没有像 I²C 那样由统一规范定义的从地址、ACK/NACK 和起止条件;但这不表示“SPI 没有协议”。每个器件仍会在数据手册中定义命令、地址、读写位、帧长度和 CS 时序。例如 W5500 的一帧明确包含 16 位地址阶段、8 位控制阶段和数据阶段。

3.1 SPI总线

3.1.1 四根基本信号线
常见名称全称主机模式下的作用
SCK/SCLKSerial Clock主机产生时钟,双方按约定边沿改变和采样数据
MOSIMaster Out, Slave In主机输出、从机输入
MISOMaster In, Slave Out主机输入、从机输出
CS/SS/NSSChip/Slave Select主机选择从机,并通常界定一帧传输

“同步”表示双方依靠 SCK 确定每一位的时间,不表示两端系统时钟频率必须相同。“串行”表示每根数据线按时间顺序逐位传输;普通 SPI 在一个 SCK 周期内,MOSI 和 MISO 各移动 1 位。

SPI 移位寄存器天然是全双工的:主机每产生 8 个时钟发送一个字节,也同时从 MISO 收到一个字节;从机也一样。有些器件只需要单向数据,或把一根数据线改为半双工,这只是没有使用完整的全双工能力。

3.1.2 为什么 SPI 通常比 I²C 快

SPI 使用推挽驱动和独立数据线,通常没有 I²C 开漏总线的上拉电阻上升时间、地址阶段和每字节 ACK 开销,因此常能达到更高时钟。不过“SPI 从 MHz 起步、最高一定是 100 MHz”不是通用规则:最低和最高频率都由主机、从机、供电、走线、负载及模式共同决定。

W5500 数据手册给出的 SPI 上限是 80 MHz,但这只是芯片接口上限,不代表本开发板必须或能够工作在 80 MHz。标准库例程配置 SPI1 的 APB2 时钟为 72 MHz、预分频为 4,因此 SCK 是 72 / 4 = 18 MHz;源码旁“预分频值为 2”的旧注释与实际枚举值不一致。

显示屏刷新通常要传输大量像素数据,SPI 版本比低速 I²C 版本更容易获得高刷新率。不过刷新率还受屏幕控制器、分辨率、绘制算法、DMA 和 MCU 性能影响,不能只比较接口名称。

3.1.3 一主多从与片选

常规一主多从接法是共享 SCK、MOSI、MISO,每个从机各用一根独立 CS:

  1. 所有 CS 先保持无效状态。
  2. 主机把目标从机的 CS 拉到其有效电平。
  3. 主机产生 SCK,并完成命令、地址和数据传输。
  4. 等最后一位真正发送完,再释放 CS。

W5500 的 SCSn 为低有效:高变低表示帧开始,低变高表示帧结束。并非所有 SPI 从机都一定低有效,必须查具体器件手册。未被选中的从机必须让 MISO 进入高阻态,否则多个输出同时驱动会发生总线冲突;W5500 在 SCSn 为高时会让 MISO 高阻。

不同从机可能要求不同的 CPOL/CPHA、位序和最高频率。共享一套 SPI 外设时,主机必须在选择器件前切换到该器件要求的配置。

课堂所说“SPI 不能多主”适合作为常规设计建议,但不是绝对的物理限制。可以设计多主 SPI,某些控制器也提供模式错误检测;只是 SPI 没有像 I²C 那样统一的寻址与仲裁规则,多主冲突处理必须由系统额外设计,实际很少这样使用。

3.1.4 SPI与UART、I²C的区别
特性SPII²CUART
时钟有独立 SCK有 SCL无独立时钟,双方预先约定波特率
常规数据线MOSI + MISOSDA 双向TX + RX
双工可全双工常规为半双工可全双工
设备选择常用独立 CS总线内发送地址点对点,无总线地址
电气方式常见推挽开漏/开集,需上拉常见推挽;外部长距离接口还需收发器
统一应答无统一 ACK,器件自行定义每字节有 ACK/NACK帧本身无 ACK

3.2 SPI功能描述

3.2.1 概述

STM32 SPI 外设的核心是发送/接收移位寄存器、数据寄存器、时钟与波特率逻辑、主从控制以及状态标志。CPU 把数据写入发送数据寄存器后,SPI 硬件按 SCK 将其逐位移出,同时把 MISO 上采到的位移入接收寄存器。

主从双方必须一致约定:

  • CPOL:SCK 空闲电平。
  • CPHA:一个周期的第几个有效边沿采样。
  • 位序:MSB First 或 LSB First。
  • 帧宽:STM32F1 常用 8 位或 16 位。
  • CS 的有效电平和建立/保持时间。

仅 CPOL/CPHA 相同还不够;若一端 MSB First、另一端 LSB First,结果仍会错误。

3.2.2 配置SPI为从模式

CPOL 与 CPHA 组合成通常所说的 Mode 0~3。这里的“第一个/第二个边沿”要从 CS 有效后、SCK 离开空闲状态开始数:

SPI ModeCPOLCPHASCK 空闲电平采样边沿数据改变边沿
000低第一个边沿:上升沿第二个边沿:下降沿
101低第二个边沿:下降沿第一个边沿:上升沿
210高第一个边沿:下降沿第二个边沿:上升沿
311高第二个边沿:上升沿第一个边沿:下降沿

可以用一句话记忆:CPOL 决定“静止时高还是低”,CPHA 决定“先采样还是先改变”。采样时数据必须已经稳定,改变数据应安排在另一个边沿,这样接收端才有建立时间。

从机模式下,SCK 来自主机,波特率预分频器不决定实际传输速率;从机必须在主机给出首个采样边沿前使能并准备好数据。主机与从机模式不产生另一套 CPOL/CPHA 规则,双方必须使用同一模式。

W5500 只支持 Mode 0 和 Mode 3,并且均在上升沿锁存输入、下降沿更新输出。配套标准库使用 CPOL=0、CPHA=0,即 Mode 0,同时使用 MSB First。

3.2.3 配置SPI为主模式

主机负责产生 SCK 和 CS,并通过预分频器确定 SCK。配置时应先让 CS 处于无效状态,完成 GPIO 和 SPI 初始化后再访问从机。对 W5500 而言,一次 VDM 帧的基本顺序为:

SCSn 拉低 → 16 位偏移地址 → 8 位控制字节 → N 字节数据 → 等待最后一位发送完成 → SCSn 拉高

控制字节中的字段用于选择公共寄存器/某个 Socket 寄存器/收发缓冲区、读或写,以及可变长度或固定长度模式。因此,“SPI 直接连续发数据,没有协议”不适用于 W5500 的真实访问过程。

QSPI不是“四根SPI线”

QSPI/Quad-SPI 的“Quad”是四根数据线 IO0~IO3,不是把普通 SPI 的 SCK、CS、MOSI、MISO 合称四线。典型 Quad-SPI 仍另有 SCK 和 CS,总信号数通常至少 6 根。进入四线数据阶段后,每个时钟可传 4 bit,理想数据吞吐量约为单数据线的 4 倍,但命令和地址阶段未必都使用四线,实际加速比会更低。

Quad-SPI 常用于外部 NOR Flash。器件是否支持 Single/Dual/Quad 模式、如何进入 Quad 模式、QE 位怎样设置,都应查看对应 Flash 手册,不能把普通四信号 SPI 自动称为 QSPI。

四、容易混淆的关键点

  • MOSI/MISO 的名称始终以主机为参照,不能按“当前正在发送的一方”临时交换。
  • CS 是设备选择和帧边界,不是 SPI 时钟;多个从机通常需要多个 CS。
  • SPI 可全双工不等于每个上层命令都必须双向携带有效数据;无效方向也会移入/移出占位位。
  • CPHA=0 是第一个边沿采样,CPHA=1 是第二个边沿采样;“高电平采样/低电平采样”不足以唯一描述模式。
  • SPI 没有统一 ACK,但从设备拥有自己的命令与帧协议,绝不是任意字节都能直接解释。
  • W5500 是 10/100 Mbit/s Ethernet 控制器;80 MHz 是它的 SPI SCK 上限,两者是不同接口的速率,不能直接等同。

五、参考依据