stm32之SPI

SPI通信

  • SPI(Serial Peripheral Interface)是由Motorola公司开发的一种通用数据总线
  • 四根通信线:SCK(Serial Clock)、MOSI(Master Output Slave Input)、MISO(Master Input Slave Output)、SS(Slave Select)
  • 同步,全双工
  • 支持总线挂载多设备(一主多从)

硬件电路

  • 所有SPI设备的SCK、MOSI、MISO分别连在一起
  • 主机另外引出多条SS控制线,分别接到各从机的SS引脚
  • 输出引脚配置为推挽输出,输入引脚配置为浮空或上拉输入
移位示意图

SPI时序基本单元

  • 起始条件:SS从高电平切换到低电平
  • 终止条件:SS从低电平切换到高电平
  • 交换一个字节(模式0)
  • CPOL=0:空闲状态时,SCK为低电平
  • CPHA=0:SCK第一个边沿移入数据,第二个边沿移出数据 ==移入数据意思是主机和从机进行数据采样,移出数据理解为将数据移到数据线上。==
  • 交换一个字节(模式1)
  • CPOL=0:空闲状态时,SCK为低电平
  • CPHA=1:SCK第一个边沿移出数据,第二个边沿移入数据
  • 交换一个字节(模式2)
  • CPOL=1:空闲状态时,SCK为高电平
  • CPHA=0:SCK第一个边沿移入数据,第二个边沿移出数据
  • 交换一个字节(模式3)
  • CPOL=1:空闲状态时,SCK为高电平
  • CPHA=1:SCK第一个边沿移出数据,第二个边沿移入数据

SPI时序

  • 发送指令
  • 向SS指定的设备,发送指令(0x06)
  • 指定地址写
  • 向SS指定的设备,发送写指令(0x02), 随后在指定地址(Address23:0)下,写入指定数据(Data)
  • 指定地址读
  • 向SS指定的设备,发送读指令(0x03), 随后在指定地址(Address23:0)下,读取从机数据(Data)

SPI外设简介

  • STM32内部集成了硬件SPI收发电路,可以由硬件自动执行时钟生成、数据收发等功能,减轻CPU的负担
  • 可配置8位/16位数据帧、高位先行/低位先行
  • 时钟频率: fPCLK / (2, 4, 8, 16, 32, 64, 128, 256)
  • 支持多主机模型、主或从操作
  • 可精简为半双工/单工通信
  • 支持DMA
  • 兼容I2S协议
  • STM32F103C8T6 硬件SPI资源:SPI1、SPI2
SPI框图

STM32的硬件SPI模块内置了一个可编程波特率发生器,用于控制SCK时钟线的频率。其核心机制如下:

1. 波特率发生器原理
  • 时钟源 :来自APB总线时钟(APB1APB2,取决于SPI实例)。

  • 分频器 :通过SPI_CR1寄存器的BR[2:0]位(即BaudRatePrescaler)配置分频系数。

  • 计算公式

    SCK 频率=APB 时钟2(BR2:0+1)SCK 频率=2(BR2:0+1)APB 时钟​
    其中 BR[2:0] 取值范围为 0b000~0b111(对应分频系数2~256)。

2. 关键寄存器(以SPI1为例)
寄存器 位域 功能
SPI_CR1 BR[2:0] 波特率预分频设置(见下表)
SPI_CR2 DS[3:0] 数据位数(需与波特率协调)

预分频系数对照表

BR[2:0] 分频值 SCK频率(APB=72MHz时)
000 2 36 MHz
001 4 18 MHz
010 8 9 MHz
011 16 4.5 MHz
100 32 2.25 MHz
101 64 1.125 MHz
110 128 562.5 kHz
111 256 281.25 kHz
3. 配置示例(HAL库)

c

复制代码
hspi1.Instance = SPI1;
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8; // BR[2:0]=010 (8分频)
HAL_SPI_Init(&hspi1);

等效寄存器操作

c

复制代码
SPI1->CR1 |= (0b010 << 3); // 设置BR[2:0]=010
4. 时钟树关联
  • SPI1/SPI4:挂载在APB2总线(通常频率较高,如72MHz)。
  • SPI2/SPI3:挂载在APB1总线(通常频率较低,如36MHz)。

mermaid

复制代码
graph LR
    A[系统时钟] --> B[APB2 Prescaler]
    B -->|72MHz| C[SPI1]
    A --> D[APB1 Prescaler]
    D -->|36MHz| E[SPI2]
5. 波特率极限
条件 最大SCK频率
APB2=72MHz, BR=2 36 MHz
APB1=36MHz, BR=2 18 MHz
实际器件支持(如W25Q128) 通常≤25MHz(需看手册)
6. 注意事项
  1. 从设备兼容性:SCK频率不得超过从设备的最大时钟频率(如Flash芯片可能限制在10MHz)。
  2. 噪声抑制:高频时需缩短走线长度,必要时加终端电阻。
  3. 低功耗模式:在睡眠模式下,APB时钟可能关闭,需重新初始化SPI。
SPI基本结构
主模式全双工连续传输
非连续传输
软件/硬件波形对比
相关推荐
躺不平的理查德4 小时前
STM32时钟树(Clock Tree)
stm32·单片机·嵌入式硬件
&Hello Code8 小时前
2.一套可落地的 STM32 六层架构:基础工程框架搭建
stm32·嵌入式硬件·架构
躺不平的理查德10 小时前
STM32 上拉和下拉
stm32·单片机·嵌入式硬件
czy878747514 小时前
modbus tcp 在线OTA升级407
stm32·嵌入式硬件
茉莉玫瑰花茶1 天前
Windows 平台下的 UDP 客户端
stm32·单片机·嵌入式硬件
笔夏1 天前
【移芯平台CAT1模组】烧写固件
stm32·单片机·学习
十月的皮皮1 天前
STM32从零到量产开发:四路继电器工业控制模块开发— 继电器模块bsp_di.h与 bsp_di.c文件
c语言·stm32·stm32cubemx·hal库
wuyk5551 天前
67.嵌入式C语言进阶:结构体指针实战指南——STM32外设、传感器数据访问的高效技巧
c语言·开发语言·stm32·单片机
风雨中的蜜蜂1 天前
CMT2310A 超低功耗高性能射频收发器概述
stm32·单片机·嵌入式硬件
LCG元2 天前
STM32 ADC 多通道 DMA 采样与数字滤波实战
stm32·嵌入式硬件·microsoft