1. SPI通信基础与STM32寄存器概览
SPI(Serial Peripheral Interface)是一种高速、全双工、同步的串行通信协议,广泛应用于微控制器与外部设备(如传感器、存储器、显示屏等)的数据交换。STM32的SPI外设通过直接操作寄存器可以实现灵活高效的通信控制,尤其适合对性能要求较高的场景。与库函数方式相比,寄存器级操作能更精细地控制时序和状态,减少资源开销,但需深入理解每个寄存器的功能。
STM32的SPI主要涉及三个核心寄存器:CR1(控制寄存器1)、SR(状态寄存器)和DR(数据寄存器)。CR1用于配置通信模式、数据格式、时钟极性等;SR提供传输状态(如发送完成、接收就绪);DR则是数据交换的缓冲区。实际项目中,我常遇到初学者因配置不当导致通信失败,例如时钟极性错误或状态标志未正确检测。下面通过W25Q64 FLASH芯片的实战案例,一步步解析如何通过寄存器实现可靠通信。
注意:不同系列的STM32芯片(如F1、F4、H7)的SPI寄存器地址可能略有差异,但基本功能一致。操作前需查阅对应芯片的参考手册(Reference Manual)。
2. 硬件电路与引脚配置
SPI通信需4条基本信号线:
- MOSI(主出从入):主机发送数据到从机。
- MISO(主入从出):从机发送数据到主机。
- SCK(时钟线):由主机产生,同步数据交换。
- CS(片选线):主机控制从机的使能信号,通常使用软件控制(GPIO模拟)而非硬件NSS引脚,以提高灵活性。
以STM32F103为例,SPI1挂载在APB2总线(最高72MHz),SPI2/3挂载在APB1总线(最高36MHz)。配置引脚时需将MOSI、MISO、SCK设置为复用推挽输出(AF_PP),CS引脚设为普通推挽输出(Out_PP)。以下是GPIO初始化代码示例(以SPI1为例,使用PA5、PA6、PA7引脚):
// 使能时钟
RCC->APB2ENR |= (1 << 2); // 使能GPIOA时钟
RCC->APB2ENR |= (1 << 12); // 使能SPI1时钟
// 配置PA5(SCK)、PA7(MOSI)为复用推挽输出
GPIOA->CRL &= ~(0xFF << 20); // 清空PA5/7配置位
GPIOA->CRL |= (0xB << 20) | (0xB << 28); // PA5/7复用输出,50MHz
// 配置PA6(MISO)为上拉输入
GPIOA->CRL &= ~(0xF << 24);
GPIOA->CRL |= (0x8 << 24); // 上拉输入模式
// 配置PA4(CS)为推挽输出(软件片选)
GPIOA->CRL &= ~(0xF << 16);
GPIOA->CRL |= (0x3 << 16); // 输出模式,50MHz
GPIOA->ODR |= (1 &l


3353

被折叠的 条评论
为什么被折叠?



