< 返回

问题16:读写W25Q64程序——ID号读取正确,但是写入数据后不能正确读取

本文最后更新时间:2023.8.1

问题原因

可能是芯片处于写保护状态,导致数据无法写入。因为写保护相关的位是掉电不丢失的,所以即使芯片断电重启,也不能自动解除写保护。

img

状态寄存器中和写保护等功能相关的位(非易失性)

解决方法

可以尝试调用写状态寄存器的指令,解除写保护。

请在STM32入门教程的示例代码,11-1 软件SPI读写W25Q64,的基础上,进行如下修改。

1. 请在W25Q64.c文件的最后,加入如下代码,执行写状态寄存器的时序,并在状态寄存器1和状态寄存器2全部写入0x00。

void W25Q64_WriteStatus(void)
{
    W25Q64_WriteEnable(); //写使能
    
    MySPI_Start();
    MySPI_SwapByte(W25Q64_WRITE_STATUS_REGISTER); //发送写状态寄存器的指令
    MySPI_SwapByte(0x00); //写入状态寄存器1
    MySPI_SwapByte(0x00); //写入状态寄存器2
    MySPI_Stop();
    
    W25Q64_WaitBusy();  //等待忙
}
img

代码示例

2. 请在W25Q64.h文件函数声明的位置,加入如下代码,声明函数。

void W25Q64_WriteStatus(void);
img

代码示例

3. 请在main.c文件,W25Q64_Init函数之后,加入如下代码,调用函数,执行功能。

W25Q64_WriteStatus();
img

代码示例

如果成功解除了写保护,后续默认会保持解除保护的状态,就不再需要调用此函数了。

写入状态寄存器的时序依据如下。先写入一个指令0x01,再连续写入两个字节,即对应分别写入状态寄存器1和状态寄存器2。

img

写状态寄存器指令

img

写状态寄存器时序


< 返回