大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家分享的是i.MXRT中不支援DQS的FlexSPI引腳組連接配接Flash下載下傳與啟動注意事項。
最近痞子衡在支援一個印度客戶,這個客戶項目主晶片選擇的是恩智浦 i.MXRT1176,客戶設計闆子時選擇将四線 NOR Flash 挂在了主晶片 FlexSPI2 2nd Pinmux( GPIO_SD_B1[05:00] )上,選擇這組引腳當然是可以的,但客戶在使用恩智浦配套下載下傳工具以及 SDK 例程時發現無法正常使用,體驗上跟預設 FlexSPI1 1st Pinmux( GPIO_SD_B2[11:05] )挂載 Flash 完全不同,這其實跟 FlexSPI DQS 信号設計有關,且聽痞子衡道來:
關于 DQS 信号,痞子衡寫過一篇文章 《串行NOR Flash的DQS信号功能簡介》,裡面介紹了 DDR、Octal Flash、Hyper Flash 晶片上的 DQS 信号作用,文章中沒有提及四線 QSPI Flash,因為一般的四線 QSPI Flash 晶片并沒有 DQS 信号引腳。FlexSPI 子產品的 DQS 信号當然可以用來連接配接 Octal Flash、Hyper Flash 上的 DQS 引腳,那麼對于四線 QSPI Flash,這個 DQS 信号就沒有作用了嗎?其實不是的。
我們翻開 i.MXRT1170 的資料手冊(Data Sheet)找到 FlexSPI parameters 小節裡的如下内容,就很清楚了。FlexSPIn_MCR0[RXCLKSRC] 位對應了三種 DQS 信号源設定:0x0 - Dummy read strobe looped back internally 設定即完全不用 DQS 引腳(可作它用),對應最高 60MHz SDR 通路速度;0x1 - Dummy read strobe looped back through the DQS pad 設定即從 DQS 引腳上回環,是以 DQS 引腳需要懸空,對應最高 133MHz SDR 通路速度;0x3 - Read strobe from memory device DQS pad 設定即接到存儲晶片 DQS 引腳上,對應最高 166MHz SDR 通路速度;

目前恩智浦已量産的所有 i.MXRT 型号裡(RT500/600/1010/1015/1020/1050/1060/1160/1170),大部分的 FlexSPI 引腳組合都是包含 DQS 信号設計的,隻有如下兩個例外。沒有 DQS 信号的引腳組合連 Flash 時,應配置 FlexSPIn_MCR0[RXCLKSRC] 為 0x0 - looped back internally。
見 《FlexSPI NOR連接配接方式大全(RT600)》 一文第三節、單Flash連接配接方式裡的第四種Flash連接配接方式。
見 《FlexSPI NOR連接配接方式大全(RT1160/1170)》 一文第二節、單Flash連接配接方式裡第一張表格裡的最後一組連接配接方式。
對于不含 DQS 信号的 FlexSPI 引腳組合,使用恩智浦相關工具操作連接配接在其上的 NOR Flash 是需要做一些改動的,我們以 i.MXRT1170-Validation 闆卡為例來介紹具體改動。
i.MXRT1170-Validation 闆卡是專供恩智浦内部使用的,分為 CPU1/2/3/4 四款,每款的硬體連接配接不同,其中 CPU2 闆卡在 FlexSPI2 2nd PortA 上連接配接了一顆鎂光的 MT25QL128:
我們現在打開 SDK 裡的 FlexSPI 例程,這個例程是針對 MIMXRT1170-EVK 闆卡寫的,在 EVK 上 NOR Flash 預設是連在 FlexSPI1 1st PortA 上的,是以我們需要對例程做一些改動。
一馬當先的改動當然是 pin_mux.c 檔案裡的 BOARD_InitPins() 函數,需要将 FlexSPI1 1st Pinmux 換成 FlexSPI2 2nd Pinmux:
然後再改一下 app.h 檔案裡的宏定義,從 FlexSPI1 換到 FlexSPI2,并相應調整 Flash 屬性(EVK 上是 IS25WP128,Validation 闆上是 MT25QL128),以及更新 flexspi_clock_init() 函數:
上面都是大家能意識到的改動,但其實最容易被忽略的改動是 flexspi_nor_flash_ops.c 檔案裡的 flexspi_nor_flash_init() 函數,config.rxSampleClock 設定必須要改成 kFLEXSPI_ReadSampleClkLoopbackInternally 才行。代碼全部改完之後下載下傳運作就可以正常擦寫 Flash 了。
現在我們再來用一下 SDK 裡的 flashloader 工程,這個應用程式可以與恩智浦專用指令行上位機 blhost.exe 進行互動,工程需要用調試器下載下傳進主晶片内部 RAM 運作,具體步驟可參考 《Flashloader初體驗(blhost)》。
flashloader 運作起來之後,使用 blhost 工具按序執行下列指令,也一樣能對 Flash 進行擦寫:
上面指令序列裡第二條 fill-memory 指令的參數 0xc1000053 是關鍵,從 flashloader 源代碼裡看它其實是在設定 serial_nor_config_option_t.option0.B.misc_mode 為 kSerialNorEnhanceMode_InternalLoopback,這個設定對于四線 QSPI Flash 而言就是設 config->memConfig.readSampleClkSrc 為 kFlexSPIReadSampleClk_LoopbackInternally:
flashloader 的使用對一般客戶來說太複雜了,還是圖形化工具 MCUBootUtility 更友善,打開這個工具,按如下配置(主要就是圖中藍框圈起來的 Misc Mode 設定),也可以正常擦寫 Flash。熟悉這個工具原理的朋友應該知道它底層依賴得就是 3.2 節裡的 flashloader 與 blhost。
最後就是 SDK 裡全部例程的 XIP build 都需要一個 FDCB 頭,這個頭定義在 evkmimxrt1170_flexspi_nor_config.c 檔案裡,這裡也要改一下 readSampleClkSrc 和 serialClkFreq 配置才行。
至此,i.MXRT中不支援DQS的FlexSPI引腳組連接配接Flash下載下傳與啟動注意事項痞子衡便介紹完畢了,掌聲在哪裡~~~
文章會同時釋出到我的 部落格園首頁、CSDN首頁、知乎首頁、微信公衆号 平台上。
微信搜尋"痞子衡嵌入式"或者掃描下面二維碼,就可以在手機上第一時間看了哦。
最後歡迎關注痞子衡個人微信公衆号【痞子衡嵌入式】,一個專注嵌入式技術的公衆号,跟着痞子衡一起玩轉嵌入式。
衡傑(痞子衡),目前就職于恩智浦MCU系統部門,擔任嵌入式系統應用工程師。
專欄内所有文章的轉載請注明出處:http://www.cnblogs.com/henjay724/
與痞子衡進一步交流或咨詢業務合作請發郵件至 [email protected]
可以關注痞子衡的Github首頁 https://github.com/JayHeng,有很多好玩的嵌入式項目。
關于專欄文章有任何疑問請直接在部落格下面留言,痞子衡會及時回複免費(劃重點)答疑。
痞子衡郵箱已被私信擠爆,技術問題不推薦私信,堅持私信請先掃碼付款(5元起步)再發。