痞子衡嵌入式:i.MXRT全系列下FlexSPI外設AHB Master ID定義與AHB RX Buffer指定的異同

痞子衡發表於2021-10-13

  大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是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主頁知乎主頁微信公眾號 平臺上。

微信搜尋"痞子衡嵌入式"或者掃描下面二維碼,就可以在手機上第一時間看了哦。

相關文章