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基本结构
主模式全双工连续传输
非连续传输
软件/硬件波形对比
相关推荐
Deven_Huang9 分钟前
STM32 ADC 使用经验总结与常见踩坑点
stm32·adc
巴巴媛6661 天前
STM32学习笔记【32.BKP + RTC】
笔记·stm32·学习
吠品1 天前
Python字典键获取的四种实用方法
stm32·单片机·嵌入式硬件
追兮兮1 天前
MCUQuickStart:一键生成 STM32 / GD32 的 Keil、CMake、RTOS 工程
stm32·单片机·freertos·gd32·gcc·工程模版
小殷学长1 天前
【单片机毕业设计25-基于stm32的导盲眼镜设计】
stm32·单片机·课程设计
辰哥单片机设计1 天前
STM32智能病房呼叫系统
stm32·单片机·嵌入式硬件
水利行业RTU手艺人2 天前
RTU固件中的“数据保险箱”——离线数据补发系统设计
c++·stm32·单片机·物联网
bu_shuo2 天前
STM32-BOOT的三种启动方式
stm32·单片机·嵌入式硬件
梁朝辉3 天前
STM32H750VBT6中ADCINP与INN什么区别
stm32·单片机·嵌入式硬件
kebidaixu3 天前
两轮车换电 BMS 的模拟前端中颖 SH367306 AFE 芯片详解
stm32