使用W25Q64,之前可以正常读写使用,但是突然无法写入,解决办法

W25Q64只能读取无法写入问题 

 1.问题现象

        使用W25Q64使用硬件SPI读取数据的时候,本来可以正常使用,但是在一次烧录程序后,突然发现W25Q64竟然无法在写入了。原本以为是代码的问题,但是这个代码是从网上根据江科大的视频写的。既然别人都能读,应该代码本身没有问题。后来又尝试了软件模拟SPI读写,但是问题依旧。

2.出现问题原因

        后来尝试读取W25Q64的状态寄存器—1,读出的数据是0x1010 1110,再查看原始数据手册的状态寄存器(BP2 BP1 BP0 )是芯片的块保护(出场时默认0 0 0,也就是默认不保护),TB位是选择顶端保护(TB = 0)还是底部保护(TB = 1),因此这个芯片在使用过程中,不知道什么原因导致芯片被部分保护了。 

总线忙标志位(BUSY)

        BUSY位是一个只读位,在状态寄存器中的S0位。当W25Q64在执行“页编程”、“扇区擦除”、“块区擦除”、“芯片擦除”以及“写状态寄存器”指令时,该位被硬件自动置1。这时候,除了“读状态寄存器”指令外的所有操作指令讲会被芯片忽略。当芯片执行完这些指令后,硬件会自动将该位清零,表示芯片器件可以接收其他的指令。

写保护位(WEL)

        WEL位是一个只读位,在状态寄存器的S1位。在执行完“写使能”指令后,该位会被硬件自动置1。当芯片掉电后和执行“写禁能”、“页编程”、“扇区擦除”、“块区擦除”以及“芯片擦除”指令都会进入“写保护状态”。

块区保护位(BP2、BP1、BP0)

        BP2、BP1、BP0这3位为可读可写位,分别在状态寄存器的S4、S3以及S2位。这3个位默认状态为0,即块区处于未保护状态。可以利用“写状态寄存器”指令对这几个位进行置1来达到块区保护的目的。块区保护状态为:没有保护、部分保护和全部保护状态。

注:当状态寄存器的SRP位为1或读写保护管脚(/WP)为低电平时,这3个位不可被更改。

底部和顶部块保护位(TB)

        TB位是一个可读可写位,在状态寄存器的S5位,默认值为0。可以利用“写状态寄存器”指令对这个位进行置1或清零。当TB = 0时,表示保护位从顶部开始,当TB = 1时,表示保护位从底部开始。

注:当状态寄存器的SRP位为1或读写保护管脚(/WP)为低电平时,这个位不可被更改。

扇区/块保护(SEC)

        SEC位为一个可读可写位,在状态寄存器的S6位,默认值为0。可以利用“写状态寄存器”指令对这个位进行置1或清零。当SEC = 0时,表示每次保护的区域大小为4K;当SEC = 1时,表示每次保护的区域大小为8K。
        上述为W25Q64的状态寄存器1、2的各位解释及注意事项。

PS:以上寄存器详细解释出自->原文链接:https://blog.csdn.net/lalala098/article/details/81302579

状态寄存器保护位(SRP SRL )

       SRP SRL分别为状态寄存器2和状态寄存器1的位,芯片的状态寄存器的保护方式由SRP SRL与WP引脚共同决定,不同的组合决定以下五种保护方式:软件保护,硬件保护,硬件非保护,供电锁定和一次性可编程(OTP)保护。可以通过状态寄存器的读写来改变这里的保护方式。

 3.解决办法步骤及代码

        使用数据手册可以看到在修改寄存器数据之前的前提是芯片WP引脚为高电平,芯片处于非保护状态,然后就可以使用写状态寄存器修改状态寄存器的值(修改之前需要先使能状态寄存器写(Volatile SR Write Enable指令码(50h))),下面是详细代码:

//修改SR1寄存器的值
void W25Q64_WriteSR_1(uint8_t Data){
	
	MySPI_Start();
	MySPI_SwapData(W25Q64_SR_WRITE_ENABLE);//使能状态寄存器写入(50h)
	MySPI_Stop();
	
	MySPI_Start();
	MySPI_SwapData(W25Q64_WRITE_STATUS_REGISTER_1);//状态寄存器写入指令(01h)
	MySPI_SwapData(Data);        //要写入的数据
	MySPI_Stop();
	
}

//获得SR1寄存器的值
uint8_t W25Q64_GetSR_1(void){
	uint8_t SR_2_Data;
	MySPI_Start();
	MySPI_SwapData(W25Q64_READ_STATUS_REGISTER_1);
	SR_2_Data = MySPI_SwapData(W25Q64_DUMMY_BYTE);
	MySPI_Stop();
	
	return SR_2_Data;
}

int main(){
     W25Q64_WriteSR_1(W25Q64_GetSR_1() & 0xE3);//只修改(BP2 BP1 BP0),其他位按需修改 
}

 4.问题验证

        这一章节只是当时发现问题,发现芯片并没有整片保护而是只保护了一部分。而验证这个芯片护了哪几个扇区。由手册知:

         已知我读取的状态寄存器一的数据为0x1010 1110,对应手册1011,也就是保护了0-7Blocks,地址由0x000000-0x7FFFFF。最后发现果然从0x800000处开始读写没有问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值