大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是OPI DTR模式下反转字节序的Octal Flash在i.MXRT下载与启动注意事项

  在恩智浦官方参考设计板 MIMXRT595-EVK 和 MIMXRT685-EVK 上搭载了一颗来自 MXIC 的 MX25UM51345G,这是一款比较典型的 Octal Flash,在 i.MXRT 下去下载和启动这款 Flash 并没有什么特别的地方,官方 SDK 及工具链里做了完善支持。

  近期有客户做板卡设计时选到了一颗同样来自 MXIC 的 Octal Flash - MX25UM51245G,主丝印号与 MX25UM51345G 仅一个数字之差,根据数据手册对比,两者在功能上似乎并没有太多区别,然而客户在启动这颗 Flash 时却遇到了麻烦,这是怎么回事?今天痞子衡来一探究竟:

  • Note:本文内容虽以 i.MXRT 三位数系列为例来展开,但同样也适用 i.MXRT 四位数系列。

一、一般Octal Flash读写字节序设计

  我们先来看典型的 MX25UM51345G 上读写时序设计,这对下载启动至关重要。大家都知道 Octal Flash 时序主要分为 SPI 和 OPI 两大类,其区别是命令/地址/数据位是仅通过 SIO[1:0] 还是通过全部 SIO[7:0] 来传输。

  如下是 SPI 模式下的 Read 和 Page Program 时序,命令和地址位均通过 SIO[0] 来传输,数据位通过 SIO[1](Read) 或者 SIO[0](Program) 来传输,这里特别关注一下数据位的字节序,读写都是按照 Data Byte 1、Data Byte 2、Data Byte 3... 正序传输的。

  再来看 OPI 模式下的 Read 和 Page Program 时序(包含 STR 和 DTR 模式),命令/地址/数据位全部通过 SIO[7:0] 来传输,咱们也同样关注一下数据位的字节序,读写依然是按照 D0、D1、D2、D3... 正序传输的。

二、以MX25UM51245为代表的特殊读写字节序设计

  现在我们再来看 MX25UM51245G 上特殊读写时序设计,其在 SPI 模式、OPI-STR 模式下时序与 MX25UM51345G 并无差异(数据位都是正序传输),主要差异在如下 OPI-DTR 模式下时序,我们可以看到 OPI-DTR 读写时数据位上字节序是 D1、D0、D3、D2... 这样的反转序,这种特殊字节序设计在 Flash 数据手册上并没有以文字形式特别提醒,仅能从时序图上观察出来,估计是 Flash 厂商认为读写字节序是成套反转的,因此用户无需关心这种差异(即不需要软件代码层面去刻意做数据反转,反反得正嘛)。

三、i.MXRT启动MX25UM51245注意事项

  从 i.MXRT 启动角度而言,对于 Octal Flash 我们既可以配置 FlexSPI 外设以 SPI Read 模式去访问也可以配置 OPI Read 模式去访问,不过从最高性能角度而言,通常我们会配置 OPI-DTR Read 模式去启动 Octal Flash。随便打开一个 MIMXRT595 SDK 里示例工程,在 flash_config.c 文件里你可以看到读命令设置的就是 0xEE(8DTRD)。

  具体 FlexSPI 配置是通过存放在 Flash 固定偏移处的 FDCB 结构(就是上图代码中的 flash_config )来实现的,BootROM上电会以固定 30MHz SPI Read 模式先从 Flash 里取出 FDCB,然后解析 FDCB 得到用户指定配置再做二次 FlexSPI 配置去启动用户程序(详见痞子衡旧文 《深入i.MXRT1050系列ROM中串行NOR Flash启动初始化流程》)。

  读到这里,你有没有发现什么问题?Octal Flash 里的 FDCB 和用户应用程序数据是在 BootROM 配置的不同读时序模式下被访问的,前者是通过 SPI Read,后者是通过 OPI-DTR Read,这样在 MX25UM51245 下就可能会存在字节序不统一的问题。如何解决这个问题?有三种方案:

方案 1:
- 负责下载功能的 Flashloader 仅配置 Flash 为 SPI 或 OPI-STR 模式,并且在下载时对 FDCB 和用户应用程序数据不做任何字节序反转;
- 负责启动功能的 BootROM 也同样配置 Flash 为 SPI 或 OPI-STR 模式去启动用户应用程序(在用户 FDCB 里设置)。 方案 2:
- 负责下载功能的 Flashloader 仅配置 Flash 为 SPI 或 OPI-STR 模式,并且在下载时对 FDCB 不做任何反转,但是需要对用户应用程序数据做字节序反转;
- 负责启动功能的 BootROM 需要配置 Flash 为 OPI-DTR 模式去启动用户应用程序(在用户 FDCB 里设置)。 方案 3:
- 负责下载功能的 Flashloader 配置 Flash 为 OPI-DTR 模式,并且在下载时对 FDCB 做字节序反转,但是对用户应用程序数据不做任何反转;
- 负责启动功能的 BootROM 需要配置 Flash 为 OPI-DTR 模式去启动用户应用程序(在用户 FDCB 里设置)。

四、i.MXRT启动MX25UM51245实现方案

  上一节列举了三个解决方案,其中方案 1 没什么好说的,不涉及字节序统一性问题。使用 MCUBootUtility 工具做应用程序下载时,不要选择具体 Flash 型号的模型,而使用 1bit SDR 模式的 FDCB 去连接配置(详见 《MCUBootUtility v2.3发布,这次不再放过任何一款Flash》 一文的 2.3 小节)。

  而如果期望 BootROM 配置 Flash 以 OPI-DTR 模式去启动,则需要在方案 2 和 3 里面选一个,从实现效率角度,显然方案 3 比方案 2 更胜一筹,毕竟用户程序往往比 FDCB 数据量大得多,对其做字节序反转耗时更长, i.MXRT 默认下载支持里就是选用了方案 3。MCUBootUtility 工具里的 Flash 模型支持 MX25UM51245 这种型号,其是通过 Misc Mode 里的 "Data Order Swapped" 选项来进行区分的。

  对于 i.MXRT500/600,其 Flashloader 功能直接集成进了 BootROM 里,我们看不到关于字节序反转的实现源码;但是 i.MXRT 四位数系列 BootROM 并无下载功能,其是通过加载二级 Flashloader 来实现下载的,其源码开源在 \SDK\boards\evkmimxrt1xxx\bootloader_examples\flashloader 里,在这个 Flashloader 源码里我们能找到关于字节序反转的设计。

  至此,OPI DTR模式下反转字节序的Octal Flash在i.MXRT下载与启动注意事项痞子衡便介绍完毕了,掌声在哪里~~~

欢迎订阅

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

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

痞子衡嵌入式:i.MXRT连接特殊Octal Flash时(OPI DTR模式下反转字节序)下载与启动注意事项(以MX25UM51245为例)的更多相关文章

  1. 痞子衡嵌入式:导致串行NOR Flash在i.MXRT下无法正常下载/启动的常见因素之SFDP

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是导致串行NOR Flash在i.MXRT下无法正常下载/启动的常见因素之SFDP. i.MXRT系列MCU发布已两年多了,基于i.MXR ...

  2. 痞子衡嵌入式:同一厂商不同系列Flash型号下Dummy Cycle设置方法可能有差异 (以IS25LP064为例)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是同一厂商不同系列Flash型号下Dummy Cycle设置方法的差异. 上一篇文章 <在i.MXRT启动头FDCB里调整Flash ...

  3. 痞子衡嵌入式:系统时钟配置不当会导致i.MXRT1xxx系列下OTFAD加密启动失败

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是系统时钟配置不当会导致i.MXRT1xxx系列下OTFAD加密启动失败问题. 我们知道,i.MXRT1xxx家族早期型号(RT1050/ ...

  4. 痞子衡嵌入式:在i.MXRT启动头FDCB里使能串行NOR Flash的QPI/OPI模式

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是在FDCB里使能串行NOR Flash的QPI/OPI模式. 我们知道 Flash 读时序里有五大子序列 CMD + ADDR + MO ...

  5. 痞子衡嵌入式:串行NOR Flash的Continuous read模式下软复位后i.MXRT无法启动问题解决方案之RESET#

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT上使能NOR Flash的Continuous read模式在软复位后无法正常启动问题的解决经验. 前一篇文章 <在i ...

  6. 痞子衡嵌入式:i.MXRT中不支持DQS的FlexSPI引脚组连接Flash下载与启动注意事项

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是i.MXRT中不支持DQS的FlexSPI引脚组连接Flash下载与启动注意事项. 最近痞子衡在支持一个印度客户,这个客户项目主芯片选择 ...

  7. 痞子衡嵌入式:链接函数到8字节对齐地址或可进一步提升i.MXRT内核执行性能

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是i.MXRT上进一步提升代码执行性能的经验. 今天跟大家聊的这个话题还是跟痞子衡最近这段时间参与的一个基于i.MXRT1170的大项目有 ...

  8. 痞子衡嵌入式:恩智浦i.MX RTxxx系列MCU启动那些事(6.B)- FlexSPI NOR连接方式大全(RT500)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MX RT500的FlexSPI NOR启动的连接方式. 这个i.MXRT FlexSPI NOR启动连接方式系列文章,痞子衡 ...

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

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MXRT1160/1170两款MCU的FlexSPI NOR启动的连接方式. 这个 i.MXRT FlexSPI NOR 启动 ...

随机推荐

  1. HDU ACM 8.13 T2 的 O(m)做法

    前言 由于本人比较拉所以看起来很啰嗦,将就看就好. 题目大意 \(n\)种包,每个包里面有一大一小两个球,选小球的代价是\(1\),大球的代价是\(2\),可以都不选,若一次性买两个包,则可以优惠\( ...

  2. git -remote: Support for password authentication was removed on August 13, 2021

    克隆代码时,报错: Support for password authentication was removed on August 13, 2021. Please use a personal ...

  3. CentOS7端口被占用的解决办法

    1.根据端口号得到其占用的进程的详细信息 netstat -tlnp|grep 80tcp        0      0 192.168.33.10:80            0.0.0.0:*  ...

  4. centos7 安装zabbix3.0 安装zabbix4.0 yum安装zabbix 国内源安装zabbix 阿里云服务器安装zabbix

    首先,此篇文章是有原因的. 刚开始也和大家一样来学习安装zabbix 奈何网上的教程和现实出现不一样的情况 在安装zabbix过程中,因为zabbix下载源是在国外,下载途中会出现终止下载的情况 tr ...

  5. 论文解读DEC《Unsupervised Deep Embedding for Clustering Analysis》

    Junyuan Xie, Ross B. Girshick, Ali Farhadi2015, ICML1243 Citations, 45 ReferencesCode:DownloadPaper: ...

  6. elementui-日期选择器时间清空报错踩坑

    今天在项目中遇到了这个大坑 具体问题:在日期清空时会报错 解决方法:给日期绑定的值添加监听

  7. 简单Spring MVC项目搭建

    1.新建Project 开发环境我使用的是IDEA,其实使用什么都是大同小异的,关键是自己用的顺手. 首先,左上角File→New→Project.在Project页面选择Maven,然后勾上图中所示 ...

  8. 一文搞清楚 DNS 的来龙去脉

    目录 美国霸权 ICANN:互联网界的联合国 IP 地址分配 域名解析架构 分层架构: DNS 缓存: 根 DNS 服务器: 顶级 DNS 服务器(TLD): 权威 DNS 服务器: 本地 DNS: ...

  9. ES6随笔D1

    1.数值解构赋值 ES6 允许按照一定模式,可以从数组中提取值,按照对应位置,对变量赋值,这被称为解构. 解构赋值的规则是,只要等号右边的值不是对象或数组,就先将其转为对象.由于undefined和n ...

  10. jsp标签 formatNumber、formatDate、parseNumber、parseDate的使用

    引用本文的有关标签需要引用对应的标签库 <%--引入格式化动作标签库--%> <%@taglib prefix="fmt" uri="http://ja ...