2. SPI物理层:四线制详解与主从拓扑

SPI(Serial Peripheral Interface)的物理层定义了主从设备之间如何通过金属导线进行电气连接。理解四线制的信号含义、电气特性以及拓扑结构,是后续配置时钟极性和编写驱动代码的硬件基础。本章将深入剖析SPI物理层的每一个细节。

2.1 四线制信号线详解

标准的SPI总线使用四条信号线,分别承担时钟、数据输出、数据输入和片选功能。下表总结了每根线的名称、方向与核心作用:

信号线 全称 方向(主设备视角) 核心作用
SCLK Serial Clock 输出 由主设备产生,同步所有数据传输
MOSI Master Out Slave In 输出 主设备发送数据给从设备
MISO Master In Slave Out 输入 主设备接收来自从设备的数据
SS Slave Select 输出 主设备选择并激活特定的从设备
驱动开发提示: 在驱动代码中,MOSI和MISO的方向是固定的。主设备的TX(发送)引脚必须连接到从设备的RX(接收)引脚,反之亦然。错误的连接会导致通信失败,且不易通过逻辑分析仪直接发现。

2.2 电气特性与信号完整性

SPI是一种同步、全双工、高速的串行接口。其电气特性直接影响通信的稳定性和最大速率。以下是驱动开发中需要关注的关键电气参数:

  • 电平标准: 常见为3.3V或5V TTL/CMOS电平。主从设备电平必须兼容,否则需要电平转换芯片。
  • 最大速率: 取决于PCB走线长度、负载电容和从设备规格。典型值从几MHz到几十MHz不等。
  • 信号边沿: 数据在SCLK的上升沿或下降沿被采样,这由CPOL和CPHA配置决定。
  • 扇出能力: 主设备的驱动能力有限,挂载多个从设备时,总线的寄生电容会增加,导致信号边沿变缓。
硬件设计避坑: 当SPI总线长度超过10cm或速率超过10MHz时,建议在SCLK和MOSI/MISO线上串联22Ω~33Ω的电阻,以抑制信号反射和过冲。驱动代码中应避免在高速下使用过长的软件延迟。

2.3 主从设备拓扑结构

SPI总线支持多种拓扑结构,最常见的是“一主多从”模式。根据从设备片选信号(SS)的连接方式,主要分为独立片选和菊花链两种拓扑。

2.3.1 独立片选拓扑(标准模式)

每个从设备拥有独立的SS引脚。主设备通过将目标从设备的SS拉低来选中它,其他从设备的SS保持高电平,从而与总线隔离。这是最常用、最可靠的拓扑。

SPI独立片选拓扑结构图 主设备 (Master) SCLK MOSI MISO SS1 SS2 从设备1 (Slave #1) 从设备2 (Slave #2) SS1 SS2 特点:每个从设备独占一根SS线,互不干扰,支持任意组合访问。 SCLK、MOSI、MISO为共享总线,所有从设备同时监听。

2.3.2 菊花链拓扑

在菊花链模式下,所有从设备共享同一根SS线。主设备的MOSI连接到第一个从设备的MOSI,第一个从设备的MISO连接到第二个从设备的MOSI,以此类推,形成一个链。主设备需要发送特定长度的数据帧,数据在链中逐级移位传递。这种拓扑节省了主设备的GPIO引脚,但延迟较大,且任一从设备故障会导致整个链路中断。

SPI菊花链拓扑结构图 主设备 (Master) SCLK MOSI MISO SS 从设备1 (Slave #1) 从设备2 (Slave #2) 从设备3 (Slave #3) 共享SS MOSI 链出 链出 MISO 特点:节省SS引脚,数据通过链式移位传输,适合从设备数量多但速率要求不高的场景。 驱动需计算总数据帧长度 = 单个从设备数据长度 × 从设备数量。

2.4 多从机扩展的硬件连接策略

在实际项目中,当从设备数量超过主设备可用的SS引脚数时,可以采用以下硬件扩展策略:

  1. GPIO模拟片选: 使用主控芯片的通用GPIO引脚模拟SS功能。这是最灵活、成本最低的方案,但需要驱动工程师在每次传输前手动控制GPIO电平。
  2. 专用片选译码器: 使用3-8译码器(如74HC138)或1-16译码器,用3~4个GPIO控制多达8~16个从设备的片选。适用于从设备数量多且GPIO紧张的场景。
  3. SPI多路复用器/开关: 使用模拟开关(如CD4051)或专用SPI多路复用器,将一组SPI总线切换到多个从设备组。适用于需要隔离总线负载或切换不同电压域的场景。
驱动代码示例:GPIO模拟片选控制
/* 假设从设备CS引脚连接到GPIOA的Pin 0和Pin 1 */
#define SLAVE1_CS_PIN   GPIO_PIN_0
#define SLAVE2_CS_PIN   GPIO_PIN_1
#define CS_PORT         GPIOA

/* 选中从设备1 */
void spi_select_slave1(void) {
    HAL_GPIO_WritePin(CS_PORT, SLAVE1_CS_PIN, GPIO_PIN_RESET); // 拉低CS
    HAL_GPIO_WritePin(CS_PORT, SLAVE2_CS_PIN, GPIO_PIN_SET);   // 确保其他CS为高
}

/* 释放所有从设备 */
void spi_deselect_all(void) {
    HAL_GPIO_WritePin(CS_PORT, SLAVE1_CS_PIN | SLAVE2_CS_PIN, GPIO_PIN_SET);
}

2.5 本章小结

SPI物理层的四线制定义清晰,但电气特性和拓扑选择对驱动设计有直接影响。独立片选拓扑提供了最好的隔离性和灵活性,是驱动开发的首选;菊花链拓扑适用于特定场景,但驱动逻辑更复杂。掌握这些物理层知识,能帮助你在硬件设计阶段就规避潜在的信号完整性和扩展性问题,为后续的时钟极性配置和通信协议实现打下坚实基础。