痞子衡最近在支持一个 i.mxrt1170 欧美客户,客户项目里选用了来自 micron 的四线 nor flash - mt25ql256aba8e12-0aat 作为启动设备,一般读写倒是没有问题,但是在 segger j-flash 下烧写遇到了特定区域内校验失败的问题。
从痞子衡过往丰富的 flash 支持经验来看,亚太区客户一般选用 issi(芯成)/winbond(华邦)/mxic(旺宏)/gigadevices(兆易创新) 的 flash 比较多,痞子衡对这些厂商 flash 可以说是门清了。这个欧美客户选用的是痞子衡不太熟的 micron(镁光) 产品,借着这个问题,痞子衡带大家一起稍微深入地了解下 micron flash 产品:
一、引出客户问题
首先是复现下客户的问题,痞子衡找了块 mimxrt1170-evk 开发板,将板载其他厂商 flash 换成这颗 mt25ql256aba8e12-0aat(因为是 t-pbga24 封装,所以需要放到原来的 octalflash 位置 - u21),然后将 sdk_2.11.1_mimxrt1170-evkoardsevkmimxrt1170driver_examplesflexspi orpolling_transfer 例程稍作适配性修改,主要是将 customlut 里的命令表按 micron 数据手册命令表做调整(全用了四字节地址命令),然后跑了一下例程发现基本的 flash 读写擦操作没有问题(默认操作的是 0x14000 处的 sector),这表明硬件修改没有问题。
const uint32_t customlut[custom_lut_length] = { /* fast read quad mode - sdr */ [4 * nor_cmd_lut_seq_idx_read_fast_quad] = flexspi_lut_seq(kflexspi_command_sdr, kflexspi_1pad, 0xec, kflexspi_command_raddr_sdr, kflexspi_4pad, 0x20), [4 * nor_cmd_lut_seq_idx_read_fast_quad + 1] = flexspi_lut_seq(kflexspi_command_dummy_sdr, kflexspi_4pad, 0x0a, kflexspi_command_read_sdr, kflexspi_4pad, 0x04), /* erase sector */ [4 * nor_cmd_lut_seq_idx_erasesector] = flexspi_lut_seq(kflexspi_command_sdr, kflexspi_1pad, 0xdc, kflexspi_command_raddr_sdr, kflexspi_1pad, 0x20), /* page program - quad mode */ [4 * nor_cmd_lut_seq_idx_pageprogram_quad] = flexspi_lut_seq(kflexspi_command_sdr, kflexspi_1pad, 0x34, kflexspi_command_raddr_sdr, kflexspi_1pad, 0x20), [4 * nor_cmd_lut_seq_idx_pageprogram_quad + 1] = flexspi_lut_seq(kflexspi_command_write_sdr, kflexspi_4pad, 0x04, kflexspi_command_stop, kflexspi_1pad, 0x00),};
接下来就是按客户操作流程来复现 segger j-flash 烧写校验失败问题,客户其实是尝试烧写全部 32mb 数据来查看 j-flash 及其配套下载算法能否适用这颗 flash,这里痞子衡就用 《超级下载算法rt-ufl v1.0》,经过测试,确实复现了客户的问题。
经过反复测试,定位了问题是这颗 micron 32mb 的 flash 前 3/4 区域(0x0 - 0x17fffff)是没问题的,但是在后 1/4 区域(0x1800000 - 1ffffff)均会出现校验错误(j-flash软件里看擦写操作是能进行的,但后面发现其实根本没有正常擦写)。
二、micron quadspi nor flash有什么不同?
在分析客户问题之前,我们先来简单认识一下这颗 micron nor flash,痞子衡浏览了 micron 的官网以及这颗 flash 的数据手册,发现它确实跟其他厂商的 nor flash 设计有点区别。
首先是 flash 容量,其他厂商一般都是能够提供从 512kb 到 2gb 全范围的 flash 产品,但是 micron 串行 nor flash 最小容量就是 128mb,果然是国际 memory 大厂,设计就是豪横。但是从 flash 作为 xip 启动设备角度而言,128mb 其实挺多的,普通的嵌入式项目没有这么大的代码存储需求。
其次是 nor flash 里的高频问题 《qe bit 设计》,一般 flash 的 io2/3 引脚复用功能都是通过内部状态寄存器里的 qe 位来控制,qe 关闭则 io2/3 是 reset#/hold#/wp# 功能:如果 qe 开启则 io2/3 用于数据传输(这种情况下才可以用 quad i/o 相关命令)。
然而 micron flash 根本就没有 qe 位控制,io2/3 功能主要靠当前命令类型来决定:如果是 single spi 或者 dual i/o spi 命令,则 io2/3 是 reset#/hold#/wp# 功能;如果是 quad i/o spi 命令,则 io2/3 用于传输数据。
其它设计上的区别就不再详细展开了,等用到具体功能查看数据手册再去了解对比。
三、找到问题原因
现在来分析客户问题,flash 后 1/4 区域在 j-flash 下校验错误,那我们先修改 polling_transfer 例程去操作 0x1800000 之后的 sector,发现确实跑不过。如果不是 flash 介质问题,也不是读写擦命令问题,那只能有一种解释,那就是 flash 里这个区域被保护了,flash 里是有非易失寄存器可以设置软件保护的,但是默认应该是全部区域不保护,而第一小节里我们先跑了 polling_transfer 例程验证 flash 读写,那大概率这个例程里有修改 flash 内部寄存器操作,经过排查痞子衡定位到了 flexspi_nor_enable_quad_mode() 函数。
#define flash_quad_enable 0x40uconst 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] 设置是非易失性的(断电不丢失)。
再进一步往下找 bp[3:0] 设置与 flash 空间对应关系,发现 4'b1000 设置就是保护后 1/4 区域里的所有 block,至今似乎真相大白了。为了验证发现,我们需要将 status register 重设为 0x00,然后再用 j-flash 烧写一次,这时候校验失败问题消失了,一切恢复正常。
回顾这个故事,如果痞子衡事先不用 polling_transfer 例程去操作一次 flash,或者即使跑了例程但事先意识到了 micron flash 没有 qe 设计而删除 flexspi_nor_enable_quad_mode() 函数,也就无法复现客户问题了,这也是本次故事里最神奇的地方,客户和痞子衡犯了同样的失误,也许这就是缘分?
高压功率放大器在复合材料冲击损伤检测技术中的应用
区块链可使商家和供应商受益的10种方式
oppor11s和oppor11区别对比评测
D锁存器快速入门教程
夯实基础是我国制造企业当前发展的第一要务
关于Segger J-Flash在Micron Flash固定区域下载校验失败的故事
三星Galaxy A9 Star强攻年轻人市场,进一步释放自己的“品牌力”
贸泽电子宣布2014智能硬件创新设计大赛圆满收官
OneMO模组赋能物联新趋势 携手共创智联新时代
霍尔电流传感器在电子点焊机中的应用
放大器的所有这些干扰从哪里来?
索尼表示希望尽最大可能争取到新主机的合理价格
联发科明年 5G 芯片的出货量可能超过 1.2 亿片
华芯微特SWM341系列MCU应用扫地机器人方案
小型自动气象站组成和应用
苹果出OLED版iPhone8 夏普已经开始准备了
智慧广电 未来视听——中国(北京)国际视听大会(CIAC2023)圆满闭幕
在PCB板中进行差分信号线布线的优势分析
6月15起正式施行!利尔达客思牵头起草教育照明团体标准!
创凌TL6256PSC 5G WiFi双频模块特性介绍