1. 基于HAL库配置SPI1总线
使用STM32CubeMX生成SPI1配置代码,HAL库会自动初始化该函数,因为本来存在虚函数。如下代码所示:
//SPI5底层驱动,时钟使能,引脚配置
//此函数会被HAL_SPI_Init()调用
//hspi:SPI句柄
void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi)
{
GPIO_InitTypeDef GPIO_Initure;
__HAL_RCC_GPIOA_CLK_ENABLE(); //使能GPIOA时钟
__HAL_RCC_SPI1_CLK_ENABLE(); //使能SPI1时钟
//PA5,6,7
GPIO_Initure.Pin=GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7;
GPIO_Initure.Mode=GPIO_MODE_AF_PP; //复用推挽输出
GPIO_Initure.Pull=GPIO_PULLUP; //上拉
GPIO_Initure.Speed=GPIO_SPEED_HIGH; //快速
GPIO_Initure.Alternate=GPIO_AF5_SPI1; //复用为SPI1
HAL_GPIO_Init(GPIOA,&GPIO_Initure);
}
2. W25Q64芯片
- W25Q64 (64M-bit), W25Q16(16M-bit)和W25Q32(32M-bit)是为系统提供一个最小的空间、引脚和功耗的存储器解决方案的串行 Flash 存储器。 25Q系列比普通的串行 Flash 存储器更灵活,性能更优越。基于双倍/四倍的 SPI,它们能够可以立即完成提供数据给 RAM,包括存储声音、文本和数据。芯片支持的工作电压 2.7V 到 3.6V,正常工作时电流小于 5mA,掉电时低于1uA。所有芯片提供标准的封装。
- W25Q64/16/32 由每页 256 字节组成。 每页的 256 字节用一次页编程指令即可完成。 每次可以擦除 16 页(1个扇区)、 128 页(32KB 块)、 256 页(64KB 块)和全片擦除。
- W25Q64 的内存空间结构: 一页 256 字节,4K(4096 字节)为一个扇区, 16 个扇区为 1 块, 容量为 8M 字节,共有 128 个块,2048 个扇区。
- W25Q64/16/32 支持标准串行外围接口(SPI),和高速的双倍/四倍输出,双倍/四倍用的引脚:串行时钟、片选端、串行数据I/O0(DI)、 I/O1(DO)、 I/O2(WP)和 I/O3(HOLD)。 SPI 最高支持80MHz,当用快读双倍/四倍指令时,相当于双倍输出时最高速率 160MHz,四倍输出时最高速率 320MHz。这个传输速率比得上 8位和 16 位的并行 Flash 存储器。
- 结构框图如下图所示:

3. 控制和状态寄存器
3.1 状态寄存器

忙是只读的状态寄存器(S0)被设置为1状态时,表示设备正在执行程序(可能是在擦除芯片)或写状态寄存器指令。这个时候设备将忽略传来的指令, 除了读状态寄存器和擦除暂停指令,写指令或写状态指令无效, 当 S0 为 0 状态时指示设备已经执行完毕,可以进行下一步操作。
3.2 指令表

3.3 W25Q64工作原理
3.3.1 读状态寄存器(05hor35h)

读取状态寄存器的指令是 8 位的指令。 发送指令之前, 先将/ CS 拉低, 再发送指令码“05 h”或者“35h”。 设备收到读取状态寄存器的指令后, 将状态信息(高位)依次移位发送出去, 上图 6 示。读出的状态信息, 最低位为 1 代表忙, 最低位为 0 代表可以操作, 状态信息读取完毕, 将片选线拉高。
/******************************************************
函数功能:读状态寄存器1 -05h
形参:无
返回值:rt_uint8_t status -- 返回从器件的状态(忙或空闲)
说明:发送 05H 读取状态寄存器的值之后, W25Q64 就会一直
返回状态寄存器的值,直到片选被拉高。
*******************************************************/
rt_uint8_t w25qxx_read_status(void)
{
rt_uint8_t status = 0;
SPI_FLASH_CS_LOW(); //拉低片选
spi1_read_write_byte(W25X_ReadStatusReg1); //发送指令 0x05
status = spi1_read_write_byte(0xff); //status = 读数据
SPI_FLASH_CS_HIGH();
return status;
}
3.3.2 写使能(06h)
写使能指令将状态寄存器中的Write Enable Latch (WEL)位设置为1。 WEL位必须在每个页面程序、扇区擦除、块擦除、芯片擦除和之前设置 写入状态寄存器指令。 写使能指令通过驱动/CS low输入,将指令码“06h”移至CLK上升沿的数据输入(Data Input, DI)引脚,然后驱动/CS high。

/******************************************************
函数功能:写使能———0x06
形参:无
返回值:无
说明:在执行每一个写操作之前都需要通过写使能指令将状态
寄存器的 WEL 置 1,让芯片进入写使能状态
*******************************************************/
void w25qxx_write_enble(void)
{
SPI_FLASH_CS_LOW(); //拉低片选--选中从器件
spi1_read_write_byte

本文详细介绍了如何使用STM32CubeMX配置SPI1总线,涉及GPIO初始化、SPI1时钟配置,以及针对W25Q64闪存的操作,如读写状态寄存器、擦除和编程等。重点展示了控制和状态寄存器的工作原理及实际操作函数。
4880

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



