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

左上角,核心部分是移位寄存器,右边的数据低位,一位位地从MOSI移出去,然后MISO的数据,一位一位地移入到左侧地数据高位。LSBFIRST可以控制是低位先行(1,LSB)还是高位先行(0,MSB)
右下角,波特率发生器,是用来产生SCK时钟的。CR1寄存器的三个系数BR0,BR1,BR2用来控制分频系数。
NSS引脚,SS是从机选择,低电平有效。通常多从机使用。
SPI基本结构

核心部分位为数据寄存器和移位寄存器。TDR寄存器整体移入移位寄存器,置TXE标志位。移位寄存器整体移入RDR时,置RXNE标志位。
主模式全双工连续传输

性能强,使用复杂。
CPOL=1,CPHA=1,示例使用的是SPI模式3。
第一行,SCK时钟线。在时钟线第一个下降沿,MOSI和MISO移出数据,之后上升沿移入数据,依次进行。
TXE是发送寄存器空标志位。
BSY标志,当有数据传输时,BSY置1。
非连续传输

容易使用,但是损失性能。
硬件SPI读写W25Q64
常用函数
1 | void SPI_I2S_DeInit(SPI_TypeDef* SPIx); |
SPI恢复缺省配置
1 | void I2S_Init(SPI_TypeDef* SPIx, I2S_InitTypeDef* I2S_InitStruct); |
SPI初始化
1 | void SPI_StructInit(SPI_InitTypeDef* SPI_InitStruct); |
SPI结构体初始化
1 | void SPI_Cmd(SPI_TypeDef* SPIx, FunctionalState NewState); |
SPI外设使能
1 | void SPI_I2S_ITConfig(SPI_TypeDef* SPIx, uint8_t SPI_I2S_IT, FunctionalState NewState); |
SPI中断使能
1 | void SPI_I2S_DMACmd(SPI_TypeDef* SPIx, uint16_t SPI_I2S_DMAReq, FunctionalState NewState); |
DMA使能
1 | void SPI_I2S_SendData(SPI_TypeDef* SPIx, uint16_t Data); |
写DR数据寄存器
1 | uint16_t SPI_I2S_ReceiveData(SPI_TypeDef* SPIx); |
读DR数据寄存器
1 | FlagStatus SPI_I2S_GetFlagStatus(SPI_TypeDef* SPIx, uint16_t SPI_I2S_FLAG); |
SPI获取标志位状态