大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是i.MXRT1024/1064片內4MB Flash的SFDP表易丟失導致的燒錄異常。
我們知道 i.MXRT 系列本身并沒有片內非易失性存儲器作為啟動設備,所以硬件工程師第一件事便是為 i.MXRT 搭配一顆外置代碼存儲器,而串行 NOR Flash 往往是代碼存儲器的第一選擇。既然這是剛需,為何不直接合封一顆經典的 NOR Flash 進芯片內部呢?是的,恩智浦也考慮到了這一點,這便有了 i.MXRT1024/1064 這兩顆內置 Flash 的型號(至于沒有給 i.MXRT 全系列強制標配 NOR Flash,也跟代碼存儲器類型以及容量、速度需求不一有關)。
近期有一個 RT1064 客戶反饋,在給產品做量產時出現芯片無法正常使用 J-Link 或者恩智浦官方下載工具下載程序到片內 Flash 的現象,恰好痞子衡手頭有一塊官方 RT1064-EVK 板卡也無法燒錄程序,經過痞子衡的一番摸索,發現片內 Flash 竟然沒有有效的 SFDP 表,這是怎么回事?且聽痞子衡細說:
一、RT片內Flash簡介
1.1 W25Q32JV
芯片合封技術實際上并不是什么新鮮事,對于 RT1024/1064 來說,就是將 RT1020/RT1060 的 Die 與選定的一顆 NOR Flash Die 封裝在一起,RT 與 Flash 之間的信號連接在片內完成。
那么 RT1024/1064 內置的 NOR Flash 到底來自哪家供應商呢?這可以借助 \SDK_2_16_000_EVK-MIMXRT1064\boards\evkmimxrt1064\driver_examples\flexspi\nor_internal\polling_transfer 例程簡單修改一下代碼,讀回 Flash 的 JEDEC ID 得知是來自全球排名第一的 NOR Flash 廠商 Winbond 的 W25Q32JV-IQ/JQ(4MB, 四線, 133MHz SDR,3.3V)。
1.2 RT1024片內連接
在 RT1024 上使用了如下 PAD 連接到了片內 Flash,這些 PAD 同時也是外部引腳。(注意其中 GPIO_SD_B1_05 并沒有被 BootROM 初始化,因為片內 Flash 不能直接高速啟動)
1.3 RT1064片內連接
在 RT1064 上使用了如下 PAD 連接到了片內 Flash,這些 PAD 僅是內部引腳,沒有引到外部。(不過在 BGA 225 封裝的 RT1060X 型號上被引出了)
二、SFDP對于燒錄工具的重要性
JESD216 是一個關于串行 NOR Flash 的標準,它“規范”了 NOR Flash 廠商的產品。這里的“規范”兩字加了引號,因為這個標準比較有意思,并不是先有標準,再有 Flash 產品,而是先有各大廠商的 Flash 產品出來,然后 JESD216 才開始總結這些不同廠商的產品特性,企圖形成一個看起來比較統一的規范。
目前主流 NOR Flash 廠商產品都是支持 JESD216 標準的,這體現在如下 Read SFDP (0x5A) 命令時序統一上。JESD216 標準定義了一個 256 字節大小的 SFDP 表,這個表收納了該 Flash 的幾乎全部特性(速度、容量、寄存器分布、命令集等等),對于軟件驅動開發者來說尤其重要。
SFDP 表結構大概是這樣,一開始是 signature 以及 version,然后是 Flash 各種屬性信息。看到這你就能明白為啥 SFDP 對于燒錄工具的重要性了,燒錄工具依賴底層的 Flashloader,而 Flashloader 一般設計上是追求通用的,所以其會先獲取 Flash SFDP 表進行解析得到 Flash 全部信息,然后根據這些信息加載合適的軟件驅動去讀寫擦 Flash。因此如果得不到正確的 SFDP 表,那么依賴通用 Flashloader 的燒錄工具便無法正常工作。J-Link 以及恩智浦官方燒錄工具都是基于通用 Flashloader 思想設計的。
三、Winbond NOR Flash的SFDP操作
翻開以 W25Q32JV 為代表的 Winbond NOR Flash 數據手冊,我們從其模塊框圖可以得知 Flash 內部存儲顆粒由三種類型組成, 地址范圍 0x000000 - 0x3FFFFF 的 Memory Block,地址范圍 0x000000 - 0x0000FF 的 SFDP,地址范圍 0x001000 - 0x0030FF 的 Security Registers。對于 Memory Block 的讀寫擦操作我們再熟悉不過了,那后兩種類型該用什么命令操作呢?
繼續查看數據手冊,找到了如下關于 Security Registers 的專用讀寫擦命令時序。上一節介紹了 Read SFDP 命令,似乎 SFDP 這個地址空間僅支持讀操作,那么 SFDP 數據是如何在 Flash 出廠時被寫入的呢?到底是直接固化(隨芯片 TO)?還是 OTP 一次性專用后門命令擦寫的?帶著這個疑惑,痞子衡咨詢了 Winbond 技術人員,他們告知其實 Security Registers 擦寫命令可以同樣擦寫 SFDP 空間。
即 Security Registers 讀寫擦命令時序里地址參數 A15-12 設 4'b0000 時,實際操作得就是 SFDP 空間(雖然手冊里沒有明說這一點)。基于這個消息,痞子衡找了一個正常的 RT1064-EVK 板卡讀出其有效的 SFDP 表數據,然后將該 SFDP 表寫入異常的 RT1064-EVK 板卡,這時候下載工具就能夠正常燒錄了。所以 RT1024/RT1064 芯片發生這種異常,要么是出廠漏燒了 SFDP 表,要么是 SFDP 被用戶誤擦除過。
至此,i.MXRT1024/1064片內4MB Flash的SFDP表易丟失導致的燒錄異常痞子衡便介紹完畢了,掌聲在哪里~~~