SR寄存器BP[x:0]位 痞子衡嵌入式:一個關于Segger J-Flash在Micron Flash固定區域下載校驗失敗的故事( 二 )


#define FLASH_QUAD_ENABLE0x40Uconst uint32_t customLUT[CUSTOM_LUT_LENGTH] = {/* Enable Quad mode */[4 * NOR_CMD_LUT_SEQ_IDX_WRITESTATUSREG] =FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x01, kFLEXSPI_Command_WRITE_SDR, kFLEXSPI_1PAD, 0x04),};int main(void){// 代碼省略/* Enter quad mode. */status = flexspi_nor_enable_quad_mode(EXAMPLE_FLEXSPI);if (status != kStatus_Success){return status;}// 代碼省略}第二小節介紹里我們知道 Micron Flash 是沒有 QE 位設計的,因此 flexspi_nor_enable_quad_mode() 函數在這里是多余的,這個函數是將 0x40 寫入到了命令標號為 0x01 的 Status Register(這個操作適用于 ISSI Flash),我們在數據手冊里找到這個寄存器定義,發現被置位的 bit 6 是塊保護控制位 BP[3:0] 里的最高位,并且 BP[3:0] 設置是非易失性的(斷電不丟失) 。

SR寄存器BP[x:0]位 痞子衡嵌入式:一個關于Segger J-Flash在Micron Flash固定區域下載校驗失敗的故事

文章插圖
再進一步往下找 BP[3:0] 設置與 Flash 空間對應關系,發現 4'b1000 設置就是保護后 1/4 區域里的所有 block,至今似乎真相大白了 。為了驗證發現,我們需要將 Status Register 重設為 0x00,然后再用 J-Flash 燒寫一次,這時候校驗失敗問題消失了 , 一切恢復正常 。
SR寄存器BP[x:0]位 痞子衡嵌入式:一個關于Segger J-Flash在Micron Flash固定區域下載校驗失敗的故事

文章插圖
回顧這個故事,如果痞子衡事先不用 polling_transfer 例程去操作一次 Flash,或者即使跑了例程但事先意識到了 Micron Flash 沒有 QE 設計而刪除 flexspi_nor_enable_quad_mode() 函數,也就無法復現客戶問題了,這也是本次故事里最神奇的地方,客戶和痞子衡犯了同樣的失誤,也許這就是緣分?
至此,一個關于Segger J-Flash在Micron Flash固定區域下載校驗失敗的故事痞子衡便介紹完畢了,掌聲在哪里~~~
歡迎訂閱文章會同時發布到我的 博客園主頁、CSDN主頁、知乎主頁、微信公眾號 平臺上 。
微信搜索"痞子衡嵌入式"或者掃描下面二維碼,就可以在手機上第一時間看了哦 。
SR寄存器BP[x:0]位 痞子衡嵌入式:一個關于Segger J-Flash在Micron Flash固定區域下載校驗失敗的故事

文章插圖

推薦閱讀