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基本结构
主模式全双工连续传输
非连续传输
软件/硬件波形对比
相关推荐
MC_J12 小时前
STM32H7 串口 UART/USART从原理到实战
stm32·单片机·嵌入式硬件
学不懂飞行器12 小时前
电赛保姆级教程】从炸管到国一:电赛电源类(DC-DC/单相逆变)硬核避坑与拓扑全指南
stm32·单片机·嵌入式硬件·电赛·fft
JNX_SEMI13 小时前
EG1160:600V半桥驱动,2.5A强驱带保护
stm32·单片机·嵌入式硬件
qq_4294995713 小时前
STM32串口中断接收
stm32·单片机·嵌入式硬件
爱搬砖的狮子14 小时前
编译appweb源代码
stm32·单片机·嵌入式硬件
hoiii18714 小时前
STM32 开发板上用 USART 实现 Modbus 协议控制设备的方案
stm32·单片机·嵌入式硬件
星夜夏空991 天前
STM32单片机学习(21) —— I2C通信
stm32·单片机·学习
时光の尘1 天前
【STM32实战】ESP8266 通过 MQTT 协议对接 OneNET 云平台实现数据上传与下发(源码可直接移植)
stm32·mqtt·嵌入式·iot·esp8266
北京盟通科技官方账号1 天前
Windows如何实现硬实时?LxWin双系统隔离架构深度解析
stm32·嵌入式硬件·具身智能·ethercat·人形机器人·实时系统·windows实时扩展