加入星计划,您可以享受以下权益:

  • 创作内容快速变现
  • 行业影响力扩散
  • 作品版权保护
  • 300W+ 专业用户
  • 1.5W+ 优质创作者
  • 5000+ 长期合作伙伴
立即加入
  • 正文
    • 一、什么是 QE bit?
    • 二、QE bit 位置差异
    • 三、默认 QE bit 状态
    • 四、在 i.MXRT 下如何处理不同 QE bit 的 Flash
  • 相关推荐
  • 电子产业图谱
申请入驻 产业图谱

为什么QE bit是影响串行Flash正常启动的重要因素?

09/29 10:55
8.4万
阅读需 15 分钟
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是导致串行 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 痞子衡便介绍完毕了,掌声在哪里~~~

相关推荐

电子产业图谱

硕士毕业于苏州大学电子信息学院,目前就职于恩智浦(NXP)半导体MCU系统部门,担任嵌入式系统应用工程师。痞子衡会定期分享嵌入式相关文章