Cortex-M4-SPI总线-读写W25Q64(二)

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

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芯片

  1. W25Q64 (64M-bit), W25Q16(16M-bit)和W25Q32(32M-bit)是为系统提供一个最小的空间、引脚和功耗的存储器解决方案的串行 Flash 存储器。 25Q系列比普通的串行 Flash 存储器更灵活,性能更优越。基于双倍/四倍的 SPI,它们能够可以立即完成提供数据给 RAM,包括存储声音、文本和数据。芯片支持的工作电压 2.7V 到 3.6V,正常工作时电流小于 5mA,掉电时低于1uA。所有芯片提供标准的封装。
  2. W25Q64/16/32 由每页 256 字节组成。 每页的 256 字节用一次页编程指令即可完成。 每次可以擦除 16 页(1个扇区)、 128 页(32KB 块)、 256 页(64KB 块)和全片擦除。
  3. W25Q64 的内存空间结构: 一页 256 字节,4K(4096 字节)为一个扇区, 16 个扇区为 1 块, 容量为 8M 字节,共有 128 个块,2048 个扇区。
  4. W25Q64/16/32 支持标准串行外围接口(SPI),和高速的双倍/四倍输出,双倍/四倍用的引脚:串行时钟、片选端、串行数据I/O0(DI)、 I/O1(DO)、 I/O2(WP)和 I/O3(HOLD)。 SPI 最高支持80MHz,当用快读双倍/四倍指令时,相当于双倍输出时最高速率 160MHz,四倍输出时最高速率 320MHz。这个传输速率比得上 8位和 16 位的并行 Flash 存储器。
  5. 结构框图如下图所示:
    在这里插入图片描述

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值