痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU启动那些事(11.1)- 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连接方式是可以用作启动的。
一、涉及FlexSPI引脚
提及启动,就不得不提i.MXRT芯片内部BootROM,BootROM是固化在芯片内部ROM空间的一段代码,芯片上电永远是BootROM先运行,由BootROM从外部存储器去加载应用程序执行。因此FlexSPI NOR连接方式其实是由BootROM决定的,更直白点说,其实FlexSPI NOR连接方式是写死在BootROM代码里。
我们可以在芯片参考手册System Boot这一章节找到BootROM指定的FlexSPI NOR引脚,痞子衡整理如下:
下表适用于i.MXRT105x:
下表适用于i.MXRT102x和i.MXRT1015:
上面的表格基本上已经给我们指明了方向,目前我们知道了哪些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和其他三根片选,那些信号线后续是否可以利用?
在下面文章的内容里,痞子衡会逐一为大家解析这些疑问:
二、单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信号。

第三种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的走线长度在芯片内部不一样。总之不推荐这么用。
解答4:FlexSPI Reset信号是与1st、2nd Option无关的,所以两个Option下均可以用,不过Reset信号常用于八线Flash。
三、双Flash连接方式(14种)
很多实际系统设计中,常常有既在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里一共8个片选,按排列组合来说应该有 C(8,2) = 28种组合方式,但要考虑如下异常:
异常1:1st A_SS0-2nd A_SS0、1st A_SS1-2nd A_SS1、1st B_SS0-2nd B_SS0、1st B_SS1-2nd B_SS1互联这4种情况需排除
异常2:1st A_SS0-2nd A_SS1、1st A_SS1-2nd A_SS0、1st B_SS0-2nd B_SS1、1st B_SS1-2nd B_SS0连接这四种情况,DATA线有两种选择,所以要增加4种组合
考虑进上述异常情况后,还是存在28种连接组合,那么这28种组合是不是都可行呢?当然不是!要在这28种组合中剔除掉不包含1st A_SS0或者2nd A_SS0的组合。即下图中标浅绿色的Flash A0在双Flash组合中是一定要存在的,因为BootROM上电永远是从Flash A0中获取FDCB以及启动代码头(IVT, BootData),所以Flash A0就是Code Flash。
分析到了这里,我们就知道如下符合条件的14种包含Flash A0的组合方式,其中标记Code的片选信号应该连接存放应用程序代码的Code Flash,标记Data的片选信号则连接存放用户数据的Data Flash:
Note:有一个地方要注意,如果两个Flash挂在同一类型PORT上(都是PORTA或都是PORTB),即下面的第1、4、5、8、9、12种组合时,这两片Flash最好是同一个型号,这样电气特性容易保持一致。
| Num | FlexSPI 1st Option | FlexSPI 2nd Option | Comments | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| A_SS0 | A_SS1 | A_DATA[3:0] A_SCLK |
B_SS0 | B_SS1 | B_DATA[3:0] B_SCLK |
A_SS0 | A_SS1 | A_DATA[3:0] A_SCLK |
B_SS0 | B_SS1 | B_DATA[3:0] B_SCLK |
||
| 1 | ✔ Code |
✔ Data |
✔ | BootROM直接支持 Data Flash的配置 |
|||||||||
| 2 | ✔ Code |
✔ | ✔ Data |
✔ | |||||||||
| 3 | ✔ Code |
✔ | ✔ Data |
✔ | |||||||||
| 4 | ✔ Data |
✔ Code |
✔ | ||||||||||
| 5 | ✔ Data |
✔ | ✔ Code |
✔ | |||||||||
| 6 | ✔ Data |
✔ | ✔ Code |
✔ | |||||||||
| 7 | ✔ Data |
✔ | ✔ Code |
✔ | |||||||||
| 8 | ✔ Code |
✔ | ✔ Data |
仅适用RT1050 用户实现Data Flash配置 |
|||||||||
| 9 | ✔ Code |
✔ | ✔ Data |
✔ | |||||||||
| 10 | ✔ Code |
✔ | ✔ Data |
✔ | |||||||||
| 11 | ✔ Code |
✔ | ✔ Data |
✔ | |||||||||
| 12 | ✔ Code |
✔ Data |
✔ | ||||||||||
| 13 | ✔ Code |
✔ | ✔ Data |
✔ | |||||||||
| 14 | ✔ Code |
✔ | ✔ Data |
✔ | |||||||||
介绍完14种双Flash连接方案,现在来解答一些前面列出的疑问。
解答5:可以挂两片QSPI Flash启动,一共有14种连接方式。两片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是互斥的。
下图是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:应用程序代码里的FlexSPI驱动直接使用BootROM API(代码是在ROM空间运行的)。
这三种方法里首推方法3,既能实现需求,又能省Code Flash空间(FlexSPI驱动代码说小不小)。方法1其实是不推荐的,毕竟Cache是种玄学,岂是你想控制就控制的。
最后再说一下,挂一片RWW Flash或者两片Flash到底相比挂一片非RWW Flash有什么好处?其实痞子衡前面已经讲过了,虽然不能实现原地执行擦写代码,但是在擦写等待期间,CPU可以继续从Code Flash取代码执行,这样不影响系统响应的实时性。
至此,恩智浦i.MX RT1015/1020/1050三款MCU的FlexSPI NOR启动的连接方式痞子衡便介绍完毕了,掌声在哪里~~~
痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU启动那些事(11.1)- FlexSPI NOR连接方式大全(RT1015/1020/1050)的更多相关文章
- 痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU启动那些事(13.A)- LPSPI NOR启动时间(RT1170)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MX RT1170 1bit SPI NOR恢复启动时间. 本篇是i.MXRT1170启动时间评测第三弹了,前两篇分别给大家评 ...
- 痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU启动那些事(11.3)- FlexSPI NOR连接方式大全(RT1010)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MX RT1010的FlexSPI NOR启动的连接方式. 在写完 <FlexSPI NOR启动连接方式(RT1015/ ...
- 痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU启动那些事(11.0)- FlexSPI NOR启动时间(RT1170)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MX RT1170 FlexSPI NOR启动时间. 痞子衡刚刚拿到i.MXRT1170 B0版本的芯片,迫不及待地在上面跑了 ...
- 痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU启动那些事(11.2)- FlexSPI NOR连接方式大全(RT1060/1064(SIP))
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MX RT1060/1064(SIP)两款MCU的FlexSPI NOR启动的连接方式. 上一篇文章<FlexSPI N ...
- 痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU启动那些事(11.B)- FlexSPI NOR连接方式大全(RT1160/1170)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MXRT1160/1170两款MCU的FlexSPI NOR启动的连接方式. 这个 i.MXRT FlexSPI NOR 启动 ...
- 痞子衡嵌入式:飞思卡尔Kinetis系列MCU启动那些事(1)- KBOOT架构
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔Kinetis系列MCU的KBOOT架构. Bootloader是嵌入式MCU开发里很常见的一种专用的应用程序,在一个没有Boo ...
- 痞子衡嵌入式:飞思卡尔Kinetis系列MCU启动那些事(9)- KBOOT特性(IntegrityCheck)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔Kinetis系列MCU的KBOOT之完整性检测(Integrity Check)特性. Application完整性检测是非常 ...
- 痞子衡嵌入式:飞思卡尔Kinetis系列MCU启动那些事(2)- KBOOT形态(ROM/Bootloader/Flashloader)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔Kinetis系列MCU的KBOOT形态. 痞子衡在前一篇文章里简介了 KBOOT架构,我们知道KBOOT是一个完善的Bootl ...
- 痞子衡嵌入式:飞思卡尔Kinetis系列MCU启动那些事(3)- KBOOT配置(FOPT/BOOT Pin/BCA)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔Kinetis系列MCU的KBOOT配置. KBOOT是支持配置功能的,配置功能可分为两方面:一.芯片系统的启动配置:二.KBO ...
随机推荐
- Redis Sentinel 高可用机制
内容目录: Sentinel 如何工作的? 核心配置项 怎么选出新 master 的? Sentinel 有多个,具体谁来执行故障转移? Sentinel 是怎么发现 slave 和其他 sentin ...
- (分块暴力)Time to Raid Cowavans CodeForces - 103D
题意 给你一段长度为n(1 ≤ n ≤ 3·1e5)的序列,m (1 ≤ p ≤ 3·1e5)个询问,每次询问a,a+b,a+2b+...<=n的和 思路 一开始一直想也想不到怎么分,去维护哪些 ...
- 美食家App开发日记5
今天将ListView控件用更强大的Recyclerview控件取代,最后调试了程序. 感觉Android编程难度实在是远远高于javaweb,初次接触,感觉有很多东西想实现,想得很容易,但是实现起来 ...
- RabbitMQ入门(三)订阅模式
在之前的文章RabbitMQ入门(二)工作队列中,我们创建了一个工作队列.工作队列背后的假设是每一项任务都被准确地传送至一个worker.在本文中,我们将会做一些不同的事情--我们将会把一个消息发 ...
- 部署Maven项目到tomcat报错:java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderLi
Maven项目下update maven后Eclipse报错:java.lang.ClassNotFoundException: ContextLoaderL 严重: Error config ...
- 使用Route Prefix 使用属性路由 精通ASP-NET-MVC-5-弗瑞曼
- robotframework,移动端(小程序)自动化,获取元素属性值的方法
如下图,获取商品价格 属性值显示在content-desc内 传统的get text指定是无法获得到这个元素指定属性的值的 只有通过使用AppiumLibrary.get element attrib ...
- AttributeError: module 'cv2' has no attribute 'SIFT'解决总结
AttributeError: module 'cv2' has no attribute 'SIFT' 遇到该问题时,网友多是建议补个包,即pip install opencv-contrib-py ...
- devops与CICD
前言 devops的概念已经在前一章已经说过了,下面介绍CICD的概念. CI(Continuous Integration,持续集成) 持续集成中,开发人员将会频繁地向主干提交代码,这些新提交的代码 ...
- 自定义HttpMessageConverter实现RestTemplate的exchange方法返回自定义格式数据
一 概述 实现如下效果代码,且可正常获取到返回数据: ResponseEntity<JsonObject> resEntity = restTemplate .exchange(url, ...