痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU启动那些事(11.B)- FlexSPI NOR连接方式大全(RT1015/1020/1050)


  大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是恩智浦i.MX RT1015/1020/1050三款MCU的FlexSPI NOR启动的连接方式

  由于i.MXRT内部没有非易失性存储器,因此在系统设计时为i.MXRT搭配一块存放应用程序代码的存储器是头等大事。i.MXRT支持启动的外部存储器类型众多,其中通过FlexSPI接口连接串行NOR Flash是首选。

  就i.MXRT芯片引脚本身来说,其FlexSPI模块支持的Pinmux选择较多,这在芯片参考手册Chip IO一章可以找到具体信息。但是并不是所有FlexSPI Pinmux组合都能被用来连接串行NOR Flash去启动。

  i.MXRT1050/1020/1015是i.MXRT系列MCU家族比较早亮相的型号,也是客户当前使用较多的i.MXRT芯片。它们三兄弟内部均只有一个双通道8bit的FlexSPI模块,在FlexSPI NOR启动连接方式支持上是相似的。今天痞子衡就来跟大家好好聊一聊到底哪些FlexSPI NOR连接方式是可以用作启动的。

  • Note: 本文提及的芯片,在系统映射地址空间分配上,给 FlexSPI 分配的起始地址是 0x60000000,因此 XIP 应用程序需要从 0x60000000 之后的空间开始链接

一、FlexSPI连接模式

  在讲启动连接之前,首先跟大家简单聊一下FlexSPI模块的连接模式。从手册里看,FlexSPI一共有三种连接模式:

Individual mode:如下图左边Flash A1+A2+B1+B2,它们分时复用FlexSPI,同一时刻仅有一个四线QSPI Flash被操作(仅一个PORT有数据收发)。
Parallel mode:如下图左边Flash A1+B1或Flash A2+B2,同一时刻两个四线QSPI Flash可以一起被操作(两个PORT都有数据收发),FlexSPI会自动合并/拆分数据(read/program)到两个PORT。
Combination mode:如下图右边Flash A1或A2,这是FlexSPI接八线Octal/Hyper Flash的方法。

二、涉及FlexSPI引脚

  提及启动,就不得不提i.MXRT芯片内部BootROM,BootROM是固化在芯片内部ROM空间的一段代码,芯片上电永远是BootROM先运行,由BootROM从外部存储器去加载应用程序执行。因此FlexSPI NOR连接方式其实是由BootROM决定的,更直白点说,其实FlexSPI NOR连接方式是写死在BootROM代码里。

2.1 BootROM指定

  我们可以在芯片参考手册System Boot这一章节找到BootROM指定的FlexSPI NOR引脚,痞子衡整理如下:

  下表适用于i.MXRT105x(适用全系列封装):

  下表适用于i.MXRT102x和i.MXRT1015(对于LQFP144封装,所有引脚均适用。对于LQFP100封装,只有1st Option里ALT为1的12根线可用):

  上面的表格基本上已经给我们指明了方向,目前我们知道了哪些Pin可以用作FlexSPI NOR启动连接,但是似乎还是有一些不清楚的地方:

疑问1:1st Option里一共有4根片选信号(SSx)和2根DQS信号,而Flash只需要一个片选和一个DQS,是不是所有片选+DQS组合都可以?
疑问2:1st Option里一共8根数据线,除了连接八线Octal/Hyper Flash之外,是否可以单连四线QSPI Flash?PortA和PortB是不是都可以连QSPI Flash?
疑问3:是否可以从1st和2nd Option里分别挑选信号线和数据线来连接Flash?比如1st Option里的PortA_DATA[1:0]和2nd Option里的PORTA_DATA[3:2]组成四线。
疑问4:那根FlexSPI Reset信号对于1st和2nd Option是不是都适用?
疑问5:是否可以挂两片QSPI Flash启动?具体怎么挂?两片Flash能否实现在一片Flash中执行代码去擦写另一片Flash?
疑问6:2nd Option里只有PortA和一根片选,但RT1050 Pinmux表里其也支持PortB和其他片选,那些信号线后续是否可以利用?

  在后面的内容里,痞子衡会逐一为大家解析这些疑问。

2.2 BootROM未指定

  在此也列出不在BootROM指定的FlelxSPI NOR引脚,方便后续设计双Flash时参考。

  下表适用于i.MXRT105x(适用全系列封装):

  下表适用于i.MXRT102x和i.MXRT1015(适用全系列封装):

三、单Flash连接方式(3种)

  在系统设计时使用一片Flash是最常用的情况,这片Flash负责存放应用程序代码(即所谓的Code Flash),i.MXRT既可以在Flash中原地执行,也可以将应用程序拷贝到内部RAM中执行。

  相信大家做板级设计一定会参考官方EVK,在RT1050-EVKB中,官方给出了如下两种单Flash的连接方式,这也是最推荐的两种方式:

  第一种Flash连接方式就是利用FlexSPI 1st Option里的6根PORTA信号线连接四线QSPI Flash,此处需要注意的是片选信号仅能选PORTA_SS0,你可能会疑问PORTA_SS1明明也在BootROM支持列表里,为何不能用?关于这一点痞子衡会在后面双Flash连接里为大家解释。

  第二种Flash连接方式就是利用FlexSPI 1st Option里的7根PORTA信号线和5根PORTB信号线连接八线Octal/Hyper Flash,此处仍需注意的是片选和DQS信号仅能选PORTA_SS0、PORTA_DQS。此种Flash接法还利用了FlexSPI Reset信号。

  • Note: 如果连接的是 HyperFlash,需要烧写eFuse 0x450 或拨码对应 BOOT_CFG 引脚, 将 FLASH_TYPE[2:0] 设为 010-HyperFlash 1V8 / 011-HyperFlash 3V3 才能启动

  第三种Flash连接方式就是利用FlexSPI 2nd Option里的6根PORTA信号线连接四线QSPI Flash,具体接法跟第一种方式很像,但是此处没有关于片选的疑虑,因为2nd Option只有一个片选。

  • Note: 需要烧写eFuse 0x450 或拨码对应 BOOT_CFG 引脚, 将 FLASH_TYPE[2:0] 设为 111 - QSPI device supports 3B read by default on secondary pinmux option 才能启动

  介绍完三种单Flash连接方案,现在来解答一些前面列出的疑问。

解答1:1st Option里一共4根片选信号(SSx)和2根DQS信号并不是随意组合都可以,无论是四线还是八线单Flash连接方案,均只有PORTA_SS0、PORTA_DQS这一种组合可用。其他组合主要用在双Flash连接方案中。
解答2:1st Option中仅PORTA可以单独接四线QSPI Flash,不支持PORTB单独接四线QSPI Flash。
解答3:不支持从1st和2nd Option里分别挑选数据线来连接Flash(不过就FlexSPI模块本身而言,理论上是支持的,但这么用的话需要解决数据线信号等长问题,因为这两个Option的走线长度在芯片内部不一样,总之不推荐这么用)。但是支持1st Option里取信号线,2nd Option里取数据线类似这种组合方式来连接Flash。
解答4:FlexSPI Reset信号是与1st、2nd Option无关的,所以两个Option下均可以用,不过Reset信号常用于八线Flash。

四、双Flash连接方式(18种)

  很多实际系统设计中,常常有既在Flash中存放用户应用程序,也在Flash中存放用户数据的场景,当然我们可以将一片Flash分成Code区和Data区来实现,但更好的方案是选用两片Flash(一片Code Flash、一片Data Flash)同时挂在FlexSPI上,这样可以避免数据误操作,而且最重要的是在擦除或者编程Data Flash的等待期间(这个时间可不短),CPU可以继续从Code Flash取代码执行或响应中断。此处我们暂不讨论支持RWW特性的Flash。

  i.MXRT支持挂两片Flash去启动,此处仅以两片四线QSPI Flash为例。下图给出了多片Flash的连接方式,理论上一个FlexSPI最多可以挂四片Flash,因为最大有4个片选。但仅考虑接两片Flash的话,1st Option以及2nd Option里所有片选按排列组合来说应该有近30多种组合方式,那么这30多种组合是不是都可行呢?当然不是!要在这些组合中剔除掉不包含1st A_SS0或者2nd A_SS0的组合。即下图中标浅绿色的Flash A0在双Flash组合中是一定要存在的,因为BootROM上电永远是从Flash A0中获取FDCB以及启动代码头(IVT, BootData),所以Flash A0就是Code Flash

  分析到了这里,我们就知道如下符合条件的18种包含Flash A0的组合方式,其中标记Code的片选信号应该连接存放应用程序代码的Code Flash,标记Data的片选信号则连接存放用户数据的Data Flash:

Note1:如果两个Flash挂在同一类型PORT上(都是PORTA或都是PORTB),即下面的第1、2、3、10、11、12种组合时,这两片Flash最好是同一个型号,这样电气特性容易保持一致。
Note2:如果组合中所有引脚选择全部在BootROM指定范围里,那么BootROM直接支持Data Flash的配置。如果有引脚不在BootROM指定范围,那么需要用户在Code Flash用代码去实现Data Flash配置。

Num FlexSPI 1st Option FlexSPI 2nd Option
BootROM指定 BootROM未指定 BootROM指定 BootROM未指定
不适用LQFP100 不适用LQFP100 不适用LQFP144/100
A_SS0 A_DATA[3:0]
A_SCLK
B_SCLK B_DATA[3:0] A_SS1 B_SS0 B_SS1 A_SS1 B_SS0 A_SS0 A_DATA[3:0]
A_SCLK
A_SS1 B_DATA[3:0]
1
Code

Data
2
Code

Data
3
Code

Data
4
Code

Data
5
Code

Data
6
Code

Data
7
Code

Data
8
Code

Data
9
Code

Data
10
Data

Code
11
Data

Code
12
Code

Data
13
Data

Code
14
Data

Code
15
Data

Code
16
Data

Code
17
Data

Code
18
Data

Code

  介绍完18种双Flash连接方案,现在来解答一些前面列出的疑问。

解答5:可以挂两片QSPI Flash启动,一共有18种连接方式。两片Flash的方案还是不可以实现在Code Flash里原地执行代码去擦写Data Flash这种用法,但可以实现RWW的核心意义,下一节会单独展开讲这个。
解答6:不在BootROM指定的2nd Option PortB信号可以用于连接Data Flash,但是Data Flash的配置需要由Code Flash里的用户应用程序代码来完成,BootROM无法直接配置Data Flash。

五、关于RWW的注意事项

  现在市面上大部分Flash(尤其是普通四线QSPI)是不支持RWW(Read-While-Write)特性的,就是在单片Flash上无法实现同时读写。但如果我们在i.MXRT1015/1020/1050系统设计中采用一片支持RWW特性的Flash或者直接使用两片Flash,是否可以实现在Code Flash(或RWW Flash中的Code分区)中原地执行代码去擦写Data Flash(或RWW Flash中的Data分区)这种需求。答案其实还是不可以,这是由FlexSPI模块本身特性限制的,这个特性就是同一个FlexSPI模块下的AHB command和IP command是互斥的

5.1 FlexSPI异类命令互斥特性

  下图是FlexSPI模块框图,可以这么简单理解,CPU去Code Flash取程序代码指令走的是64bit AHB Bus(即AHB command),Code Flash里的程序代码里调用FlexSPI驱动去擦除或编程Data Flash走的是32bit IPS Bus(即IP command),这两种不同类型的command会经过ARB_CTL模块去仲裁,同一时间只有一种command胜出成为ARB command去实际操作Flash。

  那FlexSPI模块这个限制到底怎么破?有以下四种方式可以来帮忙:

方法1:在MPU里设置Code Flash对应的映射地址区域,使能Cache,并且保证应用程序代码里调用FlexSPI驱动去擦写Data Flash的关键部分(触发IP CMD执行)始终缓存在Cache里。
方法2:将应用程序代码里调用FlexSPI驱动去擦写Data Flash的关键部分搬运到RAM空间去运行,可以直接借助IDE特性去完成(比如IAR,可以用__ramfunc去修饰关键函数)。
方法3:在写Data Flash的时候借助DMA来搬运数据,不让CPU干预,具体可以参考官方《AN12564 Implement RWW on i.MX RT Series》
方法4:应用程序代码里的FlexSPI驱动直接使用BootROM API(代码是在ROM空间运行的)。

  这四种方法里首推方法4,既能实现需求,又能省Code Flash空间(FlexSPI驱动代码说小不小)。方法1其实是不推荐的,毕竟Cache是种玄学,岂是你想控制就控制的。

5.2 RWW的核心意义

  最后再说一下,挂两片Flash(或一片RWW Flash)到底相比挂一片非RWW Flash有什么好处?这就涉及到RWW的核心意义了,其实痞子衡前面已经讲过了,虽然不能实现在Code Flash中原地执行擦写操作相关代码,但是在Data Flash擦写等待期间,CPU可以继续从Code Flash取代码执行,这意味着此时不需要刻意关闭系统全局中断,因此不影响系统响应的实时性。

  至此,恩智浦i.MX RT1015/1020/1050三款MCU的FlexSPI NOR启动的连接方式痞子衡便介绍完毕了,掌声在哪里~~~

欢迎订阅

文章会同时发布到我的 博客园主页CSDN主页微信公众号 平台上。

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

posted @ 2020-02-28 16:50  痞子衡  阅读(4140)  评论(0编辑  收藏  举报