大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家分享的是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 里獲取到的配置(全文重點就這一句)。
//!@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需特殊設置痞子衡便介紹完畢了,掌聲在哪里~~~