痞子衡在支援客戶解決串行NOR Flash下載下傳啟動問題過程中主要遇到幾個常見因素,這幾個因素可能會影響Flash在i.MXRT下無法正常使用,今天痞子衡就重點跟大家聊聊SFDP這個因素。
大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是導緻串行NOR Flash在i.MXRT下無法正常下載下傳/啟動的常見因素之SFDP。
i.MXRT系列MCU釋出已兩年多了,基于i.MXRT的客戶産品也越來越多,可以說是全面開花了。痞子衡作為i.MXRT産品線的系統應用工程師,早期的時候還可以盡情做參考設計,現在基本大量時間都被客戶支援占據了。
因為i.MXRT系列都沒有内置Flash(RT1064, RT1024等SIP型号除外),是以為其搭配一塊串行NOR Flash去啟動是客戶項目的頭等大事,而串行NOR Flash廠商非常多,客戶選擇餘地很大,是以我們不得不與客戶一起同茫茫Flash型号打交道,痞子衡也常常調侃自己已淪為Flash測試工程師。
痞子衡在支援客戶解決串行NOR Flash下載下傳啟動問題過程中主要遇到幾個常見因素,這幾個因素可能會影響Flash在i.MXRT下無法正常使用,今天痞子衡就重點跟大家聊聊SFDP這個因素。
SFDP又叫JESD216,是JEDEC協會于2011年開始推出的串行Flash接口标準,類似于CFI在并行NOR Flash上的标準。SFDP發展至今已經誕生了如下版本:
時間
标準
2011
JESD216
2013.07
JESD216A
2014.05
JESD216B
2018.08
JESD216C
2018.11
JESD216D
2019.08
JESD216D.01
我們知道串行Flash廠商非常多,在2011年之前,大家都是各自玩,沒有明确的統一标準(雖然幾個領頭廠商起了示範作用,但各家在具體細節上還是會有差異),這對于Flash使用者來說就比較麻煩了,需要把各家Flash手冊仔細研讀,不能漏掉任何一個細節。
随着串行Flash市場需求越來越強烈,各個廠商也在鉚足勁給自家Flash加特性,這時候JEDEC站出來了,拉了幾個主要的Flash廠商一起訂個SFDP标準,有了這個标準,Flash使用者就友善多了,尤其是軟體設計人員,開發Flash驅動從此有标準可依,甚至一套驅動可以用在所有支援SFDP标準的Flash上,實作各廠商Flash之間輕松切換。
因為SFDP标準是2011年才開始推出,新興Flash廠商(比如兆易創新)的産品基本都是支援SFDP标準的,而部分老牌Flash廠商(比如華邦)則存在老型号和新型号共存的問題。老型号都是2011年前設計生産的,不支援SFDP;2011年之後設計的新型号基本都是支援SFDP的。
華邦目前是串行Flash第一大廠商,痞子衡遇到好幾個i.MXRT客戶,選用的華邦NOR Flash,但Flash裡不支援SFDP,是以客戶支援稍微複雜一些。關于SFDP支援問題,痞子衡特别聯系過華邦銷售人員,得到了他們的答複,華邦NOR Flash家族裡 W25QxxJV 和 W25QxxJW 系列都是新型号,全部支援SFDP;而 W25QxxFV 和W25QxxFW 系列屬于老型号,大多沒有SFDP,但是也有如下部分型号支援SFDP:

雖然我們可以在後續開發的過程中也能正常使用非SFDP标準的Flash以及能通過讀SFDP指令查詢出晶片是否支援SFDP,但最好在Flash選型前就能明确知道其SFDP情況,這個需要跟Flash廠商銷售溝通好。總之,痞子衡推薦大家選用各廠商支援SFDP标準的新型号。
如果你認真看過痞子衡寫的i.MXRT啟動系列文章,你應該知道i.MXRT之是以能夠支援市面上幾乎所有的串行NOR Flash啟動是靠的512 byte的FDCB結構體,這個結構體原型即flexspi_nor_config_t,它可以描述啟動所需的所有Flash參數資訊。
i.MXRT在啟動時首先會用1bit SDR時序模式去擷取使用者放在Flash開始或偏移0x400處(因i.MXRT型号而異)的FDCB,然後根據FDCB裡的資訊去進一步配置啟動,是以Flash裡有無SFDP其實不影響啟動,隻要在FDCB裡描述清楚即可。
但是Flash裡有無SFDP非常影響在i.MXRT相關配套工具下的擦寫操作(俗稱下載下傳),因為所有工具(JLink、各IDE、ROM配套Flashloader、痞子衡的MCUBootUtility)預設都是基于SFDP來設計Flash下載下傳算法的。
僅以ROM配套Flashloader為例,其上位機工具是blhost.exe,它有如下經典的指令序列。這個序列就是利用使用者提供簡化的串行Flash配置值0xc0000007(描述一般的四線QSPI)來初始化FlexSPI以及Flash,為後續擦寫操作做準備。
configure-memory指令底層到底是什麼樣的邏輯呢?讓我們找到任何一個SDK包,在\SDK_2.x.x_MIMXRTxxxx-EVK\middleware\mcu-boot\src\memory\src\flexspi_nor_memory.c裡可以找到如下函數flexspi_nor_mem_config(),它就是其底層邏輯,在這個函數裡我們可以看到,Flashloader會判斷傳來的config值到底是簡化的serial_nor_config_option_t,還是完整的flexspi_nor_config_t。
如果config是簡化的serial_nor_config_option_t,Flashloader會調用flexspi_nor_get_config()函數去自動填充生成完整的flexspi_nor_config_t,你可以繼續去看flexspi_nor_get_config()函數的實作,對于普通四線QSPI,其就是根據Flash裡讀回的SFDP表内容來做的填充,是以這種方式下SFDP不可缺。
上面這種0xc0000007搞定一切四線QSPI的方式僅适用于含SFDP的Flash,對于不含SFDP的Flash怎麼辦呢。其實上面已經給了解決方法,那就是直接提供完整的FDCB,是以i.MXRT相關配套工具下載下傳算法都需要相應改一下,痞子衡在兩個項目上都做了非SFDP Flash支援:
J-Link下載下傳算法源工程,可以參考 /boards/msft_rt600_xproject/flash_algo_b0_silicon/Keil_JLink 這個源工程 MCUBootUtility v2.3更新,參看文章 《MCUBootUtility v2.3釋出,這次不再放過任何一款Flash》 第2.3節
至此,導緻串行NOR Flash在i.MXRT下無法正常下載下傳/啟動的常見因素之SFDP痞子衡便介紹完畢了,掌聲在哪裡~~~
文章會同時釋出到我的 部落格園首頁、CSDN首頁、知乎首頁、微信公衆号 平台上。
微信搜尋"痞子衡嵌入式"或者掃描下面二維碼,就可以在手機上第一時間看了哦。
最後歡迎關注痞子衡個人微信公衆号【痞子衡嵌入式】,一個專注嵌入式技術的公衆号,跟着痞子衡一起玩轉嵌入式。
衡傑(痞子衡),目前就職于恩智浦MCU系統部門,擔任嵌入式系統應用工程師。
專欄内所有文章的轉載請注明出處:http://www.cnblogs.com/henjay724/
與痞子衡進一步交流或咨詢業務合作請發郵件至 [email protected]
可以關注痞子衡的Github首頁 https://github.com/JayHeng,有很多好玩的嵌入式項目。
關于專欄文章有任何疑問請直接在部落格下面留言,痞子衡會及時回複免費(劃重點)答疑。
痞子衡郵箱已被私信擠爆,技術問題不推薦私信,堅持私信請先掃碼付款(5元起步)再發。