痞子衡嵌入式:致使串行NOR Flash在i.MXRT下没法正常下载/启动的常见因素之QE bit


  你们好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给你们介绍的是致使串行NOR Flash在i.MXRT下没法正常下载/启动的常见因素之QE bithtml

  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这个因素。微信

1、什么是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工做模式提及。.net

  一个标准的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模式。code

  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设置。

2、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信息。

3、默认QE bit状态

  如今咱们对QE bit已经有了全面的了解,还剩最后一个问题,各厂商的Flash出厂时其QE bit初始是什么状态?据痞子衡了解,每一个厂商几乎同时都有QE默认是开或者关的Flash型号,这在Part Number上会有体现,好比下面华邦W25Q系列的命名规则,最后一位表明了默认QE状态:

  其余Flash厂商关于QE状态的命名规则各有不一样,须要自行查看手册去了解。

4、在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主页知乎主页微信公众号 平台上。

微信搜索"痞子衡嵌入式"或者扫描下面二维码,就能够在手机上第一时间看了哦。