大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是i.MXRT全系列下FlexSPI外設AHB Master ID定義與AHB RX Buffer指定的異同。
因為 i.MXRT 全系列型號都不含內部 Flash(部分 SIP 版本除外),因此用於連線外部 NOR Flash 的 FlexSPI 外設格外受寵。為了提高程式碼在 Flash 的原地執行效率,恩智浦設計團隊為 FlexSPI 賦予了 Prefetch 特性用來加速訪問效率(用 AHB RX Buffer 快取資料)。
痞子衡之前寫過一篇關於 Prefetch 效果的實測文章 《FlexSPI外設下AHB讀訪問情形(有預取)》,那篇文章裡只涉及了最簡單的應用場景,即單個 AHB RX Buffer 佔據全部 RX Buffer 空間且僅服務單個 AHB Master - CPU,而實際專案中可能有多個 AHB Master 會對 Flash 進行 AHB 讀訪問,這就引申出了今天的主題:
一、AHB Master與AHB RX Buffer
i.MXRT 系列上 AHB master 包含 Core、DMA、加密模組等多達 16 個,這些 Master 都有能力對 Flash 主動發起 AHB 讀訪問。為了更好地服務這些 Master,FlexSPI 上用於存放預取資料的 AHB RX Buffer 不止一個,一般有 4/8 個,使用者可以按需自由分配這些 AHB RX Buffer 的大小(總大小是一定的,一般是 1/2KB),並且可以將某個 AHB RX Buffer 指定給具體的 Master 來獨佔使用。
- Note: i.MXRT 系列上不支援將多個 AHB RX Buffer 分配給同一個 AHB master,這種需求實際上可以通過配置不同的 AHB RX Buffer 大小來實現。
下面是 i.MXRT 全系列型號上 AHB RX Buffer 情況總結:
i.MXRT型號 | FlexSPI外設個數 | 單FlexSPI上AHB RX Buffer個數 | 單FlexSPI上AHB RX Buffer總大小 |
---|---|---|---|
i.MXRT1011 | 1 | 4 | 1KB |
i.MXRT1015 | 1 | 4 | 1KB |
i.MXRT102x | 1 | 4 | 1KB |
i.MXRT105x | 1 | 4 | 1KB |
i.MXRT106x | 2 | 4 | 1KB |
i.MXRT116x | 2 | 8 | 2KB |
i.MXRT117x | 2 | 8 | 2KB |
i.MXRT5xx | 2 | 8 | FlexSPI0: 1KB FlexSPI1: 2KB |
i.MXRT6xx | 1 | 8 | 2KB |
多個 AHB RX Buffer 帶來的好處是顯而易見的,相比於單個 AHB RX Buffer,其能有效避免因不同 AHB master 頻繁交替訪問 Flash 導致 AHB RX Buffer 被不斷清除與重新快取的低效情況發生。
二、AHB Master ID定義
2.1 i.MXRT10xx
在 i.MXRT10xx 上,AHB master 們被分成了如下表中的四類(正好可分配到 4 個 AHB RX Buffer 上),除了 Core、eDMA、DCP 外,其餘 Master 被直接打包在一起了(無法拆分)。Master ID 值用 4bit 來表示。
2.2 i.MXRT5xx/6xx
在 i.MXRT5xx 上,Master ID 值也是用 4bit 來表示,但是 AHB master 們被進一步細分成了八類(可與 8 個 AHB RX Buffer 一一對應),如下表所示,其實主要最後一類 AXI:AHB Bridge 是打包的。此外這個型號上 FlexSPI0/1 不是完全對等的,所以其各自 Master ID 定義值也不太一樣。
在 i.MXRT6xx 上,Master ID 定義與上表中 FlexSPI1 下的定義一致。
2.3 i.MXRT11xx
在 i.MXRT11xx 上,Master ID 值是用 16bit 來表示的,並且 AHB master 們都有自己專屬的 ID 定義,沒有任何原生打包現象,如下表所示。這個系列是全新架構,它在 ID 設計上新引入了 Remap 技術,這種 Remap 技術允許使用者將多個 Master 打包在一起,從而指定到同一個 AHB RX Buffer 上。這樣 17 個 Master 就可以指定到 8 個 AHB RX Buffer 上了。
三、AHB RX Buffer指定
要想正常使用 AHB RX Buffer,必須保證 FlexSPI 外設的 Prefetch 功能是開啟的,即僅當如下暫存器中的 PREFETCHEN 位被使能才行。每個 AHB RX Buffer 都有獨立的配置暫存器(AHBRXBUFxCR0)。
FlexSPI->AHBCR[PREFETCHEN],總 Prefetch 開關
FlexSPI->AHBRXBUFxCR0[PREFETCHEN],單個 AHB RX Buffer 開關
3.1 i.MXRT5xx/6xx/10xx
i.MXRT5xx/6xx/10xx 中 Master ID 是用 4 bit 來表示的,它們的 AHB RX Buffer 指定在 FlexSPI->AHBRXBUFxCR0[MSTRID] 中。
3.2 i.MXRT11xx
i.MXRT11xx 中 Master ID 是用 16 bit 來表示的,因此 FlexSPI->AHBRXBUFxCR0[MSTRID] 位其實是無效的(即 Reserved 狀態),它們的 AHB RX Buffer 指定應在如下 FlexSPI->HMSTRxCR 暫存器中,不過首先得要使能 Master ID Remap 功能(HMSTRIDREMAP = 1,這個 bit 建議不要設為 0)。
FlexSPI->AHBCR[HMSTRIDREMAP],總 Master ID Remap 開關
至此,i.MXRT全系列下FlexSPI外設AHB Master ID定義與AHB RX Buffer指定的異同痞子衡便介紹完畢了,掌聲在哪裡~~~
歡迎訂閱
文章會同時釋出到我的 部落格園主頁、CSDN主頁、知乎主頁、微信公眾號 平臺上。
微信搜尋"痞子衡嵌入式"或者掃描下面二維碼,就可以在手機上第一時間看了哦。