痞子衡嵌入式: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 是打包的(包含 GPU、LCDIF 等)。此外这个型号上 FlexSPI0/1 不是完全对等的,所以其各自 Master ID 定义值也不太一样。

  在 i.MXRT6xx 上,Master ID 定义在 Rev1.4 版本的用户手册上并没有找到,需要等文档更新,盲猜跟 i.MXRT5xx FlexSPI1下的定义差不多,不过 i.MXRT6xx 上并没有 SmartDMA 外设,所以还需考证。

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主页知乎主页微信公众号 平台上。

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

  最后欢迎关注痞子衡个人微信公众号【痞子衡嵌入式】,一个专注嵌入式技术的公众号,跟着痞子衡一起玩转嵌入式。

痞子衡嵌入式-微信二维码 痞子衡嵌入式-微信收款二维码 痞子衡嵌入式-支付宝收款二维码

  衡杰(痞子衡),目前就职于恩智浦MCU系统部门,担任嵌入式系统应用工程师。

  专栏内所有文章的转载请注明出处:http://www.cnblogs.com/henjay724/

  与痞子衡进一步交流或咨询业务合作请发邮件至 hengjie1989@foxmail.com

  可以关注痞子衡的Github主页 https://github.com/JayHeng,有很多好玩的嵌入式项目。

  关于专栏文章有任何疑问请直接在博客下面留言,痞子衡会及时回复免费(划重点)答疑。

  痞子衡邮箱已被私信挤爆,技术问题不推荐私信,坚持私信请先扫码付款(5元起步)再发。


posted @ 2021-10-13 21:56  痞子衡  阅读(48)  评论(0编辑  收藏  举报