spi的相关配置
SPI(串行外设接口)是一种全双工同步串行通信协议,支持多种传输模式和数据格式配置。主要模式包括全双工主/从(最常用)、半双工和仅接收模式。数据传输时需配置帧格式(Motorola标准或TI特殊格式)、数据位宽(4-16位)和位序(MSB或LSB优先)。时钟配置涉及波特率分频、极性(CPOL)和相位(CPHA),组合形成四种SPI模式(0-3),需与从设备匹配。NSS(片选)信号可通过硬件或软件管
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。
数据与帧格式
- 帧格式(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 和时钟脉冲的时序匹配。
- 数据大小(data size)
设置每个 SPI 帧传输的数据位数。“帧”是指一次完整的数据传输单元。简单来说,它是主设备和从设备在一次 SPI 通信中交换的一个固定长度的数据块。
通常可选范围从 4 bits 到 16 bits (具体范围取决于 STM32 型号)。
- 位顺序(first bit)
- MSB First: 最常用 最高有效位 (Most Significant Bit) 先发送。
- LSB First: 最低有效位 (Least Significant Bit) 先发送。
时钟配置
配置 SPI 的 SCK 时钟频率 (波特率) 和时钟模式 (极性 CPOL 与相位 CPHA)。
-
波特率预分频器(prescaler for rate)
-
通过选择一个预分频值来设置 SPI 的通信速率。SPI 时钟由连接到 SPI 外设的总线时钟 (通常是 APB1 或 APB2 时钟) 分频得到。
SPI_CLK = Peripheral_Clock / Prescaler_ValueCubeMX 会显示可选的预分频值 (如 2, 4, 8, 16, …, 256) 以及基于当前外设时钟计算出的实际波特率。
-
-
时钟极性(clock polarity -cpol)
- CPOL = Low: SCK 时钟在空闲状态为低电平。
- CPOL = High: SCK 时钟在空闲状态为高电平。
-
时钟相位(clock phase -cpha)
- CPHA = 1 Edge: 数据在 SCK 的第一个时钟边沿被采样。
- CPHA = 2 Edge: 数据在 SCK 的第二个时钟边沿被采样。
-
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 外设提供了硬件和软件两种管理方式。
-
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或类似。
-
-
信号极性(NSS polarity)
仅在 NSS 由硬件管理 (Hardware Input/Output) 时可配置。
- Low: 常用 NSS 信号低电平有效 (选中从设备)。
- High: NSS 信号高电平有效。较少见。
-
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 值,以检测传输错误,增强数据完整性。
-
CRC计算(CRC Caculation)
- Disabled: (默认/常用 )不使用 CRC 功能。
- Enabled: 启用 CRC 计算和校验。启用后,SPI 外设会在发送数据时自动附加 CRC 值,并在接收数据时自动校验 CRC。
-
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 位,取决于具体型号和数据帧长度)。你需要输入多项式的低位部分。
-
-
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)
-
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): 根据系统需求合理配置。
- 不使用 DMA,中断驱动模式: 必须启用 SPI 全局中断。在代码中,你会使用如
-
-
相关的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 正常工作的基础。
- 引脚选择(Pin Setection)
在 CubeMX 的 Pinout 视图中,找到要使用的 SPI 外设 (如 SPI1),点击其 MOSI, MISO, SCK 功能,然后在右侧的芯片引脚图中选择具体的物理引脚。
如果使用软件 NSS, 也需要选择一个通用 GPIO 引脚作为 NSS。
一个 SPI 功能通常可以映射到多个不同的 GPIO 引脚上,根据 PCB 布局选择合适的引脚。
- 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。
- 主机模式: GPIO_Output (Push Pull), 初始电平
- 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 输出速度。
- MOSI (Master Out Slave In):
- 在 CubeMX 的 SPI 配置页面下,切换到 “GPIO Settings” 标签页 (或直接在 Pinout 视图中点击引脚配置),可以查看和微调已选定引脚的配置:
更多推荐



所有评论(0)