SR寄存器BP[x:0]位 痞子衡嵌入式:一个关于Segger J-Flash在Micron Flash固定区域下载校验失败的故事( 二 )


其它设计上的区别就不再详细展开了,等用到具体功能查看数据手册再去了解对比 。
三、找到问题原因现在来分析客户问题,Flash 后 1/4 区域在 J-Flash 下校验错误,那我们先修改 polling_transfer 例程去操作 0x1800000 之后的 Sector,发现确实跑不过 。如果不是 Flash 介质问题,也不是读写擦命令问题,那只能有一种解释,那就是 Flash 里这个区域被保护了,Flash 里是有非易失寄存器可以设置软件保护的,但是默认应该是全部区域不保护,而第一小节里我们先跑了 polling_transfer 例程验证 Flash 读写,那大概率这个例程里有修改 Flash 内部寄存器操作,经过排查痞子衡定位到了 flexspi_nor_enable_quad_mode() 函数 。
#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固定区域下载校验失败的故事

文章插图
【SR寄存器BP[x:0]位 痞子衡嵌入式:一个关于Segger J-Flash在Micron Flash固定区域下载校验失败的故事】

经验总结扩展阅读