你们好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给你们介绍的是恩智浦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链接方式是能够用做启动的。缓存
在讲启动链接以前,首先跟你们简单聊一下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的方法。函数
说起启动,就不得不提i.MXRT芯片内部BootROM,BootROM是固化在芯片内部ROM空间的一段代码,芯片上电永远是BootROM先运行,由BootROM从外部存储器去加载应用程序执行。所以FlexSPI NOR链接方式实际上是由BootROM决定的,更直白点说,其实FlexSPI NOR链接方式是写死在BootROM代码里。flex
咱们能够在芯片参考手册System Boot这一章节找到BootROM指定的FlexSPI NOR引脚,痞子衡整理以下:spa
下表适用于i.MXRT105x(适用全系列封装):.net
下表适用于i.MXRT102x和i.MXRT1015(对于LQFP144封装,全部引脚均适用。对于LQFP100封装,只有1st Option里ALT为1的12根线可用):设计
上面的表格基本上已经给咱们指明了方向,目前咱们知道了哪些Pin能够用做FlexSPI NOR启动链接,可是彷佛仍是有一些不清楚的地方:3d
疑问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和其余片选,那些信号线后续是否能够利用?blog
在后面的内容里,痞子衡会逐一为你们解析这些疑问。
在此也列出不在BootROM指定的FlelxSPI NOR引脚,方便后续设计双Flash时参考。
下表适用于i.MXRT105x(适用全系列封装):
下表适用于i.MXRT102x和i.MXRT1015(适用全系列封装):
在系统设计时使用一片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信号。
第三种Flash链接方式就是利用FlexSPI 2nd Option里的6根PORTA信号线链接四线QSPI Flash,具体接法跟第一种方式很像,可是此处没有关于片选的疑虑,由于2nd 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中存放用户应用程序,也在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),即下面的第一、二、三、十、十一、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。
如今市面上大部分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是互斥的。
下图是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是种玄学,岂是你想控制就控制的。
最后再说一下,挂两片Flash(或一片RWW Flash)到底相比挂一片非RWW Flash有什么好处?这就涉及到RWW的核心意义了,其实痞子衡前面已经讲过了,虽然不能实如今Code Flash中原地执行擦写操做相关代码,可是在Data Flash擦写等待期间,CPU能够继续从Code Flash取代码执行,这意味着此时不须要刻意关闭系统全局中断,所以不影响系统响应的实时性。
至此,恩智浦i.MX RT1015/1020/1050三款MCU的FlexSPI NOR启动的链接方式痞子衡便介绍完毕了,掌声在哪里~~~
文章会同时发布到个人 博客园主页、CSDN主页、微信公众号 平台上。
微信搜索"痞子衡嵌入式"或者扫描下面二维码,就能够在手机上第一时间看了哦。