痞子衡嵌入式:i.MXRT1170使用FlexSPI 2nd引脚组连接串行NOR Flash启动时FDCB需特殊设置


大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是i.MXRT1170使用FlexSPI 2nd引脚组连接串行NOR Flash启动时FDCB需特殊设置

最近痞子衡在支持一个 RT1170 客户, 这个客户并没有按照恩智浦官方 EVK 那样的 flash 引脚连接方式,他们使用了 FlexSPI1 2nd 引脚(GPIO_AD[23:17])去连接 flash 启动,这种连接方式当然也是没有问题的。痞子衡特地给他们制作了一个专用 flash下载算法,然而客户把应用程序下载进 flash 后,发现程序并没有正常启动。客户还用逻辑分析仪抓取了启动时 flash 上的数据传输,发现 ROM 已经能够正常从 flash 里读出了 FDCB,然而却没有继续读取到有效 IVT,BD 等数据。这是怎么回事?今天痞子衡和大家聊聊这个话题:

  • Note: 本文所述现象同样存在于 RT1160,但不存在于 RT10xx/RT3digits

一、FCB与FlexSPI引脚选择

我们先来简单回顾一下 i.MXRT 关于 NOR Flash 启动流程(可详见 《RT NOR 启动流程》),系统上电之后,ROM 先要获取 flash 里的 User FCB,用这个 User FCB 来进一步配置 FlexSPI,然后再继续解析 IVT、BD,最后是跳转到应用程序。

大家有没有想过一个问题, ROM 是如何得知当前 flash 具体是连在哪组 FlexSPI 引脚上的(要知道 RT1170 上提供了十几组引脚连接选择)?能不能通过 User FCB 里的设置来选择? 当然 User FCB 里可以加这样的选项,但是这个前提是 ROM 得先拿到 FCB,很显然得有 flash 数据之外的非易失性配置才行,这就是 eFuse。

RT1170 ROM 是根据 eFuse 0x940[11], 9A0[10:8] 里的配置得知 flash 连到了哪组 FlexSPI 引脚,然后初始化这个引脚,再用通用 1bit SPI 30MHz SDR 时序来读取 User FCB。当 ROM 获取到有效 User FCB 后,理论上可以根据 FCB 里关于 FlexSPI 引脚选择的配置去切换 flash 连接,但是这样真的有必要吗?

比如下图我们设了 efuse FSPI_PIN_GROUP_SEL=1 从 Flash Device2 去启动,当 ROM 从 Flash Device2 里拿到 FCB2 之后,发现 FCB2 里的 pin 配置指向得却是 Flash Device1 的引脚连接,那么接下来 ROM 加载启动得便是 Flash Device1 里的 Application1。这样的应用场景需要挂两颗 flash,看起来稍显多余。

二、RT1170下FCB特殊设计

我们知道 RT10xx/RT3digits 上 FCB 没有提供 flash 连接引脚切换选项,但是 RT1160/1170 上 FCB 有一些变化,提供了有限的 flash 连接切换,我们直接来看 FCB 结构,这里面和引脚连接有关的主要两地方:controllerMiscOption、sflashX1Size,后者是 i.MXRT 通用设计,用于设定不同 FlexSPI Port(和 eFuse 0x9A0[9:8] - FSPI_CONN_SEL 功能有点类似)。

controllerMiscOption 是一个混合功能设定,其中 bit8 在 RT10xx/RT3digits 上是 reserved,而在 RT1160/1170 上用于切换 Primary/Secondary 引脚组,这会覆盖 ROM 从 eFuse 0x9A0[10] - FSPI_PIN_GROUP_SEL 里获取到的配置(全文重点就这一句)。

C 复制代码
//!@brief Misc feature bit definitions
enum
{
    kFlexSpiMiscOffset_DiffClkEnable = 0,            //!< Bit for Differential clock enable
    kFlexSpiMiscOffset_Ck2Enable = 1,                //!< Bit for CK2 enable
    kFlexSpiMiscOffset_ParallelEnable = 2,           //!< Bit for Parallel mode enable
    kFlexSpiMiscOffset_WordAddressableEnable = 3,    //!< Bit for Word Addressable enable
    kFlexSpiMiscOffset_SafeConfigFreqEnable = 4,     //!< Bit for Safe Configuration Frequency enable
    kFlexSpiMiscOffset_PadSettingOverrideEnable = 5, //!< Bit for Pad setting override enable
    kFlexSpiMiscOffset_DdrModeEnable = 6,            //!< Bit for DDR clock confiuration indication.

    kFlexSpiMiscOffset_UseValidTimeForAllFreq = 7,   //!< Bit for DLLCR settings under all modes
    kFlexSpiMiscOffset_SecondPinMux = 8,             //!< Bit for Second Pinmux group
    kFlexSpiMiscOffset_SecondDqsPinMux = 9,          //!< Bit for Second DQS Pin mux
    kFlexSpiMiscOffset_WriteMaskEnable = 10,         //!< Bit for Write Mask Enable
    kFlexSpiMiscOffset_WriteOpt1Clear = 11,          //!< Bit for Write Opt
};

三、RT1170上实测结果

为了验证 controllerMiscOption 效果,痞子衡找了块内部使用的 RT1170-FSGPIO 板卡,这块板卡恰好在 GPIO_SD_B2[11:5] 和 GPIO_AD[23:17] 上均连接了 memory,前者是 U7 - QSPI Flash,后者是 U9 - 4bit PSRAM,我们需要将 U9 替换成 QSPI Flash(注意是 8-pin SOIC 150-mil 小封装),外围电路也需要做一些调整。

硬件准备好,便可以使用痞子衡的 MCUBootUtility 软件将程序分别下载进这两个 Flash,并按需调整 eFuse 以及 FCB 里的 controllerMiscOption,痞子衡实测了如下两种情况,均是能够正常启动的。

  • Note:痞子衡也尝试用不同 SEGGER 下载算法来做程序下载,实测发现算法之间竟然会互相影响,比如先下载了 App1,再不断电用另一个算法下载 App2 时会误擦除 App1 数据,感兴趣的可以自行研究。

最后具体到客户问题,那只需要将 controllerMiscOption[8] 设成 1 便可以正常启动了。

至此,i.MXRT1170使用FlexSPI 2nd引脚组连接串行NOR Flash启动时FDCB需特殊设置痞子衡便介绍完毕了,掌声在哪里~~~

欢迎订阅

文章会同时发布到我的 博客园CSDN微信公众号知乎与非网电子技术应用AET电子星球51CTO 平台上。

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