在完成通过网口的远程更新过程中,我在sdk中将例程srec spi bootloader引导程序跑通可以成功加载功能程序后,无法再用spi相关指令对s25fl256s FLASH进行擦除读写,调试中发现读id正确,读FLASH发现readbuffer中均为0xcc,用vivado读flash数据发现对应区域均为0xff,但是用vivado可以向flash中烧写程序,如下图所示:
在这之前调试flash发送相关指令进行擦除读写时均正确,我猜测是bootloader跑通之后将flash的写保护打开了,需要解保护才能对flash操作,根据s25fl256s数据手册,我尝试过将SR1的BP2、BP1、BP0这三位修改为0以及CR1寄存器的BPNV位设置为1来解除写保护,不仅没有解决问题,反而遇到了更大的错误,原先可以用vivado向flash中烧写文件现在用vivado烧写也失败,报错如下图:
仔细阅读flash数据手册发现CR1的BPNV位是OTP(One Time Program)类型的,即设备出厂后只能更改一次,CR1的BPNV位出厂状态下是0,被改为1后flash每次掉电重新上电后全局写保护始终开启,且无法再次将BPNV位改回去(目前我没找到办法),所以目前我遇到的问题就是如何解除s25fl256sFLASH的写保护,以及srec spi bootloader引导程序是如何给flash加上保护的,我给代码打断点实在没看出来。
想问下大家有没有遇到过这种情况,以及怎么解决的,先谢谢各位了。