痞子衡嵌入式:i.MXRT連線特殊Octal Flash時(OPI DTR模式下反轉位元組序)下載與啟動注意事項(以MX25UM51245為例)

痞子衡發表於2022-02-10

  大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是OPI DTR模式下反轉位元組序的Octal Flash在i.MXRT下載與啟動注意事項

  在恩智浦官方參考設計板 MIMXRT595-EVK 和 MIMXRT685-EVK 上搭載了一顆來自 MXIC 的 MX25UM51345G,這是一款比較典型的 Octal Flash,在 i.MXRT 下去下載和啟動這款 Flash 並沒有什麼特別的地方,官方 SDK 及工具鏈裡做了完善支援。

  近期有客戶做板卡設計時選到了一顆同樣來自 MXIC 的 Octal Flash - MX25UM51245G,主絲印號與 MX25UM51345G 僅一個數字之差,根據資料手冊對比,兩者在功能上似乎並沒有太多區別,然而客戶在啟動這顆 Flash 時卻遇到了麻煩,這是怎麼回事?今天痞子衡來一探究竟:

  • Note:本文內容雖以 i.MXRT 三位數系列為例來展開,但同樣也適用 i.MXRT 四位數系列。

一、一般Octal Flash讀寫位元組序設計

  我們先來看典型的 MX25UM51345G 上讀寫時序設計,這對下載啟動至關重要。大家都知道 Octal Flash 時序主要分為 SPI 和 OPI 兩大類,其區別是命令/地址/資料位是僅通過 SIO[1:0] 還是通過全部 SIO[7:0] 來傳輸。

  如下是 SPI 模式下的 Read 和 Page Program 時序,命令和地址位均通過 SIO[0] 來傳輸,資料位通過 SIO[1](Read) 或者 SIO[0](Program) 來傳輸,這裡特別關注一下資料位的位元組序,讀寫都是按照 Data Byte 1、Data Byte 2、Data Byte 3... 正序傳輸的。

  再來看 OPI 模式下的 Read 和 Page Program 時序(包含 STR 和 DTR 模式),命令/地址/資料位全部通過 SIO[7:0] 來傳輸,我們們也同樣關注一下資料位的位元組序,讀寫依然是按照 D0、D1、D2、D3... 正序傳輸的。

二、以MX25UM51245為代表的特殊讀寫位元組序設計

  現在我們再來看 MX25UM51245G 上特殊讀寫時序設計,其在 SPI 模式、OPI-STR 模式下時序與 MX25UM51345G 並無差異(資料位都是正序傳輸),主要差異在如下 OPI-DTR 模式下時序,我們可以看到 OPI-DTR 讀寫時資料位上位元組序是 D1、D0、D3、D2... 這樣的反轉序,這種特殊位元組序設計在 Flash 資料手冊上並沒有以文字形式特別提醒,僅能從時序圖上觀察出來,估計是 Flash 廠商認為讀寫位元組序是成套反轉的,因此使用者無需關心這種差異(即不需要軟體程式碼層面去刻意做資料反轉,反反得正嘛)。

三、i.MXRT啟動MX25UM51245注意事項

  從 i.MXRT 啟動角度而言,對於 Octal Flash 我們既可以配置 FlexSPI 外設以 SPI Read 模式去訪問也可以配置 OPI Read 模式去訪問,不過從最高效能角度而言,通常我們會配置 OPI-DTR Read 模式去啟動 Octal Flash。隨便開啟一個 MIMXRT595 SDK 裡示例工程,在 flash_config.c 檔案裡你可以看到讀命令設定的就是 0xEE(8DTRD)。

  具體 FlexSPI 配置是通過存放在 Flash 固定偏移處的 FDCB 結構(就是上圖程式碼中的 flash_config )來實現的,BootROM上電會以固定 30MHz SPI Read 模式先從 Flash 裡取出 FDCB,然後解析 FDCB 得到使用者指定配置再做二次 FlexSPI 配置去啟動使用者程式(詳見痞子衡舊文 《深入i.MXRT1050系列ROM中序列NOR Flash啟動初始化流程》)。

  讀到這裡,你有沒有發現什麼問題?Octal Flash 裡的 FDCB 和使用者應用程式資料是在 BootROM 配置的不同讀時序模式下被訪問的,前者是通過 SPI Read,後者是通過 OPI-DTR Read,這樣在 MX25UM51245 下就可能會存在位元組序不統一的問題。如何解決這個問題?有三種方案:

方案 1:
- 負責下載功能的 Flashloader 僅配置 Flash 為 SPI 或 OPI-STR 模式,並且在下載時對 FDCB 和使用者應用程式資料不做任何位元組序反轉;
- 負責啟動功能的 BootROM 也同樣配置 Flash 為 SPI 或 OPI-STR 模式去啟動使用者應用程式(在使用者 FDCB 裡設定)。

方案 2:
- 負責下載功能的 Flashloader 僅配置 Flash 為 SPI 或 OPI-STR 模式,並且在下載時對 FDCB 不做任何反轉,但是需要對使用者應用程式資料做位元組序反轉;
- 負責啟動功能的 BootROM 需要配置 Flash 為 OPI-DTR 模式去啟動使用者應用程式(在使用者 FDCB 裡設定)。

方案 3:
- 負責下載功能的 Flashloader 配置 Flash 為 OPI-DTR 模式,並且在下載時對 FDCB 做位元組序反轉,但是對使用者應用程式資料不做任何反轉;
- 負責啟動功能的 BootROM 需要配置 Flash 為 OPI-DTR 模式去啟動使用者應用程式(在使用者 FDCB 裡設定)。

四、i.MXRT啟動MX25UM51245實現方案

  上一節列舉了三個解決方案,其中方案 1 沒什麼好說的,不涉及位元組序統一性問題。使用 MCUBootUtility 工具做應用程式下載時,不要選擇具體 Flash 型號的模型,而使用 1bit SDR 模式的 FDCB 去連線配置(詳見 《MCUBootUtility v2.3釋出,這次不再放過任何一款Flash》 一文的 2.3 小節)。

  而如果期望 BootROM 配置 Flash 以 OPI-DTR 模式去啟動,則需要在方案 2 和 3 裡面選一個,從實現效率角度,顯然方案 3 比方案 2 更勝一籌,畢竟使用者程式往往比 FDCB 資料量大得多,對其做位元組序反轉耗時更長, i.MXRT 預設下載支援裡就是選用了方案 3。MCUBootUtility 工具裡的 Flash 模型支援 MX25UM51245 這種型號,其是通過 Misc Mode 裡的 "Data Order Swapped" 選項來進行區分的。

  對於 i.MXRT500/600,其 Flashloader 功能直接整合進了 BootROM 裡,我們看不到關於位元組序反轉的實現原始碼;但是 i.MXRT 四位數系列 BootROM 並無下載功能,其是通過載入二級 Flashloader 來實現下載的,其原始碼開源在 \SDK\boards\evkmimxrt1xxx\bootloader_examples\flashloader 裡,在這個 Flashloader 原始碼裡我們能找到關於位元組序反轉的設計。

  至此,OPI DTR模式下反轉位元組序的Octal Flash在i.MXRT下載與啟動注意事項痞子衡便介紹完畢了,掌聲在哪裡~~~

歡迎訂閱

文章會同時釋出到我的 部落格園主頁CSDN主頁知乎主頁微信公眾號 平臺上。

微信搜尋"痞子衡嵌入式"或者掃描下面二維碼,就可以在手機上第一時間看了哦。

相關文章