惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

D
Docker
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - Franky
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
A
About on SuperTechFans
博客园 - 【当耐特】
Microsoft Security Blog
Microsoft Security Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
The GitHub Blog
The GitHub Blog
雷峰网
雷峰网
博客园_首页
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
IT之家
IT之家
博客园 - 叶小钗
Google DeepMind News
Google DeepMind News
aimingoo的专栏
aimingoo的专栏
博客园 - 聂微东
B
Blog RSS Feed
H
Help Net Security
Recent Announcements
Recent Announcements
阮一峰的网络日志
阮一峰的网络日志
D
DataBreaches.Net
L
LangChain Blog
Vercel News
Vercel News

博客园 - 痞子衡

痞子衡嵌入式:如果你嫌MCU板卡工厂验收测试麻烦,不妨试试FATestSuite 痞子衡嵌入式:大话双核i.MXRT1180之XIP应用里借助MU实现可靠Flash IAP的方法 痞子衡嵌入式:turbo-spiboot - 一种基于MCUBoot协议的二级SPI加载APP提速方案 痞子衡嵌入式:如果你在找针对i.MX RT系列的OTA参考设计,可以持续关注Tiny OTA 痞子衡嵌入式:Farewell, 我的写博故事2025 《痞子衡嵌入式半月刊》 第 120 期 痞子衡嵌入式:16MB以上NOR Flash地址模式切换会造成软复位后i.MXRT无法正常启动 痞子衡嵌入式:i.MXRT中FlexSPI外设速度上限的三个影响因子(数据手册里的纠结) 痞子衡嵌入式:在i.MXRTxxx下使能DMA动态链式传输误区及各外设驱动对DMA链式支持情况 痞子衡嵌入式:在i.MXRTxxx下使能DMA链式传输可达到SPI从设备接收速率上限50Mbps 痞子衡嵌入式:在i.MXRT下测试启动特性时可改写OTP Shadow寄存器而不烧OTP 痞子衡嵌入式:如果i.MXRT1xxx在Hab关闭时出现偶发性启动失败,请先检查JTAG电路 痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU启动那些事(11.B)- FlexSPI NOR连接方式大全(RT1180) 《痞子衡嵌入式半月刊》 第 119 期 痞子衡嵌入式:从i.MXRT600用户手册UM里一个关于FlexSPI LUT长度的勘误说起 痞子衡嵌入式:MDK5.40下从DFP包路径添加用户下载算法FLM文件的方法 痞子衡嵌入式:i.MXRT10xx系列ROM的UART SDP设置不同波特率的方法与实践 痞子衡嵌入式:不处理i.MXRT1064片内Flash的RESET#引脚可能会导致无法启动或程序跑飞 痞子衡嵌入式:聊聊i.MXRT1024/1064片内4MB Flash的SFDP表易丢失导致的烧录异常 痞子衡嵌入式:在含多个i.MXRT的主从系统中共享一颗Flash启动的方法与实践(下篇)
痞子衡嵌入式:i.MXRT1170使用FlexSPI 2nd引脚组连接串行NOR ...
痞子衡 · 2025-07-14 · via 博客园 - 痞子衡

  大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是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 等数据。这是怎么回事?今天痞子衡和大家聊聊这个话题:

  • Note1: 本文所述现象同样存在于 RT1160,但不存在于 RT10xx/RT3digits
  • Note2: 这个现象存在于 A0/B0,以及 C0 版本(但是 C0 下有可能会用 patch 更改设计)

一、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 里获取到的配置(全文重点就这一句)。

//!@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 平台上。

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