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基本结构
主模式全双工连续传输
非连续传输
软件/硬件波形对比
相关推荐
hsjiasb1 天前
FreeRTOS学习(二十七)——任务栈与栈溢出检测
开发语言·stm32·学习·学习笔记·freertos
cardinal_5082 天前
STM32MP157F-DK2开发板构建交叉编译链
stm32·单片机·嵌入式硬件
振南的单片机世界2 天前
推挽vs开漏:一个“强拉硬灌”,一个“只拉不管”
arm开发·stm32·单片机·嵌入式硬件
小心亦新2 天前
STM32学习23--I2C-1
stm32·嵌入式硬件·学习
嵌入式阿蔡2 天前
STM32时钟树详解:配错一个全乱套
c语言·stm32·单片机·嵌入式硬件
lsz1525902 天前
嵌入式开发第一步:STM32 F1系列功能介绍与快速上手
stm32·单片机·嵌入式硬件·嵌入式开发·可扩展模块
智闲电子设计3 天前
STM32 独立看门狗 IWDG 实战:系统跑飞,它来兜底复位
stm32·单片机·嵌入式硬件
zcmodeltech3 天前
智能制造教学实训沙盘模型多系统协同控制系统设计:基于STM32与Modbus RTU的工业机器人-智慧工厂-数字孪生全场景联动方案
数据库·stm32·嵌入式硬件·机器人·制造·多分类
嵌入式阿蔡3 天前
HAL库 vs LL库 vs 寄存器:到底用哪个?
c语言·stm32·单片机·嵌入式硬件·嵌入式实时数据库
嵌入式阿蔡3 天前
CAN总线入门:从协议帧到STM32实战
c语言·stm32·单片机·嵌入式硬件·嵌入式实时数据库