大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家分享的是i.MXRT全系列FlexSPI外設的LUT長度。
事情起源于一個 RT600 客戶, 他們讀芯片用戶手冊發現 FlexSPI 外設 LUT 長度為 128 words(這是 RT500/RT10xx/RT1170 上的兩倍),他們想嘗試用起來,發現后 64 words 不起作用。說實話,痞子衡用了這么久的 FlexSPI 外設,還真沒注意到這個細節,原因是 64 words 的 LUT 已經能夠支持實現 16 條時序,這對于大部分應用場景都綽綽有余。于是痞子衡找了一塊 RT600 開發板測試了一下,發現確實有問題,這應該是 RT600 用戶手冊上的美麗勘誤。借此機會痞子衡就和大家梳理一下 i.MXRT 全系列 LUT 長度與設計:
Note: 該勘誤存在于 RT600 UM Rev 1.8 以及 SDK v25.06 版本及之前
一、LUT設計差異
LUT 組件可以說是 FlexSPI 外設最核心的部分,關于其工作原理,詳見痞子衡舊文 《從頭開始認識i.MXRT啟動頭FDCB里的lookupTable》。客戶在 RT600 手冊以及 SDK 里發現的勘誤主要是 FlexSPI 結構體原型定義里 LUT 長度 FLEXSPI_LUT_COUNT 被設為了 128,而實際上應該是 64(頭文件一般是根據手冊內容自動生成的)。
LUT 指標除了總長度之外,還有一個重要指標,即單條時序最大長度(也可認為子時序數量),大部分 i.MXRT 上 FlexSPI 單條時序支持的最多子時序為 8 條(每條子時序長度固定 2Bytes),即如下圖。
Note:這里需要注意,當某條時序中子時序不滿 8 條時,剩余空間也不可另作它用,因為 FlexSPI->IPCR1[ISEQID] 里所標示的時序 index 對應得 LUT 里步長單位是時序最大長度。
RT700 上外設升級到了 XSPI,其單條時序支持的最多子時序為 10 條,即如下圖所示,其余 LUT 用法和 FlexSPI 類似。
目前來看 RT1180 最強,支持的時序數量最多,不過對于其它 i.MXRT 也不用慌。如果工程里實際需要的時序大于 16,可以動態更新 LUT 表以分時復用空間,這樣實際能實現的時序數量是不限的。
二、LUT長度對驅動影響
當前 SDK 包里的 flexspi 驅動和例程是以 16 條時序來設計的,這對于除了 RT1180 之外的其它 i.MXRT 型號是合適的。而在 RT1180 上,例程里我們只需把 CUSTOM_LUT_LENGTH 改為 128,然后在 customLUT 里添加更多時序實現即可。
例程路徑: \SDK\boards\evkmimxrt1180\driver_examples\flexspi\nor
#define CUSTOM_LUT_LENGTH 128
const uint32_t customLUT[CUSTOM_LUT_LENGTH] = {
// 時序...
};
而至于 fsl_flexspi.c 驅動(V2.7.0及之前),里面和 LUT 相關的就一個如下函數 FLEXSPI_UpdateLUT(),這個函數用于更新 LUT 表,在例程里我們是一次性更新進去,所以參數里的 index 檢查沒有問題;如果是動態單條更新 LUT,那么函數里面的第一句 assert() 檢查就需要為 RT1180 做相應改動。
至此,i.MXRT全系列FlexSPI外設的LUT長度痞子衡便介紹完畢了,掌聲在哪里~~~