当前位置: 首页 > news >正文

STM32SPI通信基础及CubeMX配置

STM32SPI通信基础及CubeMX配置

  • 一,SPI通信基础
    • 1,SPI 信号线详解
    • 2,SPI 工作模式 (CPOL 和 CPHA)
    • 3,通用SPI模块开发步骤 (以STM32为例)
        • 1,硬件连接:
        • 2,STM32CubeMX 配置思路:
        • 3,驱动代码结构设计 (应用层视角):
  • 二,SPI CubeMX配置
    • 1,SPI: 模式选择
        • 传输模式 (Transmission Mode)
    • 2,SPI: 数据与帧格式
        • 1,帧格式 (Frame Format)
        • 2,数据大小 (Data Size)
        • 3,位顺序 (First Bit)
    • 3,SPI: 时钟配置
        • 1,波特率预分频器 (Prescaler for Baud Rate)
        • 2,时钟极性 (Clock Polarity - CPOL)
        • 3,时钟相位 (Clock Phase - CPHA)
        • 4,SPI 模式总结 (CPOL/CPHA)
    • 4,SPI: NSS 管理
        • 1,NSS 模式 (Slave Select Management)
        • 2,NSS 信号极性 (NSS Polarity - 仅硬件模式)
        • 3,NSS 输出脉冲模式 (NSS Pulse Mode - 仅硬件输出)
    • 5,SPI: CRC 计算
        • 1,CRC 计算 (CRC Calculation)
        • 2,CRC 多项式 (CRC Polynomial)
        • 3,CRC 长度 (CRC Length)
    • 6,SPI: DMA 配置
        • 1,添加 DMA 请求 (Add DMA Request)
        • 2,DMA 通道配置 (DMA Request Settings)
    • 7,SPI: 中断配置 (NVIC)
        • 1,NVIC 设置 (NVIC Settings)
        • 2,相关的 HAL 回调函数
    • 8,SPI: GPIO 配置
        • 1,引脚选择 (Pin Selection)
        • 2,GPIO 配置 (GPIO Settings Tab)

一,SPI通信基础

SPI (Serial Peripheral Interface) 是一种高速、全双工、同步的串行通信总线,广泛用于微控制器(MCU)与外围设备(如传感器、存储器、显示驱动等)之间的短距离通信。理解其工作原理和开发流程对于嵌入式应用至关重要。

1,SPI 信号线详解

标准的SPI通信通常涉及四根信号线(在某些配置下可能更少):

1,CS (Chip Select) / SS (Slave Select): 片选信号,通常由主机控制,低电平有效。当主机需要与某个特定的从设备通信时,会将其对应的CS线拉低。在多从设备环境中,每个从设备都有独立的CS线。
2,SCK (Serial Clock): 串行时钟信号,由主机产生,用于同步数据的传输。数据的每一位都在SCK的一个特定边沿(上升沿或下降沿,取决于SPI模式)被采样。
3,MOSI (Master Out, Slave In): 主机输出、从机输入。数据由主机通过此线发送给从设备。
4,MISO (Master In, Slave Out): 主机输入、从机输出。数据由从设备通过此线发送给主机。如果一个SPI设备仅为输出型(如某些传感器)或仅为输入型,可能不会使用这两根线的其中之一。

在SPI通信中,数据是双向同时传输的:当主机通过MOSI发送一位数据给从机时,从机也通过MISO发送一位数据给主机。即使当前操作只是单向的(例如主机通过MOSI写数据给从机,不关心从机返回),MISO线上的数据依然会被传输(通常是无效数据或特定状态)。

2,SPI 工作模式 (CPOL 和 CPHA)

SPI有四种工作模式,由时钟极性(CPOL)和时钟相位(CPHA)两个参数组合定义。选择哪种模式取决于SPI从设备的要求,主机必须配置成与从设备兼容的模式。

1,CPOL (Clock Polarity): 定义了SPI时钟信号在空闲状态下的电平。
CPOL=0: SCK空闲时为低电平。
CPOL=1: SCK空闲时为高电平。

2,CPHA (Clock Phase): 定义了数据采样的时钟边沿。
CPHA=0: 数据在SCK的第一个边沿被采样。
CPHA=1: 数据在SCK的第二个边沿被采样。

3,这四个模式通常表示为:
模式0: CPOL=0, CPHA=0 (空闲低,第一个边沿采样)
模式1: CPOL=0, CPHA=1 (空闲低,第二个边沿采样)
模式2: CPOL=1, CPHA=0 (空闲高,第一个边沿采样)
模式3: CPOL=1, CPHA=1 (空闲高,第二个边沿采样)

关键:
务必查阅SPI从设备的数据手册来确定其支持的SPI模式,并在主机端进行相应配置。例如,本教程针对的GD25QXX系列FLASH通常支持SPI模式0和模式3。

3,通用SPI模块开发步骤 (以STM32为例)

开发一个通用的SPI模块与外设通信,通常遵循以下步骤:

1,硬件连接:

将MCU的SPI引脚 (SCK, MOSI, MISO) 连接到从设备的对应引脚。
将MCU的一个通用GPIO引脚连接到从设备的CS引脚。
在这里插入图片描述
在这里插入图片描述

确保电源和地线连接正确,根据需要添加上拉或下拉电阻 (尽管SPI信号线通常不需要外部拉电阻,但CS线有时会根据具体情况添加上拉以确保空闲时为高电平)。

2,STM32CubeMX 配置思路:

1,启用SPI外设: 在CubeMX中选择一个SPI接口 (如SPI1, SPI2等),并设置为Full-Duplex Master模式。
2,SPI参数配置:
Data Size: 通常为8 Bits (根据从设备要求,也可能为16 Bits等)。

First Bit: MSB First 或 LSB First (根据从设备要求)。

Clock Polarity (CPOL) 和 Clock Phase (CPHA): 根据从设备数据手册选择正确的SPI模式。

Baud Rate Prescaler: 设置SPI时钟速率。初始阶段可选择较低速率以保证通信稳定,调试成功后再根据从设备和MCU能力适当提高。波特率不能超过从设备支持的最大时钟频率。

NSS (Slave Select) Management: 对于由GPIO控制CS的情况,通常选择Software模式 (即Hardware NSS Signal: Disable)。这意味着你需要手动控制CS引脚的电平。

3,GPIO引脚配置:
SCK, MOSI, MISO引脚: 配置为对应的SPI复用功能 (Alternate Function Push-Pull)。
CS引脚: 配置为GPIO_Output模式 (Push-Pull),初始电平设为High (因为CS通常低电平有效)。

4,(可选) DMA配置: 对于大量数据传输,可以配置DMA以减轻CPU负担。

5,(可选) 中断配置: 可以配置SPI中断 (如传输完成中断、错误中断) 以进行异步处理。

生成代码。

3,驱动代码结构设计 (应用层视角):
  1. 底层SPI发送/接收函数: 封装HAL库的SPI发送、接收、发送和接收函数。例如,一个SPI_SendByte(uint8_t data)和SPI_ReceiveByte()或SPI_TransmitReceiveByte(uint8_t txData)函数。
// 示例:HAL库的简单封装
uint8_t SPI_TransmitReceive(SPI_HandleTypeDef *hspi, uint8_t tx_byte) {uint8_t rx_byte;HAL_SPI_TransmitReceive(hspi, &tx_byte, &rx_byte, 1, HAL_MAX_DELAY);return rx_byte;
}
  1. CS引脚控制函数: 提供CS_Enable() (拉低CS) 和CS_Disable() (拉高CS) 函数。
void SPI_CS_Low(void) {HAL_GPIO_WritePin(SPI_CS_GPIO_Port, SPI_CS_Pin, GPIO_PIN_RESET);
}
void SPI_CS_High(void) {HAL_GPIO_WritePin(SPI_CS_GPIO_Port, SPI_CS_Pin, GPIO_PIN_SET);
}
  1. 设备特定操作函数: 基于底层函数,根据从设备的数据手册实现具体的命令序列。例如,对于SPI FLASH,会有读取ID、擦除扇区、页编程、读取数据等函数。每个这类函数内部会管理CS的使能/失能,并调用SPI发送/接收函数来交换指令、地址和数据。
// 示例:读取设备ID的伪代码结构
uint16_t Read_Device_ID(SPI_HandleTypeDef *hspi) {uint8_t cmd = DEVICE_READ_ID_CMD; // 特定设备的读ID指令uint8_t id_high, id_low;SPI_CS_Low(); // 片选使能SPI_TransmitReceive(hspi, cmd);      // 发送读ID指令id_high = SPI_TransmitReceive(hspi, DUMMY_BYTE); // 读取高字节ID (可能需要发送虚拟字节)id_low  = SPI_TransmitReceive(hspi, DUMMY_BYTE); // 读取低字节IDSPI_CS_High(); // 片选失能return ((uint16_t)id_high << 8) | id_low;
}
  1. 开发与调试要点:

仔细阅读从设备数据手册: 这是最重要的步骤!数据手册包含了所有关于SPI模式、命令集、时序要求、寄存器映射等关键信息。

时序匹配: 确保CS的建立时间、保持时间,以及SCK、MOSI、MISO之间的时序符合从设备的要求。CS信号必须在SPI数据传输开始前被拉低,并在传输结束后被拉高。

数据帧格式: 确认数据是MSB优先还是LSB优先,以及每个传输单元的位数(通常是8位)。

命令序列: 许多SPI设备需要特定的命令序列来执行操作,例如写使能命令后才能进行写操作。

使用逻辑分析仪或示波器: 这是调试SPI通信非常有用的工具。可以直观地看到SCK, MOSI, MISO, CS信号的波形,检查时序、数据是否正确。
错误处理: 考虑SPI通信可能发生的错误,如超时、模式错误等,并添加适当的错误处理机制 (例如,HAL库函数通常会返回状态)。

从简单操作开始: 先实现并测试最基本的操作,如读取设备ID或状态寄存器,成功后再逐步实现更复杂的功能。

以上步骤提供了一个通用的SPI应用开发框架。针对GD25QXX系列FLASH芯片,其通信依然遵循这些基本原则,但涉及特定的指令集和操作流程,这将在后续章节中详细介绍。

二,SPI CubeMX配置

1,SPI: 模式选择

SPI 模式选择决定了 STM32 在 SPI 总线上扮演的角色以及数据传输的基本方式。

传输模式 (Transmission Mode)

在 CubeMX 的 “Mode” 下拉菜单中选择 SPI 外设的工作模式。

Full-Duplex Master
Full-Duplex Slave
Half-Duplex Master
Half-Duplex Slave
Receive Only Master
Receive Only Slave
Disabled

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。
核心选择: 根据应用需求选择正确的 SPI 角色 (Master/Slave) 和数据传输方式 (Full-Duplex 是主流)。

2,SPI: 数据与帧格式

配置 SPI 传输中每一帧数据的具体格式。

1,帧格式 (Frame Format)

Motorola
TI

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

TI: TI 同步串行帧格式,在 NSS 信号有效期间会产生一个时钟脉冲用于同步,数据传输方式与 Motorola 类似。使用较少,除非外设明确要求。

配置建议: 绝大多数情况选择 Motorola。

2,数据大小 (Data Size)

设置每个 SPI 帧传输的数据位数。
通常可选范围从 4 bits 到 16 bits (具体范围取决于 STM32 型号)。

8 Bits
16 Bits
4 Bits … 7 Bits, 9 Bits … 15 Bits

配置建议: 8 Bits 是最常见的数据大小。如果外设使用16位寄存器或数据,可以选择 16 Bits 以提高效率。小于8位的情况较少见。

3,位顺序 (First Bit)

MSB First
LSB First
MSB First: 最常用 最高有效位 (Most Significant Bit) 先发送。
LSB First: 最低有效位 (Least Significant Bit) 先发送。

配置建议: 查阅从设备数据手册,绝大多数 SPI 设备使用 MSB First。

务必匹配: 帧格式、数据大小和位顺序必须与 SPI 从设备的要求完全一致,否则会导致数据解析错误。

3,SPI: 时钟配置

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

1,波特率预分频器 (Prescaler for Baud Rate)

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

SPI_CLK = Peripheral_Clock / Prescaler_Value

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

配置建议:
首先,查阅从设备数据手册,确定其支持的最大 SPI 时钟频率。
选择一个预分频值,使得计算出的 SPI 时钟速率不超过从设备的最大限制。
初次调试时,可以从一个较低的速率开始 (例如选择较大的预分频值),通信稳定后再逐步提高速率。

2,时钟极性 (Clock Polarity - CPOL)

Low
High
CPOL = Low: SCK 时钟在空闲状态为低电平。
CPOL = High: SCK 时钟在空闲状态为高电平。

3,时钟相位 (Clock Phase - CPHA)

1 Edge (First Edge)
2 Edge (Second Edge)
CPHA = 1 Edge: 数据在 SCK 的第一个时钟边沿被采样。
CPHA = 2 Edge: 数据在 SCK 的第二个时钟边沿被采样。

4,SPI 模式总结 (CPOL/CPHA)

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。

核心配置: 波特率、CPOL 和 CPHA 是 SPI 通信成功的基础。任何一项与从设备不匹配都将导致通信失败。

4,SPI: NSS 管理

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

1,NSS 模式 (Slave Select Management)

在 “Mode” 配置块中,有 “Hardware NSS Signal” 或类似的选项,以及在 “Parameter Settings” 中有 “NSS Signal Type”。

Software
Hardware (Input)
Hardware (Output)

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 或类似。

配置建议: 对于主机模式,Software NSS Management 提供了最大的灵活性,特别是当总线上有多个从设备或需要更精细控制 NSS 时序的场景。硬件 NSS 输出模式虽然简单,但可能不适用于所有情况 (例如,帧间需要保持 NSS 低电平)。

2,NSS 信号极性 (NSS Polarity - 仅硬件模式)

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

Low
High
Low: 常用 NSS 信号低电平有效 (选中从设备)。
High: NSS 信号高电平有效。较少见。

3,NSS 输出脉冲模式 (NSS Pulse Mode - 仅硬件输出)

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

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

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

// 伪代码 - 具体宏和引脚需替换
#define SPIx_NSS_GPIO_PORT GPIOB
#define SPIx_NSS_PIN       GPIO_PIN_12void 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();

5,SPI: CRC 计算

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

1,CRC 计算 (CRC Calculation)

Disabled
Enabled

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 长度和多项式与通信对方的配置一致。

使用场景: CRC 对于在噪声环境或长距离 SPI 通信中保证数据可靠性非常有用。但它会增加少量传输开销 (CRC 字节) 和处理时间。
如果启用 CRC,主机和从机都必须启用并使用相同的 CRC 配置 (多项式、长度、初始值等)。
当 CRC 校验失败时,SPI 外设通常会设置一个错误标志位 (CRCERR),可以触发错误中断。
使用 CRC 时,HAL 库相关函数 (如 HAL_SPI_Transmit_IT, HAL_SPI_Receive_DMA) 会自动处理 CRC 的发送和校验。
如果从设备不支持 CRC 或配置不一致,启用 CRC 会导致通信失败。

6,SPI: DMA 配置

使用 DMA (Direct Memory Access) 可以在 CPU 不干预的情况下自动传输 SPI 数据,显著提高总线利用率和系统性能,特别是在高速或大数据量传输时。

1,添加 DMA 请求 (Add DMA Request)

在 CubeMX 的 SPI 配置页面下找到 “DMA Settings” 标签页。根据需要,可以为发送 (Tx) 和/或接收 (Rx) 添加 DMA 请求。

点击 “Add” 按钮,选择:

SPIx_TX: 用于主机发送数据或从机发送数据。
SPIx_RX: 用于主机接收数据或从机接收数据。

2,DMA 通道配置 (DMA Request Settings)

为每个添加的 DMA 请求 (Tx 或 Rx) 配置参数:

1,Stream/Channel: 选择一个可用的 DMA 通道/流 (CubeMX 通常会自动分配)。

2,Direction: 方向。
SPIx_TX: Memory To Peripheral
SPIx_RX: Peripheral To Memory
(由 CubeMX 自动设置)。

3,Priority: DMA 通道优先级 (Low, Medium, High, Very High)。

4,Mode: DMA 传输模式。
Normal: 常用 传输完指定长度的数据后停止。适用于大多数 SPI 传输。
Circular: 环形模式。当需要连续不断地从 SPI 接收数据 (例如 ADC 连续采样) 或发送固定模式的数据时使用。

5,Increment Address: 地址自增设置。
Peripheral: 不勾选 SPI 数据寄存器 (DR) 地址固定。
Memory: 勾选 内存缓冲区地址需要递增。

6,Data Width: 数据宽度(外设 Peripheral / 内存 Memory)。
如果 SPI Data Size 为 8 Bits: Peripheral: Byte, Memory: Byte。
如果 SPI Data Size 为 16 Bits: Peripheral: Half Word, Memory: Half Word。
确保 DMA 的数据宽度与 SPI 配置的 Data Size 匹配。

配置建议:
对于大数据量或高速 SPI 通信,强烈建议启用 DMA (Tx 和 Rx 都启用)。
Mode 通常设置为 Normal。
Increment Address 勾选 Memory,不勾选 Peripheral。
Data Width 务必与 SPI 的 Data Size 匹配,并使用对应类型的 DMA 缓冲区 (uint8_t[] for Byte, uint16_t[] for Half Word)。
使用 DMA 时,通常还需要配合启用 NVIC 中的 DMA 中断来获知传输完成或发生错误。
HAL 库函数: 启用 DMA 后,应使用带 DMA 的 HAL 函数进行传输,例如:
HAL_SPI_Transmit_DMA(), HAL_SPI_Receive_DMA(), HAL_SPI_TransmitReceive_DMA()。

7,SPI: 中断配置 (NVIC)

SPI 外设可以产生多种中断事件,通知 CPU 传输状态、错误条件或需要处理数据。与 DMA 结合使用时,通常由 DMA 中断处理数据传输完成,而 SPI 中断用于错误处理。

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 自身的数据事件中断。

中断策略:
轮询模式 (不推荐): 不启用任何中断,代码中循环检查状态标志位。效率低下。
中断模式: 启用 SPI 全局中断。在回调函数中处理数据和服务。适用于数据量不大或速率不高的场景。
DMA + 中断模式 (推荐):
启用 DMA 通道中断 (在 DMA 配置中) 来处理数据传输完成 (TxCplt/RxCplt)。
启用 SPI 全局中断来处理 SPI 错误 (ErrorCallback)。
这是最高效的方式。

8,SPI: GPIO 配置

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

1,引脚选择 (Pin Selection)

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

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

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

2,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 输出速度。

关键点:
模式必须是 Alternate Function Push Pull (对于输出信号如主机的SCK/MOSI, 从机的MISO) 或 Alternate Function Input (对于输入信号如主机的MISO, 从机的SCK/MOSI)。
GPIO 速度应设置为 High 或 Very High。
不正确的 GPIO 配置是 SPI 通信失败的常见原因之一。仔细核对每个引脚的角色和配置。

相关文章:

  • 从零开始实现大语言模型(十五):并行计算与分布式机器学习
  • symfonos: 1靶场
  • 算法第21天 | 第77题. 组合、216. 组合总和 III、17. 电话号码的字母组合
  • React方向:react的基本语法-数据渲染
  • API 玩出新花样:我如何构建自己的智能翻译助手
  • 08 Nginx模块
  • 【Docker】Docker Compose方式搭建分布式协调服务(Zookeeper)集群
  • Text2SQL:自助式数据报表开发---0517
  • Java求职者面试:从Spring Boot到微服务的技术点解析
  • 【GESP】C++三级真题 luogu-B3925 [GESP202312 三级] 小猫分鱼
  • 【PostgreSQL系列】PostgreSQL 复制参数详解
  • MLLM常见概念通俗解析(四)
  • 项目的部署发布和访问的流程
  • Jsoup库和Apache HttpClient库有什么区别?
  • 嵌入式学习笔记 - U(S)ART 模块HAL 库函数总结
  • [C++面试] const相关面试题
  • C# 深入理解类(成员常量)
  • Android 性能优化入门(一)—— 数据结构优化
  • 学习黑客Kerberos深入浅出:安全王国的门票系统
  • 利用html制作简历网页和求职信息网页
  • 15年全程免费,内蒙古准格尔旗实现幼儿园到高中0学费
  • 中国纪检监察刊文:力戒形式主义官僚主义关键是要坚持实事求是
  • 联合国:欢迎俄乌伊斯坦布尔会谈,希望实现全面停火
  • 外交部部长助理兼礼宾司司长洪磊接受美国新任驻华大使递交国书副本
  • 昔日千亿房企祥生集团约2.03亿元债权被拍卖,起拍价8000万元
  • 350种咖啡主题图书集结上海,20家参展书店买书送咖啡