坊網(wǎng)站建設(shè)seo和sem的概念
W25Q256被寫保護(hù)如何修改
- 1、 W25Q256數(shù)據(jù)讀不到
- 1.1 打印的寄存器的值
- 1.2 可能原因
- 1.3 解決辦法
- 1.4 用到的函數(shù)
1、 W25Q256數(shù)據(jù)讀不到
能夠正確的讀到ID,但是讀到的數(shù)據(jù)不正確
1.1 打印的寄存器的值
0x2
BUSY :只讀, 指令正在執(zhí)行
WEL (1) :只讀,寫使能鎖定,在寫禁止后清零
BP0 - 3:區(qū)塊保護(hù)位
TB :頂層/底層塊保護(hù)
0x7e (0b0111 1110)
CMP :CMP設(shè)置為1時(shí),先前由TB、BP3、BP2、BP1和BP0設(shè)置的陣列保護(hù)將被反轉(zhuǎn),也就是說原本被保護(hù)的現(xiàn)在不保護(hù)了,不保護(hù)的被保護(hù)了
SRP1, SRP0 :狀態(tài)寄存器保護(hù)
SUS :(只讀)暫停狀態(tài)位是狀態(tài)寄存器, 在執(zhí)行擦除/程序暫停(75h)指令后被設(shè)置為1。通過Erase/Program Resume (7Ah)指令以及下電、上電周期,SUS狀態(tài)位被清除為0。
LB1 - 3 :安全寄存器鎖位,為安全寄存器提供寫保護(hù)控制和狀態(tài),LB3-1默認(rèn)狀態(tài)為0,安全寄存器未鎖定。LB3-1可以通過Write Status Register指令單獨(dú)設(shè)置為1。LB3-1是一次可編程(OTP),一旦設(shè)置為1,相應(yīng)的256字節(jié)安全寄存器將永久變?yōu)橹蛔x。
EQ :QSPI使能位,想要從非qspi的模式轉(zhuǎn)化位spi時(shí),在切換模式之前一定要先將標(biāo)志位置一,否則切換模式的命令將會被忽略;當(dāng)在QSPI模式下不能將QE從0改為1
警告:如果/WP或/HOLD引腳直接連接到電源或地面標(biāo)準(zhǔn)SPI或雙SPI操作,QE位不應(yīng)該設(shè)置為1
0x61 (0b0110 0001)
ADS :只讀,表示當(dāng)前設(shè)備運(yùn)行在哪種地址模式下,當(dāng)ADS=0時(shí),設(shè)備為3字節(jié)地址模式,當(dāng)ADS=1時(shí),設(shè)備為4字節(jié)地址模式。
ADP :用于確定設(shè)備上電或復(fù)位時(shí)的初始地址模式。該位僅在上電或設(shè)備復(fù)位初始化期間使用,并且只能由非易失性的Write Status序列(06h + 11h)寫入。當(dāng)ADP=0(出廠默認(rèn)值)時(shí),設(shè)備將啟動到3字節(jié)地址模式,擴(kuò)展地址寄存器必須用于訪問超過128Mb的內(nèi)存區(qū)域。當(dāng)ADP=1時(shí),設(shè)備將直接進(jìn)入4字節(jié)地址模式
WPS :寫保護(hù)選擇位,WPS位用于選擇應(yīng)該使用哪種寫保護(hù)方案。當(dāng)WPS=0時(shí),設(shè)備將使用CMP, TB, BP[3:0]位的組合來保護(hù)存儲器陣列的特定區(qū)域。當(dāng)WPS=1時(shí),設(shè)備將使用單個塊鎖來保護(hù)任何單個扇區(qū)或塊, 當(dāng)在設(shè)備上電或復(fù)位后,所有單獨(dú)塊鎖位的默認(rèn)值為1。
DRV1, DRV2 :輸出驅(qū)動強(qiáng)度(DRV1, DRV0) -易失性/非易失性可寫DRV1和DRV0位用于確定Read操作的輸出驅(qū)動程序強(qiáng)度。
1.2 可能原因
寫保護(hù)被使能,導(dǎo)致不能修改
經(jīng)過檢查發(fā)現(xiàn)所有的地址都被保護(hù)了起來,不能修改、也不能擦除
1.3 解決辦法
查看寄存器手冊,得知只要將寄存器2的CMP位改成0,或者將寄存器1的BP0-BP3改為0就可以,
我選擇將CMP改為0,將整片的Flash的寫保護(hù)都給去掉
-
看到數(shù)據(jù)手冊上說:要寫易變狀態(tài)寄存器位,必須在寫狀態(tài)寄存器指令(狀態(tài)寄存器位WEL保持0)之前執(zhí)行(50h)指令
因?yàn)槌跏蓟臅r(shí)候?qū)EL置1了,所以先將WEL置0
QSPI_Send_CMD(0x04,0,0,QSPI_INSTRUCTION_4_LINES,QSPI_ADDRESS_NONE,QSPI_ADDRESS_8_BITS,QSPI_DATA_NONE);//禁止寫使能,使WEL位為0
W25QXX_Wait_Busy(); //等待命令執(zhí)行完畢
- 要向W25Q256先寫入50h,表示要修改狀態(tài)寄存器中的易失狀態(tài)位
QSPI_Send_CMD(0x50,0,0,QSPI_INSTRUCTION_4_LINES,QSPI_ADDRESS_NONE,QSPI_ADDRESS_8_BITS,QSPI_DATA_NONE);//寫指令50h
W25QXX_Wait_Busy(); //等待命令執(zhí)行完畢
- 寫入31h,表示要修改狀態(tài)寄存器2,緊接著發(fā)送想要發(fā)送的數(shù)值
QSPI_Send_CMD(0x31,0,0,QSPI_INSTRUCTION_4_LINES,QSPI_ADDRESS_NONE,QSPI_ADDRESS_8_BITS,QSPI_DATA_4_LINES);
QSPI_Transmit(&temp,1);//發(fā)送1個字節(jié)
W25QXX_Wait_Busy();//等待命令執(zhí)行完畢
1.4 用到的函數(shù)
//QSPI發(fā)�?�命 ?
void QSPI_Send_CMD(uint32_t Instruction,uint32_t Address,uint32_t DummyCycles,uint32_t InstructionMode ,uint32_t AddressMode , uint32_t AddressSize ,uint32_t DataMode)
{QSPI_CommandTypeDef CmdHandler;CmdHandler.Instruction=Instruction;//指令CmdHandler.Address=Address;//地址CmdHandler.DummyCycles=DummyCycles;//設(shè)置空指令周期數(shù)CmdHandler.InstructionMode=InstructionMode;//指令模式CmdHandler.AddressMode=AddressMode;//地址模式CmdHandler.AddressSize=AddressSize;//地址長度CmdHandler.DataMode=DataMode;//數(shù)據(jù)模式CmdHandler.SIOOMode=QSPI_SIOO_INST_EVERY_CMD;//每次都發(fā)指令CmdHandler.AlternateByteMode=QSPI_ALTERNATE_BYTES_NONE;//無交替字 ?CmdHandler.DdrMode=QSPI_DDR_MODE_DISABLE;//關(guān)閉DDR模式CmdHandler.DdrHoldHalfCycle=QSPI_DDR_HHC_ANALOG_DELAY;// QSPI_HandleTypeDef QSPI_CommandTypeDef TimeoutHAL_QSPI_Command(&hqspi1,&CmdHandler,5000);
}
uint8_t QSPI_Transmit(uint8_t*buf,uint32_t datalen)
{//DLR數(shù)據(jù)長度寄存 ?hqspi1.Instance->DLR=datalen-1; //配置數(shù)據(jù)長度if(HAL_QSPI_Transmit(&hqspi1,buf,5000)==HAL_OK){return 0;//發(fā)�?�數(shù) ?,發(fā)�?�buf數(shù)組中的數(shù)據(jù) ?}else{return 1;}
}
//等待空閑
void W25QXX_Wait_Busy(void)
{while((W25QXX_ReadSR(1)&0x01)==0x01); // 等待BUSY位清空
}