痞子衡嵌入式:i.MXRT全系列下FlexSPI外设AHB Master ID定义与AHB RX Buffer指定的异同


  大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是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主页知乎主页微信公众号 平台上。

微信搜索”痞子衡嵌入式“或者扫描下面二维码,就可以在手机上第一时间看了哦。