SPI

模式选择(transmission mode)

  • Full-Duplex Master/Slave: 最常用 全双工模式,数据在 MOSI 和 MISO 上同时双向传输。主机发起通信并提供时钟。
  • Half-Duplex Master/Slave: 半双工模式,数据通过单根线 (MOSI 或 MISO,具体取决于配置和主从角色) 进行双向传输,但不能同时进行。需要正确配置 GPIO 复用和可能的外部连线。
  • Receive Only Master/Slave: 只接收模式。主机模式下,主机仅通过 MISO 接收数据 (不发送)。从机模式下,从机仅通过 MOSI 接收数据。
  • Disabled: 禁用该 SPI 外设。

配置建议: 绝大多数 SPI 外设 (如 Flash, ADC, DAC, 传感器) 使用 Full-Duplex Master 模式。如果 STM32 作为 SPI 从设备,则选择 Full-Duplex Slave

数据与帧格式

  1. 帧格式(frame format)

在 SPI(Serial Peripheral Interface,串行外设接口)通信中,NSS(Slave Select,或称为 Chip Select,片选信号)是一个用于选择从设备(Slave)的控制信号。它是 SPI 通信中主设备(Master)用来控制与哪个从设备进行通信的关键信号。

  • **motorola:**标准的 SPI 帧格式,数据在时钟边沿变化和采样,NSS 信号在帧之间控制。

    • 定义:Motorola 帧格式是 SPI 通信中最常用的标准格式,由 Motorola 公司定义。
    • 工作方式
      • 数据在时钟信号(SCLK)的特定边沿(上升沿或下降沿)被采样(读取)或变化(发送)。
      • 主设备通过 NSS(片选信号)控制通信的开始和结束:NSS 拉低表示开始传输数据,拉高表示结束。
      • 时钟的极性(CPOL)和相位(CPHA)可以配置,决定了数据采样和变化的时机(即 SPI 的四种模式:Mode 0 到 Mode 3)。
    • 特点
      • 简单、通用,适用于大多数 SPI 设备(如 SPI 闪存、显示屏、传感器等)。
      • NSS 信号在每次数据帧传输之间明确地拉低和拉高,确保通信清晰。
    • 例子
      • 你用微控制器(如 STM32)与 SPI 闪存通信时,通常会配置成 Motorola 格式,设置合适的 CPOL 和 CPHA(如 Mode 0:CPOL=0, CPHA=0),然后通过 NSS 控制通信。
  • ti:在 NSS 信号有效期间会产生一个时钟脉冲用于同步,数据传输方式与 Motorola 类似。使用较少,除非外设明确要求。

  • 定义:TI 帧格式是 Texas Instruments(德州仪器)定义的一种特殊 SPI 帧格式,主要用于 TI 的某些特定设备。

    工作方式

    • 与 Motorola 格式类似,TI 格式也使用 SCLK、MOSI、MISO 和 NSS 信号。
    • 不同点在于,TI 格式在 NSS 信号有效(通常拉低)时,会额外产生一个时钟脉冲,用于同步数据传输的开始。
    • 数据传输的时序与 Motorola 类似,但这个额外的同步脉冲是其独特之处。

    特点

    • 使用较少,通常只在 TI 的特定外设(如某些 TI 的 ADC 或 DAC)上使用。
    • 如果设备文档明确要求 TI 帧格式,你需要配置微控制器的 SPI 控制器为 TI 模式,否则会通信失败。

    例子

    • 如果你用一个 TI 的 SPI 设备(如某些模拟数字转换器),你需要在微控制器(如 MSP430 或 STM32)的 SPI 配置中选择 TI 帧格式,并确保 NSS 和时钟脉冲的时序匹配。
  1. 数据大小(data size)

设置每个 SPI 帧传输的数据位数。“”是指一次完整的数据传输单元。简单来说,它是主设备和从设备在一次 SPI 通信中交换的一个固定长度的数据块。

通常可选范围从 4 bits16 bits (具体范围取决于 STM32 型号)。

  1. 位顺序(first bit)
    • MSB First: 最常用 最高有效位 (Most Significant Bit) 先发送。
    • LSB First: 最低有效位 (Least Significant Bit) 先发送。

时钟配置

配置 SPI 的 SCK 时钟频率 (波特率) 和时钟模式 (极性 CPOL 与相位 CPHA)。

  1. 波特率预分频器(prescaler for rate)

    • 通过选择一个预分频值来设置 SPI 的通信速率。SPI 时钟由连接到 SPI 外设的总线时钟 (通常是 APB1 或 APB2 时钟) 分频得到。

      SPI_CLK = Peripheral_Clock / Prescaler_Value

      CubeMX 会显示可选的预分频值 (如 2, 4, 8, 16, …, 256) 以及基于当前外设时钟计算出的实际波特率。

  2. 时钟极性(clock polarity -cpol)

    • CPOL = Low: SCK 时钟在空闲状态为低电平。
    • CPOL = High: SCK 时钟在空闲状态为高电平。
  3. 时钟相位(clock phase -cpha)

    • CPHA = 1 Edge: 数据在 SCK 的第一个时钟边沿被采样。
    • CPHA = 2 Edge: 数据在 SCK 的第二个时钟边沿被采样。
  4. spi模式总结

CPOL 和 CPHA 的组合定义了四种 SPI 工作模式:结合从设备进行配置

模式 CPOL CPHA 描述 (空闲电平, 采样边沿)
0 Low (0) 1 Edge (0) 空闲低,SCK 第一个边沿采样
1 Low (0) 2 Edge (1) 空闲低,SCK 第二个边沿采样
2 High (1) 1 Edge (0) 空闲高,SCK 第一个边沿采样
3 High (1) 2 Edge (1) 空闲高,SCK 第二个边沿采样

重要: 必须查阅从设备的数据手册,选择其支持的 SPI 模式。例如,许多 SPI Flash 支持模式 0 和模式 3。

NSS管理

NSS (Negative Slave Select) 或 CS (Chip Select) 信号用于选择与之通信的从设备。STM32 SPI 外设提供了硬件和软件两种管理方式。

  1. NSS模式(slave select management)

    • Software (NSS Signal Type: Software): (最常用)

      NSS 信号不由 SPI 外设硬件自动控制。你需要选择一个通用 GPIO 引脚作为 NSS,并在代码中手动拉低 (选中从设备) 和拉高 (取消选中)。

      • Hardware NSS Signal (在Mode部分) 通常设置为 Disable
    • Hardware (Input) (NSS Signal Type: Hardware Input):

      STM32 作为 SPI 从设备时使用。NSS 引脚配置为硬件输入,当外部主机拉低此引脚时,STM32 SPI 从设备被选中。

      • Hardware NSS Signal (在Mode部分) 通常设置为 Hardware Input 或类似。
    • Hardware (Output) (NSS Signal Type: Hardware Output):

      STM32 作为 SPI 主机时使用。SPI 外设硬件在数据传输开始前自动拉低 NSS 引脚,传输结束后自动拉高。

      • Hardware NSS Signal (在Mode部分) 通常设置为 Hardware Output 或类似。
  2. 信号极性(NSS polarity)

    仅在 NSS 由硬件管理 (Hardware Input/Output) 时可配置。

    • Low: 常用 NSS 信号低电平有效 (选中从设备)。
    • High: NSS 信号高电平有效。较少见。
  3. NSS输出脉冲模式(NSS pluse mode)

    某些 STM32 型号在硬件 NSS 输出模式下,允许配置 NSS 信号在每个数据帧之间是否产生脉冲 (即在帧间拉高再拉低)。

    配置建议: 查阅具体 STM32 参考手册。如果从设备要求在连续传输的帧之间保持 NSS 低电平,则应禁用脉冲模式。

软件 NSS 控制: 如果选择软件 NSS,记得在 GPIO 配置中将对应引脚设为 Output Push-Pull,并在代码中实现:

// 伪代码 - 具体宏和引脚需替换
#define SPIx_NSS_GPIO_PORT GPIOB
#define SPIx_NSS_PIN       GPIO_PIN_12

void SPIx_NSS_Low() { HAL_GPIO_WritePin(SPIx_NSS_GPIO_PORT, SPIx_NSS_PIN, GPIO_PIN_RESET); }
void SPIx_NSS_High() { HAL_GPIO_WritePin(SPIx_NSS_GPIO_PORT, SPIx_NSS_PIN, GPIO_PIN_SET); }

// 在 SPI 传输前后调用
// SPIx_NSS_Low();
// HAL_SPI_Transmit(...);
// SPIx_NSS_High();

CRC计算

SPI CRC (Cyclic Redundancy Check) 功能可以在数据传输过程中自动计算和校验 CRC 值,以检测传输错误,增强数据完整性。

  1. CRC计算(CRC Caculation)

    • Disabled: (默认/常用 )不使用 CRC 功能。
    • Enabled: 启用 CRC 计算和校验。启用后,SPI 外设会在发送数据时自动附加 CRC 值,并在接收数据时自动校验 CRC。
  2. CRC多项式(CRC Polynomial)

    • 仅在 CRC 计算启用时配置。输入 CRC 计算所使用的多项式值 (通常是 7 位、8 位或 16 位 CRC 的系数,不包括最高位的 xn)。

      常用 CRC 多项式: 例如 CRC-8 (如 0x07 for x8+x2+x+1), CRC-16-CCITT (0x1021 for x16+x12+x5+1)。

      STM32 SPI 的 CRC 长度通常是固定的 (例如 8 位或 16 位,取决于具体型号和数据帧长度)。你需要输入多项式的低位部分。

  3. CRC(CRC Length)

    • 8-bit 16-bit

    • 某些 STM32 型号允许选择 CRC 值的长度,通常与数据帧大小 (Data Size) 相关联。如果 Data Size <= 8-bit,CRC 通常也是 8-bit。如果 Data Size > 8-bit (例如 16-bit),CRC 可能是 16-bit。

      配置建议: 确保 CRC 长度和多项式与通信对方的配置一致。

中断配置(NVIC)

  1. NVIC设置(NVIC Settings)

    • 需要在 CubeMX 的 “NVIC Settings” 标签页中,为对应的 SPI 外设启用中断。

      SPIx global interrupt: Enabled

      启用 SPI 全局中断后,可以在代码中通过 HAL 库使能或禁止特定的 SPI 中断源 (如 Tx Buffer Empty, Rx Buffer Not Empty, Error flags)。

      配置建议:

      • 不使用 DMA,中断驱动模式: 必须启用 SPI 全局中断。在代码中,你会使用如 HAL_SPI_Transmit_IT(), HAL_SPI_Receive_IT() 这类函数,它们会管理具体的 SPI 事件中断。
      • 使用 DMA 模式:
        • 推荐启用 SPI 全局中断: 主要用于捕获和处理 SPI 相关的错误中断 (如 Overrun, Mode Fault, CRC Error)。DMA 传输完成由 DMA 的中断处理。
        • 在这种情况下,SPI 的数据传输相关的中断 (TxE, RxNE) 通常由 HAL 的 DMA 驱动函数间接管理,或者不直接使用。

      中断优先级 (Preemption Priority / Sub Priority): 根据系统需求合理配置。

  2. 相关的HAL回调函数

    • 启用中断后,HAL 库会在相应事件发生时调用对应的回调函数(弱定义,用户需在自己的代码中重新实现)。

      主要回调函数:

      • HAL_SPI_TxCpltCallback(): 发送完成 (中断或 DMA 模式)。
      • HAL_SPI_RxCpltCallback(): 接收完成 (中断或 DMA 模式)。
      • HAL_SPI_TxRxCpltCallback(): 发送和接收均完成 (中断或 DMA 模式)。
      • HAL_SPI_TxHalfCpltCallback(), HAL_SPI_RxHalfCpltCallback(), HAL_SPI_TxRxHalfCpltCallback(): 半传输完成回调 (主要用于 DMA)。
      • HAL_SPI_ErrorCallback(): 发生错误时调用 (如 Mode Fault, Overrun, Underrun, CRC Error)。在此回调中,可以通过检查 SPI 句柄的 ErrorCode 字段来判断具体错误类型。
      • HAL_SPI_AbortCpltCallback(): 主动中止传输完成时调用。

      注意: 在 DMA 模式下,TxCpltCallback, RxCpltCallback, TxRxCpltCallback 主要由 DMA 传输完成中断触发,而不是 SPI 自身的数据事件中断。

GPIO配置

正确配置 SPI 通信所使用的 MOSI, MISO, SCK 以及 NSS (如果软件控制) 引脚的 GPIO 功能是 SPI 正常工作的基础。

  1. 引脚选择(Pin Setection)

在 CubeMX 的 Pinout 视图中,找到要使用的 SPI 外设 (如 SPI1),点击其 MOSI, MISO, SCK 功能,然后在右侧的芯片引脚图中选择具体的物理引脚。

如果使用软件 NSS, 也需要选择一个通用 GPIO 引脚作为 NSS。

一个 SPI 功能通常可以映射到多个不同的 GPIO 引脚上,根据 PCB 布局选择合适的引脚。

  1. GPIO配置(GPIO Settings Tab)
    • 在 CubeMX 的 SPI 配置页面下,切换到 “GPIO Settings” 标签页 (或直接在 Pinout 视图中点击引脚配置),可以查看和微调已选定引脚的配置:
      • MOSI (Master Out Slave In):
        • 主机模式: Alternate Function Push Pull
        • 从机模式 (Full/Half Duplex): Alternate Function Input (或 Push Pull,取决于具体实现和 STM32 型号,通常 Input 就够了)
      • MISO (Master In Slave Out):
        • 主机模式: Alternate Function Input (或 Push Pull)
        • 从机模式: Alternate Function Push Pull
      • SCK (Serial Clock):
        • 主机模式: Alternate Function Push Pull
        • 从机模式: Alternate Function Input
      • NSS (Software Controlled):
        • 主机模式: GPIO_Output (Push Pull), 初始电平 High (若 NSS 低有效)。
        • 从机模式 (如果需要软件判断 NSS): GPIO_Input。
      • NSS (Hardware Controlled):
        • 主机输出: Alternate Function Push Pull
        • 从机输入: Alternate Function Input (或 Push Pull)
      • GPIO Pull-up/Pull-down: 通常为 No pull-up and no pull-down。SPI 信号线一般不需要外部或内部上拉/下拉,除非特定从设备或总线条件要求 (例如,某些情况下 MISO 线可能需要上拉)。NSS 软件控制时,如果担心悬空,可根据有效电平考虑上拉或下拉。
      • Maximum output speed: High 或 Very High。为确保信号边沿陡峭以满足 SPI 时序要求,应选择较高的 GPIO 输出速度。
Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐