大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是在FDCB裡使能串行NOR Flash的Continuous read模式。
前面關于串行Flash傳輸時序的文章 《Fast Read Quad I/O SDR模式》 與 《Fast Read Quad I/O DTR模式》, 痞子衡介紹的其實都屬于經典SPI工作模式大類下的Non-Continuous read傳輸模式,即任何獨立的Fast Read Quad I/O讀資料時序(一次CS低有效期間),都必須由Command子序列(指令碼0xEB/0xEC/0xED/0xEE)先行,且不管是SDR還是DTR模式,指令碼都是要在8個SCK周期内由IO0信号進行傳輸(别小看這8個SCLK周期,對于小資料塊讀取時序,它在總傳輸時間裡占比是不可忽視的)。
我們知道在XIP情況下CPU從Flash裡取指令資料往往是非常随機且零碎無序的,這時候雖然有L1 Cache和和FlexSPI Prefetch Buffer加速,但如果還想再進一步提升通路性能,就隻能從Flash底層傳輸序列裡想辦法了。Flash讀時序裡有五大子序列CMD + ADDR + MODE + DUMMY + READ,其中除了CMD和DUMMY子序列是固定的,其他子序列參數值都可能會變,會變的就不能被優化,是以隻能想辦法在CMD和DUMMY子序列裡做文章。今天痞子衡要介紹的Continuous read模式就是拿CMD子序列開刀:
Continuous read顧名思義就是連續讀。在串行Flash世界裡,連續讀的意思是讀傳輸時序裡除了第一次CS有效期必須傳輸Command子序列,其後的讀傳輸時序裡均省去Command子序列。下面痞子衡結合i.MXRT的FlexSPI外設來對比介紹Non-Continuous read與Continuous read模式的差別:
我們知道NOR Flash因為支援主裝置随機讀取其任意位址處的資料,是以從原理上可以用作XIP裝置。但因為是串行接口,是以不能直接XIP(沒有獨立并行位址線,CPU無法直接尋址),需要FlexSPI外設在底層完成AHB總線讀通路的實時響應工作,這個實時響應工作就是FlexSPI的XIP特性。
FlexSPI的XIP特性可以支援任意串行NOR Flash,對Flash廠商設計沒要求。為了提升XIP代碼執行效率,FlexSPI中也內建了XIP Enhanced Mode特性(其實就是Continuous read模式),見下圖,CS1是包含CMD子序列的讀時序(即第一次CS),CS2/3(包括後續所有CS)相比CS1少了CMD子序列,這就是Continuous read通路時序。

FlexSPI的XIP Enhanced Mode特性并不能夠用于任意串行NOR Flash,這對Flash廠商設計有要求,必須Flash本身支援Continuous read模式才行。
了解了XIP Enhanced Mode,我們再來看LUT裡Quad I/O Read SDR Continuous read傳輸序列,它由CMD_SDR + RADDR_SDR + MODE8_SDR + DUMMY_SDR + READ_SDR + JMP_ON_CS + STOP七個子序列組成,如下表所示。
這個Continuous read傳輸序列相比Non-Continuous read傳輸時序主要有兩處差別:
LUT中Quad I/O Read DDR Continuous read傳輸序列如下,差異與前面SDR下的分析一緻,這裡不予贅述。
現在跟着痞子衡去看幾家主流Flash廠商關于Continuous read特性的設計(如果你想快速确認某一款型号Flash是否支援這個特性,找到其資料手冊搜尋"Continuous read"看有沒有如下時序圖):
MODE子序列裡參數值M[7:4]通過包含/不包含Command子序列來控制下一次讀傳輸時序的長度,M[7:4] = 0xA則進入/保持Continuous Read模式,否則不進入/退出。
MODE子序列裡參數值M[7:4] = 0xA則進入/保持Continuous Read模式,否則不進入/退出。
MODE子序列裡參數值M[7:4] = 0xA則進入/保持AX Read模式(就是Continuous Read),否則不進入/退出。
MODE子序列裡參數值M[5:4] = 2'b10則進入/保持Continuous Read模式(有的型号上也叫Read Command Bypass Mode,比如W25QxxJW-DTR),否則不進入/退出。 如果要退出Continuous Read模式,Flash資料手冊裡特别推薦下一次時序裡指令碼臨時設為0xFF,以保證M4=1使得Flash徹底回到Non-Continuous Read模式。
Note: 華邦Flash型号絲印字尾為IQ,則不支援Continuous Read模式;為IM則支援。
MODE子序列裡參數值M[5:4] = 2'b10則進入/保持Continuous Read模式,否則不進入/退出。
了解了上面關于Continuous read模式知識後,我們在恩智浦i.MXRT1170-EVK闆子上實踐一下。預設連接配接的Flash是IS25WP128,這款Flash是支援Continuous read模式的,我們随便在SDK包裡找一個XIP例程,修改工程裡 evkmimxrt1170_flexspi_nor_config.c 檔案裡的 FDCB 啟動頭如下(主要就是改LUT表),改完下載下傳程式進Flash運作,代碼執行效率應該會有所提升(等下一篇QPI模式文章寫完,痞子衡會設計一個用例一起來實測下性能)。
注意:使能Flash的Continuous read模式在i.MXRT冷啟動時運作沒問題,但軟複位(NVIC_SystemReset())下i.MXRT可能會無法再次啟動,App/ROM裡需要再做一些特殊處理,請關注痞子衡後續文章。
至此,在FDCB裡使能串行NOR Flash的Continuous read模式痞子衡便介紹完畢了,掌聲在哪裡~~~
文章會同時釋出到我的 部落格園首頁、CSDN首頁、知乎首頁、微信公衆号 平台上。
微信搜尋"痞子衡嵌入式"或者掃描下面二維碼,就可以在手機上第一時間看了哦。
最後歡迎關注痞子衡個人微信公衆号【痞子衡嵌入式】,一個專注嵌入式技術的公衆号,跟着痞子衡一起玩轉嵌入式。
衡傑(痞子衡),目前就職于恩智浦MCU系統部門,擔任嵌入式系統應用工程師。
專欄内所有文章的轉載請注明出處:http://www.cnblogs.com/henjay724/
與痞子衡進一步交流或咨詢業務合作請發郵件至 [email protected]
可以關注痞子衡的Github首頁 https://github.com/JayHeng,有很多好玩的嵌入式項目。
關于專欄文章有任何疑問請直接在部落格下面留言,痞子衡會及時回複免費(劃重點)答疑。
痞子衡郵箱已被私信擠爆,技術問題不推薦私信,堅持私信請先掃碼付款(5元起步)再發。