今天痞子衡給大家介紹的是i.MXRT全系列下FlexSPI外設(shè)AHB Master ID定義與AHB RX Buffer指定的異同。
因?yàn)?i.MXRT 全系列型號(hào)都不含內(nèi)部 Flash(部分 SIP 版本除外),因此用于連接外部 NOR Flash 的 FlexSPI 外設(shè)格外受寵。為了提高代碼在 Flash 的原地執(zhí)行效率,恩智浦設(shè)計(jì)團(tuán)隊(duì)為 FlexSPI 賦予了 Prefetch 特性用來加速訪問效率(用 AHB RX Buffer 緩存數(shù)據(jù))。
痞子衡之前寫過一篇關(guān)于 Prefetch 效果的實(shí)測(cè)文章 《FlexSPI外設(shè)下AHB讀訪問情形(有預(yù)?。?,那篇文章里只涉及了最簡(jiǎn)單的應(yīng)用場(chǎng)景,即單個(gè) AHB RX Buffer 占據(jù)全部 RX Buffer 空間且僅服務(wù)單個(gè) AHB Master - CPU,而實(shí)際項(xiàng)目中可能有多個(gè) AHB Master 會(huì)對(duì) Flash 進(jìn)行 AHB 讀訪問,這就引申出了今天的主題:
一、AHB Master與AHB RX Buffer
i.MXRT 系列上 AHB master 包含 Core、DMA、加密模塊等多達(dá) 16 個(gè),這些 Master 都有能力對(duì) Flash 主動(dòng)發(fā)起 AHB 讀訪問。為了更好地服務(wù)這些 Master,F(xiàn)lexSPI 上用于存放預(yù)取數(shù)據(jù)的 AHB RX Buffer 不止一個(gè),一般有 4/8 個(gè),用戶可以按需自由分配這些 AHB RX Buffer 的大小(總大小是一定的,一般是 1/2KB),并且可以將某個(gè) AHB RX Buffer 指定給具體的 Master 來獨(dú)占使用。
- Note: i.MXRT 系列上不支持將多個(gè) AHB RX Buffer 分配給同一個(gè) AHB master,這種需求實(shí)際上可以通過配置不同的 AHB RX Buffer 大小來實(shí)現(xiàn)。
下面是 i.MXRT 全系列型號(hào)上 AHB RX Buffer 情況總結(jié):
i.MXRT型號(hào) | FlexSPI外設(shè)個(gè)數(shù) | 單FlexSPI上AHB RX Buffer個(gè)數(shù) | 單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 |
多個(gè) AHB RX Buffer 帶來的好處是顯而易見的,相比于單個(gè) AHB RX Buffer,其能有效避免因不同 AHB master 頻繁交替訪問 Flash 導(dǎo)致 AHB RX Buffer 被不斷清除與重新緩存的低效情況發(fā)生。
二、AHB Master ID定義
2.1 i.MXRT10xx
在 i.MXRT10xx 上,AHB master 們被分成了如下表中的四類(正好可分配到 4 個(gè) AHB RX Buffer 上),除了 Core、eDMA、DCP 外,其余 Master 被直接打包在一起了(無法拆分)。Master ID 值用 4bit 來表示。
2.2 i.MXRT5xx/6xx
在 i.MXRT5xx 上,Master ID 值也是用 4bit 來表示,但是 AHB master 們被進(jìn)一步細(xì)分成了八類(可與 8 個(gè) AHB RX Buffer 一一對(duì)應(yīng)),如下表所示,其實(shí)主要最后一類 AXI:AHB Bridge 是打包的。此外這個(gè)型號(hào)上 FlexSPI0/1 不是完全對(duì)等的,所以其各自 Master ID 定義值也不太一樣。
在 i.MXRT6xx 上,Master ID 定義與上表中 FlexSPI1 下的定義一致。
2.3 i.MXRT11xx
在 i.MXRT11xx 上,Master ID 值是用 16bit 來表示的,并且 AHB master 們都有自己專屬的 ID 定義,沒有任何原生打包現(xiàn)象,如下表所示。這個(gè)系列是全新架構(gòu),它在 ID 設(shè)計(jì)上新引入了 Remap 技術(shù),這種 Remap 技術(shù)允許用戶將多個(gè) Master 打包在一起,從而指定到同一個(gè) AHB RX Buffer 上。這樣 17 個(gè) Master 就可以指定到 8 個(gè) AHB RX Buffer 上了。
三、AHB RX Buffer指定
要想正常使用 AHB RX Buffer,必須保證 FlexSPI 外設(shè)的 Prefetch 功能是開啟的,即僅當(dāng)如下寄存器中的 PREFETCHEN 位被使能才行。每個(gè) AHB RX Buffer 都有獨(dú)立的配置寄存器(AHBRXBUFxCR0)。
FlexSPI->AHBCR[PREFETCHEN],總 Prefetch 開關(guān)
FlexSPI->AHBRXBUFxCR0[PREFETCHEN],單個(gè) AHB RX Buffer 開關(guān)
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] 位其實(shí)是無效的(即 Reserved 狀態(tài)),它們的 AHB RX Buffer 指定應(yīng)在如下 FlexSPI->HMSTRxCR 寄存器中,不過首先得要使能 Master ID Remap 功能(HMSTRIDREMAP = 1,這個(gè) bit 建議不要設(shè)為 0)。
FlexSPI->AHBCR[HMSTRIDREMAP],總 Master ID Remap 開關(guān)
至此,i.MXRT全系列下FlexSPI外設(shè)AHB Master ID定義與AHB RX Buffer指定的異同痞子衡便介紹完畢了,掌聲在哪里~~~