痞子衡嵌入式:i.MXRT1170使用(yong)FlexSPI 2nd引腳組連接串行(xing)NOR Flash啟動時FDCB需特殊設置
大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家分享的是i.MXRT1170使用FlexSPI 2nd引腳組連接串行NOR Flash啟動時FDCB需特殊設置。
最(zui)近痞(pi)子(zi)衡在支持一個 RT1170 客戶(hu), 這個客戶(hu)并沒(mei)(mei)有按照恩智(zhi)浦官方 EVK 那樣的 flash 引腳連接(jie)方式(shi)(shi),他們(men)使用(yong)了(le) FlexSPI1 2nd 引腳(GPIO_AD[23:17])去連接(jie) flash 啟動(dong)(dong),這種(zhong)連接(jie)方式(shi)(shi)當然(ran)也是沒(mei)(mei)有問題(ti)的。痞(pi)子(zi)衡特地給(gei)他們(men)制作(zuo)了(le)一個專用(yong) flash下(xia)載算法(fa),然(ran)而客戶(hu)把(ba)應用(yong)程(cheng)序(xu)下(xia)載進(jin) flash 后,發(fa)現(xian)程(cheng)序(xu)并沒(mei)(mei)有正常(chang)(chang)啟動(dong)(dong)。客戶(hu)還用(yong)邏輯分析(xi)儀(yi)抓(zhua)取(qu)了(le)啟動(dong)(dong)時 flash 上(shang)的數(shu)(shu)據傳輸,發(fa)現(xian) ROM 已經能夠(gou)正常(chang)(chang)從(cong) flash 里讀出(chu)了(le) FDCB,然(ran)而卻沒(mei)(mei)有繼續讀取(qu)到有效 IVT,BD 等(deng)數(shu)(shu)據。這是怎么回事?今(jin)天(tian)痞(pi)子(zi)衡和大(da)家聊(liao)聊(liao)這個話題(ti):
- Note1: 本文所述現象同樣存在于 RT1160,但不存在于 RT10xx/RT3digits
- Note2: 這個現象存在于 A0/B0,以及 C0 版本(但是 C0 下有可能會用 patch 更改設計)
一、FCB與FlexSPI引腳選擇
我們先來簡單回顧一下 i.MXRT 關于 NOR Flash 啟動流程(可詳見 《RT NOR 啟動流程》),系統上電之(zhi)后,ROM 先要獲(huo)取 flash 里(li)的 User FCB,用這個(ge) User FCB 來進一步配(pei)置 FlexSPI,然后再繼續(xu)解(jie)析 IVT、BD,最后是(shi)跳轉到應用程(cheng)序。
大家有(you)沒有(you)想過(guo)一個問題(ti), ROM 是如何得(de)知當前 flash 具體(ti)是連(lian)在哪組(zu) FlexSPI 引腳上的(de)(de)(要知道 RT1170 上提供了(le)十(shi)幾組(zu)引腳連(lian)接選(xuan)擇(ze))?能不能通過(guo) User FCB 里的(de)(de)設置(zhi)來選(xuan)擇(ze)? 當然 User FCB 里可以(yi)加這(zhe)(zhe)樣的(de)(de)選(xuan)項,但是這(zhe)(zhe)個前提是 ROM 得(de)先(xian)拿到 FCB,很顯(xian)然得(de)有(you) flash 數據之外(wai)的(de)(de)非易失性配置(zhi)才行(xing),這(zhe)(zhe)就是 eFuse。
RT1170 ROM 是根(gen)據(ju) eFuse 0x940[11], 9A0[10:8] 里(li)的配置(zhi)得(de)知 flash 連到了(le)哪組 FlexSPI 引腳(jiao)(jiao),然后(hou)(hou)初始化這(zhe)個引腳(jiao)(jiao),再用通用 1bit SPI 30MHz SDR 時序來讀取(qu) User FCB。當 ROM 獲取(qu)到有(you)效 User FCB 后(hou)(hou),理論(lun)上可(ke)以根(gen)據(ju) FCB 里(li)關于 FlexSPI 引腳(jiao)(jiao)選(xuan)擇的配置(zhi)去切(qie)換 flash 連接,但(dan)是這(zhe)樣真的有(you)必要(yao)嗎?
比如下(xia)圖我們設了 efuse FSPI_PIN_GROUP_SEL=1 從 Flash Device2 去啟(qi)動,當 ROM 從 Flash Device2 里拿到 FCB2 之后,發現 FCB2 里的 pin 配(pei)置(zhi)指向得卻是 Flash Device1 的引腳(jiao)連接,那么接下(xia)來 ROM 加載啟(qi)動得便(bian)是 Flash Device1 里的 Application1。這樣(yang)的應用場景需要(yao)掛兩顆(ke) flash,看起來稍顯多余(yu)。

二、RT1170下FCB特殊設計
我(wo)們知道 RT10xx/RT3digits 上 FCB 沒有提(ti)供 flash 連(lian)接(jie)(jie)引腳切換選項(xiang),但是 RT1160/1170 上 FCB 有一些變化(hua),提(ti)供了有限的 flash 連(lian)接(jie)(jie)切換,我(wo)們直接(jie)(jie)來看 FCB 結構,這里面和(he)引腳連(lian)接(jie)(jie)有關的主要兩地方(fang):controllerMiscOption、sflashX1Size,后者是 i.MXRT 通用(yong)設計(ji),用(yong)于設定不(bu)同 FlexSPI Port(和(he) eFuse 0x9A0[9:8] - FSPI_CONN_SEL 功能有點類(lei)似(si))。

controllerMiscOption 是(shi)(shi)一個混合功(gong)能設定,其(qi)中 bit8 在 RT10xx/RT3digits 上(shang)是(shi)(shi) reserved,而在 RT1160/1170 上(shang)用于(yu)切(qie)換 Primary/Secondary 引(yin)腳組,這(zhe)(zhe)會覆蓋 ROM 從 eFuse 0x9A0[10] - FSPI_PIN_GROUP_SEL 里獲(huo)取到的配置(zhi)(全文重點就這(zhe)(zhe)一句)。
//!@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上實測結果
為(wei)了(le)(le)驗證 controllerMiscOption 效果,痞(pi)子衡找了(le)(le)塊內部(bu)使用的(de) RT1170-FSGPIO 板卡,這塊板卡恰好在(zai) GPIO_SD_B2[11:5] 和 GPIO_AD[23:17] 上均連接了(le)(le) memory,前者(zhe)是 U7 - QSPI Flash,后者(zhe)是 U9 - 4bit PSRAM,我們需要(yao)將(jiang) U9 替換成 QSPI Flash(注意是 8-pin SOIC 150-mil 小封裝),外圍電路也需要(yao)做一些調整。
硬(ying)件(jian)準備好,便可以使用痞(pi)子衡(heng)的 MCUBootUtility 軟(ruan)件(jian)將程序分別(bie)下(xia)載進這兩個 Flash,并按(an)需調整 eFuse 以及 FCB 里的 controllerMiscOption,痞(pi)子衡(heng)實測了如下(xia)兩種(zhong)情況(kuang),均是(shi)能夠(gou)正(zheng)常啟動(dong)的。
- Note:痞子衡也嘗試用不同 SEGGER 下載算法來做程序下載,實測發現算法之間竟然會互相影響,比如先下載了 App1,再不斷電用另一個算法下載 App2 時會誤擦除 App1 數據,感興趣的可以自行研究。


最后具體到客(ke)戶問題,那只需(xu)要將 controllerMiscOption[8] 設成 1 便可以正(zheng)常啟動(dong)了。
至(zhi)此,i.MXRT1170使用FlexSPI 2nd引(yin)腳組連接(jie)串行NOR Flash啟動時FDCB需特殊設(she)置(zhi)痞子(zi)衡便介紹完畢了,掌聲在哪(na)里(li)~~~
歡迎訂閱
文章會同時發布到我的 博客園、、、、、、、 平臺上。
微信搜索"痞子衡嵌入式"或者掃描下面二維(wei)碼,就可以在(zai)手機上第一時間看了哦。

最后(hou)歡迎關注(zhu)痞子衡個(ge)人(ren)微信公(gong)(gong)眾(zhong)號(hao)【痞子衡嵌入式(shi)(shi)】,一(yi)個(ge)專(zhuan)注(zhu)嵌入式(shi)(shi)技(ji)術的公(gong)(gong)眾(zhong)號(hao),跟著(zhu)痞子衡一(yi)起玩轉嵌入式(shi)(shi)。
衡杰(痞子(zi)衡),目(mu)前就職于(yu)恩智浦(NXP)半導體MCU系統應(ying)用(yong)部門,擔任高級(ji)嵌入式系統應(ying)用(yong)工程師。
專欄內所有文章的轉載請注明出處://www.xtjzw.net/henjay724/
與痞子衡進一步交流或咨詢業務合作請發郵件至 hengjie1989@foxmail.com
可以關注痞子衡的Github主(zhu)頁 ,有很多好玩的嵌入式項目。
關于專欄文章有任何疑問請直接在博客下面留言,痞子衡會及時回復免費(劃重點)答疑。
痞子衡郵箱已被私信擠爆,技術問題不推薦私信,堅持私信請先掃碼付款(5元起步)再發。