4. SPI协议详解:四线制、工作模式与数据帧格式
SPI(Serial Peripheral Interface,串行外设接口)是一种全双工、同步、主从式的串行通信协议,由Motorola公司于20世纪80年代提出。在嵌入式系统中,SPI因其高速、简单、硬件开销低的特点,被广泛用于ADC/DAC、LCD显示屏、SD卡、传感器、存储器等外设的通信。本章将深入剖析SPI协议的物理层信号定义、四种时钟模式以及数据帧格式,为后续时钟树配置与DMA传输的协同设计奠定基础。
4.1 SPI四线制信号定义
标准SPI接口使用四条信号线完成主从设备之间的数据交换,每条信号线都有明确的角色和时序约束。
| 信号线 | 全称 | 方向(主设备视角) | 功能描述 |
|---|---|---|---|
| SCK | Serial Clock | 输出 | 由主设备产生,同步数据传输的时钟信号 |
| MOSI | Master Out Slave In | 输出 | 主设备发送数据至从设备的数据线 |
| MISO | Master In Slave Out | 输入 | 从设备发送数据至主设备的数据线 |
| NSS | Negative Slave Select | 输出 | 片选信号,低电平有效,用于选中目标从设备 |
关键提示: NSS信号在硬件NSS模式下由主设备GPIO直接控制,在软件NSS模式下可通过SPI控制寄存器配置。多从设备系统中,每个从设备需独立占用一个GPIO作为NSS引脚。
SPI通信的基本流程如下:
- 主设备将目标从设备的NSS引脚拉低,选中该从设备。
- 主设备在SCK线上产生连续的时钟脉冲。
- 在每个时钟周期内,主设备通过MOSI线发送一位数据,同时从设备通过MISO线返回一位数据。
- 数据传输完成后,主设备将NSS拉高,释放从设备。
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的第二个边沿采样数据
| 模式 | CPOL | CPHA | 空闲SCK电平 | 数据采样边沿 | 数据输出边沿 |
|---|---|---|---|---|---|
| 模式0 | 0 | 0 | 低电平 | 上升沿(第一个边沿) | 下降沿 |
| 模式1 | 0 | 1 | 低电平 | 下降沿(第二个边沿) | 上升沿 |
| 模式2 | 1 | 0 | 高电平 | 下降沿(第一个边沿) | 上升沿 |
| 模式3 | 1 | 1 | 高电平 | 上升沿(第二个边沿) | 下降沿 |
工程经验: 绝大多数SPI外设默认使用模式0(CPOL=0, CPHA=0)或模式3(CPOL=1, CPHA=1)。模式0和模式3的采样边沿都是上升沿,区别仅在于空闲电平。在MCU驱动开发中,务必查阅外设数据手册确认其支持的SPI模式。
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 bits | 16 bits |
| 每帧SCK周期数 | 8 | 16 |
| 寄存器访问宽度 | 字节(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溢出或欠载。