4. SPI协议详解:四线制、工作模式与数据帧格式

SPI(Serial Peripheral Interface,串行外设接口)是一种全双工、同步、主从式的串行通信协议,由Motorola公司于20世纪80年代提出。在嵌入式系统中,SPI因其高速、简单、硬件开销低的特点,被广泛用于ADC/DAC、LCD显示屏、SD卡、传感器、存储器等外设的通信。本章将深入剖析SPI协议的物理层信号定义、四种时钟模式以及数据帧格式,为后续时钟树配置与DMA传输的协同设计奠定基础。

4.1 SPI四线制信号定义

标准SPI接口使用四条信号线完成主从设备之间的数据交换,每条信号线都有明确的角色和时序约束。

信号线全称方向(主设备视角)功能描述
SCKSerial Clock输出由主设备产生,同步数据传输的时钟信号
MOSIMaster Out Slave In输出主设备发送数据至从设备的数据线
MISOMaster In Slave Out输入从设备发送数据至主设备的数据线
NSSNegative Slave Select输出片选信号,低电平有效,用于选中目标从设备
关键提示: NSS信号在硬件NSS模式下由主设备GPIO直接控制,在软件NSS模式下可通过SPI控制寄存器配置。多从设备系统中,每个从设备需独立占用一个GPIO作为NSS引脚。

SPI通信的基本流程如下:

  1. 主设备将目标从设备的NSS引脚拉低,选中该从设备。
  2. 主设备在SCK线上产生连续的时钟脉冲。
  3. 在每个时钟周期内,主设备通过MOSI线发送一位数据,同时从设备通过MISO线返回一位数据。
  4. 数据传输完成后,主设备将NSS拉高,释放从设备。
SPI四线制主从连接拓扑 主设备 (Master) SCK 发生器 移位寄存器 从设备 (Slave) 移位寄存器 片选逻辑 SCK MOSI MISO NSS (低有效) SPI是全双工协议:每个SCK周期同时完成一位数据的发送和接收

4.2 SPI四种工作模式(CPOL/CPHA)

SPI协议通过时钟极性(CPOL,Clock Polarity)和时钟相位(CPHA,Clock Phase)的组合,定义了四种不同的工作模式。主设备和从设备必须工作在相同的模式下才能正确通信。

  • CPOL:决定SCK空闲时的电平状态。
    • CPOL = 0:空闲时SCK为低电平
    • CPOL = 1:空闲时SCK为高电平
  • CPHA:决定数据采样发生在SCK的哪个边沿。
    • CPHA = 0:在SCK的第一个边沿(上升沿或下降沿)采样数据
    • CPHA = 1:在SCK的第二个边沿采样数据
模式CPOLCPHA空闲SCK电平数据采样边沿数据输出边沿
模式000低电平上升沿(第一个边沿)下降沿
模式101低电平下降沿(第二个边沿)上升沿
模式210高电平下降沿(第一个边沿)上升沿
模式311高电平上升沿(第二个边沿)下降沿
工程经验: 绝大多数SPI外设默认使用模式0(CPOL=0, CPHA=0)或模式3(CPOL=1, CPHA=1)。模式0和模式3的采样边沿都是上升沿,区别仅在于空闲电平。在MCU驱动开发中,务必查阅外设数据手册确认其支持的SPI模式。
SPI四种工作模式时序对比 模式0 (CPOL=0, CPHA=0) SCK 采样点 模式1 (CPOL=0, CPHA=1) SCK 采样点 模式2 (CPOL=1, CPHA=0) SCK 采样点 模式3 (CPOL=1, CPHA=1) SCK 采样点 红色圆点表示数据采样时刻;模式0和模式2在第一个边沿采样,模式1和模式3在第二个边沿采样

4.3 数据帧格式:8位与16位

SPI协议支持可配置的数据帧长度,最常见的为8位和16位两种格式。数据帧格式决定了每次片选有效期间传输的数据位数,以及移位寄存器的操作方式。

4.3.1 8位数据帧

  • 默认格式:大多数MCU的SPI外设复位后默认配置为8位数据帧。
  • 传输顺序:MSB(最高有效位)优先发送,LSB(最低有效位)最后发送。
  • 典型应用:字符型LCD、温度传感器(如MAX6675)、8位ADC/DAC。
  • 寄存器配置:在STM32中通过SPI_CR1寄存器的DFF位(Data Frame Format)设置为0。

4.3.2 16位数据帧

  • 传输效率:单次传输16位数据,减少片选切换开销,适用于高速数据流。
  • 典型应用:16位ADC/DAC(如ADS1115)、音频编解码器、高精度传感器。
  • 寄存器配置:在STM32中设置SPI_CR1寄存器的DFF位为1。
  • 注意事项:16位模式下,发送寄存器和接收寄存器均为16位宽度,CPU或DMA访问时需按半字(half-word)操作。
特性8位数据帧16位数据帧
数据宽度8 bits16 bits
每帧SCK周期数816
寄存器访问宽度字节(8位)半字(16位)
DMA传输单位1字节2字节
典型外设SPI Flash、SD卡音频DAC、高精度ADC
帧间隔时间较短较长(相同SCK频率下)
常见陷阱: 当SPI配置为16位数据帧时,如果CPU或DMA以字节为单位写入发送寄存器,会导致数据错位。例如,发送0x1234时,若按两个字节写入(先0x12后0x34),实际发送的可能是0x3412。必须确保数据写入宽度与DFF配置一致。

4.4 SPI通信时序关键参数

在实际驱动开发中,除了模式和数据帧格式外,还需关注以下时序参数:

  • SCK频率:由主设备时钟分频得到,需满足从设备的最大SCK频率要求。
  • 片选建立时间(tNSS-SCK):NSS拉低到第一个SCK边沿之间的最小延迟。
  • 片选保持时间(tSCK-NSS):最后一个SCK边沿到NSS拉高之间的最小延迟。
  • 数据建立时间(tSU):数据在采样边沿之前必须保持稳定的最小时间。
  • 数据保持时间(tHD):数据在采样边沿之后必须保持稳定的最小时间。
驱动开发要点: 在配置SPI时钟树时,SCK频率不应超过从设备数据手册中规定的最大值。对于高速SPI(如10 MHz以上),PCB走线长度和信号完整性也会影响时序裕量。DMA传输可以显著降低CPU干预,但需确保DMA传输速率与SPI波特率匹配,避免FIFO溢出或欠载。

4.5 本章小结