大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是i.MXRT上使能NOR Flash的Continuous read模式在軟複位後無法正常啟動問題的解決經驗。
先回顧上篇 《串行NOR Flash的Continuous read模式下軟複位後i.MXRT無法啟動問題解決方案之RESET#》,利用RESET#引腳複位功能是痞子衡找到的第一種解決方案,今天痞子衡繼續給大家介紹第二種解決方案。
本系列會有多篇文章,每篇文章均從一個核心切入點出發,給出一系列具體實作方案。 本系列均以MIMXRT1170-EVK闆為示例目标對象,闆載Flash型号為芯成IS25WP128(其他i.MXRT晶片和Flash型号下實作流程也差不多,需檢視對應資料手冊)。
我們知道無法啟動問題是由于主晶片發生軟複位但Flash仍處于Continuous read模式造成的,要解決這個問題無非如下三個角度,痞子衡會在後面具體實作方案裡按這些角度全部搞一次(如果适用的話)。
一、ROM方面不做任何相關處理,但App在調用NVIC_SystemReset()做複位前将Flash先切回到Normal模式; 二、App方面不做任何相關處理,對BootROM相關配置做一些調整,讓BootROM也能正常處理處于Continuous read模式的Flash; 三、ROM和App聯合對Flash模式切換做一些特殊處理。
本文找的核心切入點是利用Flash的軟體複位指令。Flash的軟體複位時序有兩種:一種是JEDEC标準規定的(嚴格來說其實算硬體複位,但因為其需CS#,SCK,IO0三根信号線配合完成,是以痞子衡将其歸為軟體複位時序類);另一種是廠商定義的軟體複位指令(因為SOIC-8封裝的Flash沒有獨立RESET#引腳,是以廠商增加這個軟複位指令來代替缺失的獨立RESET#引腳功能)。
JEDEC協會規定了一種Flash複位時序,需要CS#,SCK,IO0三根信号線配合完成,時序如下,保持SCK電平不變(高/低均可),拉四次CS#信号,通過SI信号線輸出4'b0101(在CS#上升沿采樣),則Flash會進入複位狀态。
JEDEC标準複位功能并不是所有Flash都內建的,華邦、芯成主流Flash型号均不支援JEDEC标準複位,痞子衡知道的Adesto ATXP032系列Flash裡有JEDEC标準複位。

ATXP032資料手冊裡關于JEDEC标準複位相關時序要求如下,進入JEDEC複位後需要 tXUDPD 時間來恢複。
Flash資料手冊指令集裡通常都可以找到reset相關指令。在IS25WP128資料手冊裡我們可以找到如下軟複位時序,它由0x66(RSTEN)和0x99(RST)指令組合完成,主晶片發完該指令組合後,Flash即進入複位狀态。
IS25WP128軟體複位最大需要100us的恢複時間,在恢複期間内對Flash進行讀寫擦操作并不會生效。
本章節描述的方法,如果是在App裡(這裡均指XIP App)完成,那麼App裡增加的相關處理代碼(注意是執行到的全部代碼)需要是 ramfunc 屬性(即運作在内部RAM裡),這樣操作Flash時可以不受限制。此外代碼運作前需要把全局中斷關掉,防止執行過程中有中斷觸發,導緻Flash裡的相關IRQHandler函數被執行。
我們先僅從ROM單方面角度來解決問題,可以先看下痞子衡之前的舊文 《了解i.MXRT1060系列ROM中串行NOR Flash啟動初始化流程優化點》 裡的2.3節。部分i.MXRT型号ROM裡在串行NOR Flash啟動流程裡內建了JEDEC标準複位。
如果要利用ROM裡內建的JEDEC标準複位功能,則Flash本身必須支援JEDEC标準複位。本系列示例主晶片i.MXRT1170的fusemap表裡關于JEDEC_RESET的相關定義如下,是以我們需要将fuse 0xC80[6]位燒寫為1。
上一小節裡的方法先決條件是Flash要支援JEDEC标準複位,但實際客戶項目中選型的Flash往往沒有內建JEDEC标準複位。是以我們更多應該在廠商定義的軟複位指令上做文章,這就要從App方面的角度來解決問題了。
IS25WP128資料手冊裡找到如下兩個關于reset的指令,reset_flash_to_normal() 函數裡隻需要按序發送這兩個指令,并且延時等夠軟複位恢複時間即可。
代碼可以基于 \SDK_2.9.1_MIMXRT1170-EVK\boards\evkmimxrt1170\driver_examples\flexspi\nor\polling_transfer\cm7下面的 flexspi_nor_polling_transfer.c 和 flexspi_nor_flash_ops.c,并新增如下代碼:
為了保證上述代碼均執行在RAM裡,工程連結檔案裡(以IAR示例)需做如下改動:
關于ROM和App聯合處理角度,在複位指令這個切入點上并沒有什麼優勢,此處略去。
至此,i.MXRT上使能NOR Flash的Continuous read模式在軟複位後無法正常啟動問題的解決經驗痞子衡便介紹完畢了,掌聲在哪裡~~~
文章會同時釋出到我的 部落格園首頁、CSDN首頁、知乎首頁、微信公衆号 平台上。
微信搜尋"痞子衡嵌入式"或者掃描下面二維碼,就可以在手機上第一時間看了哦。
最後歡迎關注痞子衡個人微信公衆号【痞子衡嵌入式】,一個專注嵌入式技術的公衆号,跟着痞子衡一起玩轉嵌入式。
衡傑(痞子衡),目前就職于恩智浦MCU系統部門,擔任嵌入式系統應用工程師。
專欄内所有文章的轉載請注明出處:http://www.cnblogs.com/henjay724/
與痞子衡進一步交流或咨詢業務合作請發郵件至 [email protected]
可以關注痞子衡的Github首頁 https://github.com/JayHeng,有很多好玩的嵌入式項目。
關于專欄文章有任何疑問請直接在部落格下面留言,痞子衡會及時回複免費(劃重點)答疑。
痞子衡郵箱已被私信擠爆,技術問題不推薦私信,堅持私信請先掃碼付款(5元起步)再發。