2. SPI控制器硬件架构

SPI控制器的硬件架构是驱动开发与性能调优的基础。理解内部FIFO深度、移位寄存器、时钟分频器及片选逻辑的协同工作方式,能够帮助开发者精准定位性能瓶颈,并合理选择FIFO模式或DMA传输策略。本节将从硬件框图与数据流两个维度进行深入剖析。

2.1 SPI控制器核心组件与硬件框图

一个典型的SPI控制器内部包含以下关键模块:

  • 移位寄存器(Shift Register):负责将并行数据转换为串行比特流(发送),或将串行比特流转换为并行数据(接收)。其宽度通常为8位、16位或32位。
  • 发送FIFO(TX FIFO):用于缓存待发送的数据。CPU或DMA可以一次性写入多个数据项,控制器自动从FIFO中取出数据送入移位寄存器。
  • 接收FIFO(RX FIFO):用于缓存已接收的数据。移位寄存器完成接收后,数据被推入RX FIFO,等待CPU或DMA读取。
  • 时钟分频器(Clock Divider):根据系统总线时钟(如AHB/APB时钟)生成SPI串行时钟(SCLK)。分频系数通常可编程配置。
  • 片选逻辑(Chip Select Logic):负责控制CS(Chip Select)信号的电平与时序,支持硬件自动控制或软件手动控制。
  • 控制状态寄存器(Control & Status Registers):用于配置模式、使能中断、查询状态等。
关键概念: FIFO深度决定了控制器在无需CPU干预的情况下,能够连续处理的数据量。深度越大,对CPU中断频率的要求越低,DMA传输的效率越高。
SPI控制器内部硬件架构框图 SPI控制器内部硬件架构框图 系统总线接口 控制状态寄存器 TX FIFO 深度: 16/32/64 RX FIFO 深度: 16/32/64 移位寄存器 8/16/32位 时钟分频器 片选逻辑 MOSI / MISO SCLK CS 说明: • 数据流方向:系统总线 → TX FIFO → 移位寄存器 → MOSI(发送路径) • 数据流方向:MISO → 移位寄存器 → RX FIFO → 系统总线(接收路径) • 控制寄存器通过内部总线配置时钟分频器、片选逻辑及FIFO阈值

2.2 时钟分频器与波特率生成

SPI时钟分频器通常采用偶数分频或奇数分频方式,从系统时钟(如PCLK或HCLK)分频得到SCLK。分频系数由寄存器中的BR[2:0]或SCR[7:0]字段控制。

分频模式 分频系数范围 典型寄存器字段 SCLK频率公式
偶数分频 2, 4, 6, ..., 256 BR[2:0] (3位) SCLK = PCLK / (2 × (BR+1))
奇数分频 1, 3, 5, ..., 511 SCR[7:0] (8位) SCLK = PCLK / (SCR+1)
分数分频 1.5, 2.5, 3.5, ... 扩展寄存器 SCLK = PCLK / (N + 0.5)
调优建议: 在FIFO模式下,SCLK频率越高,FIFO消耗越快,CPU中断响应压力越大。建议根据从设备支持的最大频率,选择略低于该值的分频系数,以平衡吞吐与稳定性。

2.3 片选逻辑与多从设备管理

片选逻辑负责在传输开始前将CS信号拉低,传输结束后拉高。硬件自动片选模式可以显著降低CPU开销,但需要正确配置CS有效电平(低电平有效或高电平有效)及片选延时。

  • 硬件自动片选:写入TX FIFO后,控制器自动拉低CS;TX FIFO空且移位寄存器空闲时,自动拉高CS。
  • 软件手动片选:通过GPIO或专用寄存器手动控制CS电平,适用于需要保持CS低电平进行连续多帧传输的场景。
  • 多从设备支持:通常提供多个CS引脚(如CS0~CS3),每个从设备对应一个独立的CS信号。
片选逻辑与多从设备连接图 片选逻辑与多从设备连接图 SPI主控制器 CS0 / CS1 / CS2 从设备0 CS0 从设备1 CS1 从设备2 CS2 片选时序要点: • CS在传输开始前拉低,传输结束后拉高,确保从设备正确识别帧边界 • 多从设备共享MOSI/MISO/SCLK,通过独立的CS信号进行设备选择

2.4 FIFO深度与数据流路径

FIFO深度是影响SPI传输性能的核心参数。常见的FIFO深度有16级、32级、64级甚至128级。深度越大,单次中断服务或DMA突发传输能够处理的数据量越多。

数据流路径详解:
  1. 发送路径:CPU/DMA 写入 TX FIFO → TX FIFO 非空 → 移位寄存器从 TX FIFO 读取数据 → 逐位输出到 MOSI 引脚。
  2. 接收路径:MISO 引脚逐位输入 → 移位寄存器完成接收 → 数据推入 RX FIFO → CPU/DMA 从 RX FIFO 读取数据。
  3. 全双工传输:发送与接收同时进行,移位寄存器在每个SCLK周期同时移出和移入一位数据。
FIFO深度 中断触发阈值 单次中断处理数据量 适用场景
16级 TX空: < 8; RX满: > 8 8~16字节 低速外设、中断驱动
32级 TX空: < 16; RX满: > 16 16~32字节 中速外设、中断/DMA混合
64级 TX空: < 32; RX满: > 32 32~64字节 高速外设、DMA传输
128级 TX空: < 64; RX满: > 64 64~128字节 批量数据传输、DMA+双缓冲

2.5 硬件数据流与中断/DMA触发点

理解数据流中的关键触发点,对于配置中断服务程序(ISR)或DMA请求至关重要。

  • TX FIFO空触发点:当TX FIFO中的数据量低于预设阈值(如1/2深度)时,触发发送中断或DMA请求,提示CPU/DMA补充数据。
  • RX FIFO满触发点:当RX FIFO中的数据量超过预设阈值(如1/2深度)时,触发接收中断或DMA请求,提示CPU/DMA取走数据。
  • 传输完成触发点:当移位寄存器空闲且TX FIFO为空时,触发传输完成中断,表示当前帧传输结束。
  • 错误触发点:当发生溢出(RX FIFO满时仍有新数据)或模式错误时,触发错误中断。
SPI数据流与中断/DMA触发点 SPI数据流与中断/DMA触发点 CPU/DMA TX FIFO 移位寄存器 RX FIFO CPU/DMA ① TX空触发 ② RX满触发 ③ 传输完成触发 触发点说明: ① TX FIFO空触发:当TX FIFO数据量低于阈值时,请求CPU/DMA写入新数据 ② RX FIFO满触发:当RX FIFO数据量超过阈值时,请求CPU/DMA读取数据 ③ 传输完成触发:移位寄存器空闲且TX FIFO为空,表示当前帧传输结束

2.6 硬件架构对驱动设计的影响

SPI控制器的硬件架构直接决定了驱动程序的实现策略:

  • FIFO深度:深度较小时,中断频率高,适合使用中断驱动模式;深度较大时,适合使用DMA模式以减少CPU干预。
  • 移位寄存器宽度:宽度为16位或32位时,可以一次传输更多比特,提高吞吐量,但需要确保数据对齐。
  • 时钟分频精度:分数分频能够更精确地匹配从设备要求的频率,避免因频率偏差导致的通信错误。
  • 片选控制方式:硬件自动片选简化了驱动逻辑,但软件手动片选提供了更大的灵活性,适用于需要连续传输的场景。
常见陷阱: 某些SPI控制器的TX FIFO和RX FIFO深度不对称(如TX深度为16,RX深度为32)。在配置中断阈值时,必须分别考虑,否则可能导致TX FIFO下溢或RX FIFO溢出。