STM32 SPI 笔记 | Notes / STM32 | 氵工的博客

STM32 SPI 笔记

发表于 2026-03-25 15:00 485 字 3 min read

This post is not yet available in English. Showing the original.
STM32 SPI 通信基础与实践笔记。

STM32 SPI 笔记

SPI 简介

SPI(Serial Peripheral Interface)是一种同步串行通信接口,由摩托罗拉公司提出。

特点

  • 全双工通信
  • 主从模式(Master/Slave)
  • 同步时钟(SCK)
  • 高速传输(可达数十 Mbps)

信号线

信号全称说明
SCKSerial Clock时钟信号,由主机产生
MOSIMaster Out Slave In主机输出/从机输入
MISOMaster In Slave Out主机输入/从机输出
NSS/CSChip Select片选信号,低电平有效

2. STM32 SPI 工作模式

SPI 工作模式

模式CPOLCPHA采样边沿
000第一个上升沿
101第一个下降沿
210第二个上升沿
311第二个下降沿
  • CPOL:时钟极性(空闲时电平)
  • CPHA:时钟相位(采样时刻)

HAL 库配置示例

初始化代码

// SPI 句柄定义
SPI_HandleTypeDef hspi1;

// SPI 初始化配置
void MX_SPI1_Init(void)
{
    hspi1.Instance = SPI1;
    hspi1.Init.Mode = SPI_MODE_MASTER;
    hspi1.Init.Direction = SPI_DIRECTION_2LINES;
    hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
    hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
    hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
    hspi1.Init.NSS = SPI_NSS_SOFT;
    hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16;
    hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
    hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
    hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
    hspi1.Init.CRCPolynomial = 10;
    
    if (HAL_SPI_Init(&hspi1) != HAL_OK)
    {
        // 初始化错误处理
        Error_Handler();
    }
}

数据收发函数

// 单字节发送
HAL_SPI_Transmit(&hspi1, &txData, 1, HAL_MAX_DELAY);

// 单字节接收
HAL_SPI_Receive(&hspi1, &rxData, 1, HAL_MAX_DELAY);

// 全双工收发
HAL_SPI_TransmitReceive(&hspi1, txBuffer, rxBuffer, size, HAL_MAX_DELAY);

// 中断方式发送
HAL_SPI_Transmit_IT(&hspi1, txBuffer, size);

// DMA 方式发送
HAL_SPI_Transmit_DMA(&hspi1, txBuffer, size);

常见问题

问题可能原因解决方案
通信无数据片选未拉低检查 NSS 引脚配置
数据错位时钟模式不匹配确认主从 CPOL/CPHA 一致
速率过低分频系数过大调整 BaudRatePrescaler
接收数据固定未先发送时钟SPI 需先发数据产生时钟

// TODO :

  • 补充示波器波形图
  • 添加实际项目应用场景
  • 记录调试过程中遇到的问题及解决方案