大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是导致串行NOR Flash在i.MXRT下无法正常下载/启动的常见因素之QE bit。
i.MXRT系列MCU发布已两年多了,基于i.MXRT的客户产品也越来越多,可以说是全面开花了。痞子衡作为i.MXRT产品线的系统应用工程师,早期的时候还可以尽情做参考设计,现在基本大量时间都被客户支持占据了。
因为i.MXRT系列都没有内置Flash(RT1064, RT1024等SIP型号除外),因此为其搭配一块串行NOR Flash去启动是客户项目的头等大事,而串行NOR Flash厂商非常多,客户选择余地很大,因此我们不得不与客户一起同茫茫Flash型号打交道,痞子衡也常常调侃自己已沦为Flash测试工程师。
痞子衡在支持客户解决串行NOR Flash下载启动问题过程中主要遇到几个常见因素,这几个因素可能会影响Flash在i.MXRT下无法正常使用,上篇痞子衡讲了 《SFDP因素》, 今天痞子衡重点跟大家聊聊QE bit这个因素。
一、什么是QE bit?
QE是Quad Enable的缩写,中文叫四线使能,我们需要结合i.MXRT EVK上默认放置的QSPI NOR Flash(ISSI IS25WP064AJBLE)来解释这个概念。
1.1 QE定义
如下是 IS25WP064AJBLE 的引脚图,也是最经典的QSPI NOR Flash封装形式(SOIC-8),8个引脚,除去必备的电源和地,还剩6根信号线。这6根信号线中用蓝色框括起来的Pin1/2/5/6即嵌入式通讯里常见的SPI接口。除此以外,还有2根用绿色框括起来的信号线Pin3/7,它俩是功能复用的,要解释QE,就跟它俩功能定位有关。
QE往简单了说就是,Pin3/7用作IO2/3当数据传输功能,即是QE使能;而Pin3/7用作WP#、HOLD#控制功能则是QE不使能。
1.2 QE意义
QE不使能Pin3/7用作WP#、HOLD#功能这个很好理解,就是通过外部引脚电平设置来保护Flash数据安全(主要是不被误擦写)。那么QE使能有什么意义呢?这得要从QSPI NOR Flash工作模式说起。
一个标准的NOR Flash操作时序正常由:CMD + ADDR + dummy + DATA 四部分组成,怎么传输这些数据决定了Flash工作模式。从大的分类来说,Flash工作模式分为两种,即SPI模式和QPI模式:
- SPI模式:数据线IO0是大哥,CMD只能由IO0发出,其他数据传输可以跟IO[3:1]一起上(具体怎么上,方式特别多,后面会介绍)
- QPI模式:四根数据线IO[3:0]地位对等,所有数据传输都是四兄弟一起上,从I/O使用效率来说,属它最高。
Flash芯片默认上电都是在SPI模式,需要在SPI模式下发送特殊的命令(QPIEN - 0x35)才会进入QPI模式,而且进入QPI模式后,QE控制功能就不生效了(无论QE什么设置,都相当于QE使能状态),原因是QPI模式下必须IO[3:0]一起上。因为i.MXRT BootROM默认不支持QPI模式(想做也行,但麻烦),所以我们仅讨论SPI模式。
Flash操作主要是读、写、擦,我们就以最常见的读来讨论SPI模式。继续翻看 IS25WP064AJBLE 手册,找到其命令集,可以看到读相关的命令特别多,一共有9种。不算DTR(双边沿采样)的话光SDR下(单边沿采样)就有6种,痞子衡前面说过,SPI模式下IO[3:0]具体怎么传数据方式很多就体现在这里。
痞子衡重点介绍效率最低的Normal Read Mode(NORD - 0x03)和效率最高的Fast Read Quad I/O(FRQIO - 0xEB)。下图是两者时序对比图,可以看到NORD模式下(下图左边),仅使用IO[1:0],IO0负责发送命令、地址,IO1负责收数据,并且SCK最高50MHz;而FRQIO模式下(下图右边),除了IO0发送命令外,其余地址、数据都是由IO[3:0]一起完成的,而且SCK可达133MHz,效率堪比QPI模式了。
为了充分利用Flash去执行代码(XIP),我们肯定希望Flash能工作在FRQIO模式下,而FRQIO模式能否正常使用显然取决于QE设置。
二、QE bit位置差异
前面介绍了QE功能,那么在Flash里是如何设置QE功能的呢?其实Flash内部除了Memory块外,通常还有一些寄存器来记录用户配置或保存状态。
2.1 几个不同QE bit设计
如下是 IS25WP064AJBLE 的状态寄存器(Status Register),其有仅有一个SR,其中SR1[6]即是QE bit,用以设置QE功能,并且需要注意的是QE bit是非易失性的,这意味着Flash即使掉过电,这个QE设置还在。
IS25WP064AJBLE 里读写SR有专门的CMD,其中写SR命令字(WRSR)是常见的0x01:
是不是所有厂商的Flash都统一按上面这样来设计QE bit的呢?很遗憾,并不是!让我们再来看一款来自华邦的 W25Q64JVSIM,其内部共有三个SR,而SR2[1]才是QE bit:
W25Q64JVSIM 里读写SR有三组CMD,其中用于设置QE的写SR2命令字是0x31:
看起来在QE bit设计这一块,各厂商Flash不一定是一样的,据痞子衡所知,目前市面上至少存在四种不一样的QE bit设计,痞子衡就不一一列举了。更有甚者,同一个厂商的不同系列Flash的QE设计也可能不一样,比如兆易创新的Flash。
2.2 SFDP - JESD216A规范
对于存在的不同的QE bit设计,想要用一套软件驱动去开启QE,变得有点困难,那该怎么办?这时候JEDEC站了出来。痞子衡在 《SFDP因素》 一文第一节里提到JESD216标准从2011年开始至今发展了5个版本,其中最初的版本JESD216里没有对于QE bit位置的定义(SFDP里Basic Flash Parameter Table仅包含9个DWORD),从JESD216A开始QE bit位置信息也被记录在了SFDP表中(Basic Flash Parameter Table扩展到16个DWORD),QE bit信息就记录在如下Table 15:
所以对于不支持SFDP或者仅是JESD216版本SFDP的Flash,我们需要手动查其数据手册找到QE bit信息。而JESD216A及以上版本的Flash,我们直接读出SFDP表即可知道QE bit信息。
三、默认QE bit状态
现在我们对QE bit已经有了全面的了解,还剩最后一个问题,各厂商的Flash出厂时其QE bit初始是什么状态?据痞子衡了解,每个厂商几乎同时都有QE默认是开或者关的Flash型号,这在Part Number上会有体现,比如下面华邦W25Q系列的命名规则,最后一位代表了默认QE状态:
其他Flash厂商关于QE状态的命名规则各有不同,需要自行查看手册去了解。
四、在i.MXRT下如何处理不同QE bit的Flash
现在我们开始探讨不同QE bit情况对于i.MXRT下载启动的影响,第一步是查看Flash是否有SFDP,以及明确其SFDP版本。
4.1 明确SFDP版本
以i.MXRT EVK上默认IS25WP064AJBLE这款Flash为例,从数据手册里看,其支持SFDP,但是找不到具体JESD216版本,所以需要我们直接从Flash里读出SFDP,找到第一个Parameter Header里的Minor Revision,发现其值是0x06,即JESD216B。
- enum
- {
- kSfdp_Version_Major_1_0 = 1,
- kSfdp_Version_Minor_0 = 0, // JESD216
- kSfdp_Version_Minor_A = 5, // JESD216A
- kSfdp_Version_Minor_B = 6, // JESD216B
- kSfdp_Version_Minor_CD = 7, // JESD216C, JESD216D, JESD216D.01
- };
4.2 设定QE信息去下载
因为IS25WP064AJBLE的SFDP版本较高,所以其QE信息可以不从手册里查看了,而如果Flash不支持SFDP或者SFDP是初版,则需要查数据手册记录QE bit位置及初始状态。
我们知道无论是Jlink还是各大IDE下载算法或是痞子衡的MCUBootUtility工具,在i.MXRT下基本都是同一套下载算法设计,即 《ROM API实现IAP》 中2.2节那样的用法。对于经典的四线QSPI NOR,我们只需要简单修改option值即可。
对于i.MXRT1060下的IS25WP064AJBLE,我们直接设option = 0xc0000008。即标准四线,速度为133MHz,QE默认是NotConfig(注意option[11:8]表示QuadMode),为什么QE设NotConfig?那是因为这颗Flash的SFDP版本高,下载算法能从SFDP中找到QE信息并且会尝试使能它。
- enum
- {
- kSerialNorQuadMode_NotConfig = 0,
- kSerialNorQuadMode_StatusReg1_Bit6 = 1,
- kSerialNorQuadMode_StatusReg2_Bit1 = 2,
- kSerialNorQuadMode_StatusReg2_Bit7 = 3,
- kSerialNorQuadMode_StatusReg2_Bit1_0x31 = 4,
- };
而如果Flash是非SFDP或JESD216且QE默认是关的,那么option[11:8]必须要设置正确,否则下载校验时会报错。比如前面介绍的W25Q64JVSIM,痞子衡不确定其是什么SFDP版本,保险起见,我们可以直接设option = 0xc0000408。
上面的option值QE设置与痞子衡的MCUBootUtility下载工具是对应的:
4.3 匹配FDCB去启动
下载时如果能够成功将Flash里的QE打开,i.MXRT启动时就可以不用特殊做什么,直接用SDK里提供的FDCB即可。为了达到最高XIP性能,FDCB里的LUT都是配的四线I/O模式的Fast Read,而QE此时已经打开,那么CPU去Flash里读指令不会有任何问题。
至此,导致串行NOR Flash在i.MXRT下无法正常下载/启动的常见因素之QE bit痞子衡便介绍完毕了,掌声在哪里~~~
欢迎订阅
文章会同时发布到我的 博客园主页、CSDN主页、知乎主页、微信公众号 平台上。
微信搜索"痞子衡嵌入式"或者扫描下面二维码,就可以在手机上第一时间看了哦。