大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是Flash工作頻率與Dummy Cycle的聯系。
上一篇文章 《從頭開始認識i.MXRT啟動頭FDCB裡的lookupTable》,痞子衡帶大家從頭梳理了下i.MXRT下啟動頭FDCB裡lookupTable的設計與實作細節,在這個過程中也簡單跟大家介紹了串行NOR Flash的工作模式(主要是Fast Read Quad I/O),今天痞子衡在FDCB設定範疇下跟大家再進一步地探讨Flash工作頻率與Dummy Cycle設定問題。
今天我們以i.MXRT1170-EVK上的闆載Flash為例,其具體型号為IS25WP128-JBLE,在Flash資料手冊特性介紹裡可以看到這顆Flash最高可以運作在133MHz頻率下(SDR模式),并且其Dummy Cycle也是可選的,那麼Dummy Cycle是不是可以任意配呢?答案既是也不是,痞子衡先賣個關子。

讓我們再來回顧下這顆Flash的Fast Read Quad I/O時序圖,從時序圖裡可以看到Dummy Cycle預設是6(包括Mode Bits時序一共6個SCK時鐘周期),那麼預設的6個Dummy Cycle是不是适用全部的Flash工作頻率呢?咱們繼續看Flash資料手冊。
在資料手冊裡找到了下面這張表,Read Dummy Cycle與最大工作頻率的聯系,從表裡可以看到當Flash工作在Fast Read Quad I/O模式時,預設的6個Dummy Cycle适用的最大工作頻率是104MHz,即104MHz工作頻率及以下均可以使用預設的6個Dummy Cycle。如果工作頻率高于104MHz,Dummy Cycle應相應調大,比如133MHz工作頻率需對應至少9個Dummy Cycle。
根據上面的分析,如果我們希望i.MXRT1170-EVK上這顆IS25WP128-JBLE啟動後工作在133MHz,那麼我們需要在FDCB裡至少配置9個Dummy Cycle。是以下述FDCB啟動頭裡 FLASH_DUMMY_CYCLES 宏應設為9, qspiflash_config.memConfig.serialClkFreq 應改為 kFlexSpiSerialClk_133MHz,這樣的設定對于i.MXRT端是足夠的,因為更改後FlexSPI外設确實可以輸出133MHz的SCK,并且按9個Dummy Cycle的時序去讀Flash。
但是把這樣的FDCB啟動頭直接下載下傳進Flash後發現i.MXRT無法從Flash正常啟動,因為Flash端的Dummy Cycle還是預設的6個SCK周期,上面的FDCB僅僅是調整了FlexSPI輸出,并不會同步調整Flash端,此時主從兩端Dummy Cycle數不比對,時序錯亂了,傳輸資料發生了錯位,應用程式當然無法啟動。
是以Flash這邊需要其他的方式設定好Dummy Cycle後,上述方式更改的FDCB啟動頭才能正常使用。
有一個現象需要特别說明一下,如果我們直接修改 qspiflash_config.memConfig.serialClkFreq 到 kFlexSpiSerialClk_133MHz, 但是 FLASH_DUMMY_CYCLES 依舊保持預設的6,這樣的FDCB頭下載下傳進Flash也可以正常工作的,雖然有點違反Flash資料手冊裡的Dummy Cycle規範,但實測下來似乎是沒問題的,那是不是意味着我們根本不需要動預設的Dummy Cycle?其實不是的,當我們使能Flash的 continuous read mode 的時候,Dummy Cycle不規範就會出問題,關于這點痞子衡會單獨寫一篇文章細聊。
那麼Flash裡的Dummy Cycle到底怎麼改呢?這需要我們繼續看Flash資料手冊,IS25WP128-JBLE内部有個8bit的Read Register,其bit6-bit3是Dummy Cycles設定,可設範圍是1-15,并且在寄存器類型裡可以看到其有易失性和非易失性兩種屬性,也就是說我們既可以臨時地改Dummy Cycle(掉電即恢複預設6),也可以永久地改Dummy Cycle(掉電仍保持上一次設定)。
在IS25WP128-JBLE的指令集表裡,可以看到有專門寫Read Register的指令,SRPNV指令是非易失性方式地寫Read Register,SRPV指令是易失性方式去寫Read Register。
分析到這裡,問題就變成到底是使用一個額外的小工程(比如借助SDK裡的flexspi example稍微更改下代碼)以SRPNV指令去永久性更改下Flash裡的Dummy Cycle再用作i.MXRT啟動,還是i.MXRT每次啟動時直接借助FDCB啟動頭裡的設定用SRPV指令臨時地更改Flash的Dummy Cycle?從靈活性角度,痞子衡推薦第二種方式,那麼在FDCB裡應該怎麼做?痞子衡直接給答案:
說到BootROM對FDCB的處理,大家有必要先回顧下痞子衡寫過的一篇舊文 《深入i.MXRT1050系列ROM中串行NOR Flash啟動初始化流程》,文章雖然是針對i.MXRT1050寫的,但基本流程也差不多适用i.MXRT1170,在文中的 2.6 小節第二次初始化裡,我們在上面FDCB裡的關于Flash寄存器的額外配置操作才會被處理,代碼大緻如下:
至此,Flash工作頻率與Dummy Cycle的聯系痞子衡便介紹完畢了,掌聲在哪裡~~~
文章會同時釋出到我的 部落格園首頁、CSDN首頁、知乎首頁、微信公衆号 平台上。
微信搜尋"痞子衡嵌入式"或者掃描下面二維碼,就可以在手機上第一時間看了哦。
最後歡迎關注痞子衡個人微信公衆号【痞子衡嵌入式】,一個專注嵌入式技術的公衆号,跟着痞子衡一起玩轉嵌入式。
衡傑(痞子衡),目前就職于恩智浦MCU系統部門,擔任嵌入式系統應用工程師。
專欄内所有文章的轉載請注明出處:http://www.cnblogs.com/henjay724/
與痞子衡進一步交流或咨詢業務合作請發郵件至 [email protected]
可以關注痞子衡的Github首頁 https://github.com/JayHeng,有很多好玩的嵌入式項目。
關于專欄文章有任何疑問請直接在部落格下面留言,痞子衡會及時回複免費(劃重點)答疑。
痞子衡郵箱已被私信擠爆,技術問題不推薦私信,堅持私信請先掃碼付款(5元起步)再發。