问题描述
最近使用STM32的QSPI驱动W25QXX系列Flash时遇到的一个现象:原子的例程,同样的程序驱动W25Q16JVSIQ没有任何问题,但是驱动W25Q80DVSIG的时候读不到芯片ID,读写数据也都不成功。
问题排查
于是网上搜索了很多相关的问题,确定大概的方向:W25Q80DVSIG上状态寄存器2的QE位没有置1导致,而W25Q16JVSIQ出厂时默认QE位已经置1(也许后缀为Q的型号就是QE出厂置1的意思,未验证,但手册上有提及)
既然出厂时没有帮我们把QE位置1,那我们就自己将它置1就好了。步骤也不难,无非就是先把状态寄存器的写保护位WEL置1,关掉写保护,再把状态寄存器2读出来,读出来的值第2位 置1后再写回状态寄存器2就行了。但问题就在于,原子的例程里初始化FLASH的时候已经有将QE位 置1的代码了。。。
问题解决
经过调试以及研读芯片手册,发现问题所在。
以上几张图是原子例程参照W25Q32(或其他型号)手册写的指令表,这没什么问题,当我找到W25Q80DV芯片手册的指令表时,问题就突显出来了。
W25Q80DV的写入状态寄存器指令只有一条:“0x01”,而W25Q32JV(或其他大部分型号)不同状态寄存器的写入指令是不同的(01h/31h)。W25Q80DV是一条指令就把状态寄存器1和2一起写入:“01h S7-S0 S15-S8”,指令后的第一个字节是状态寄存器1的写入值,第二个字节是状态寄存器2的写入值。所以只要稍微修改一下程序就可以用了,修改如下:
以上就是这次QSPI驱动W25Q80不成功的问题记录以及解决方法,如果有疑问或者有不同见解的朋友欢迎评论区一起交流!