大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是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. Java基础周测题,输入一个整数,输出所有能整除该整数的结果:

    需求说明: 输入一个整数,输出所有能整除该整数的结果: 实现代码: package demo; import java.util.Scanner; public class test1 { publi ...

  2. 探索 dotnet core 为何在 Windows7 系统需要补丁的原因

    在一些 Windows 7 系统上,根据 dotnet 官方文档,需要安装上 KB2533623 补丁,才能运行 dotnet core 或 .NET 5 等应用.尽管非所有的设备都需要安装此,但这也 ...

  3. [数据结构]FHQ-Treap

    前言(个人评价FHQ-Treap) 这是一个巨佬(名叫范浩强)在冬令营交流的时候提出的数据结构(FHQ:\(\text{你干嘛非要旋转呢?Think Functional!}\))(可以看出FHQ大佬 ...

  4. 初识python: 自定义函数

    什么是函数? 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段.函数能提高应用的模块性,和代码的重复利用率. 函数的定义方法: def test(x): '函数定义方法' x+=1 r ...

  5. python 设计模式:单例模型

    一.单例模型简介 代码的设计模式共有25种,不同的应用场景应用不同的设计模式,从而达到简化代码.利于扩展.提高性能等目的.本文简述Python实现的单例模式场景.简而言之,单例模式的应用场景是一个类对 ...

  6. django中使用支付宝

    一.注册 https://auth.alipay.com/login/ant_sso_index.htm?goto=https%3A%2F%2Fopenhome.alipay.com%2Fplatfo ...

  7. frp + nginx 配置多人共用的http 内网穿透服务

    来源:简书   https://www.jianshu.com/p/c9d7527d607b 一. 前言 frp 是一个用Go语言开发的,可用于内网穿透的高性能的反向代理应用,支持 tcp, udp ...

  8. 查询 Oralce 某 schema 所拥有的权限

    --https://dba.stackexchange.com/questions/14901/oracle-list-users-with-access-to-certain-tables sele ...

  9. Go语言系列之标准库fmt

    fmt包实现了类似C语言printf和scanf的格式化I/O.主要分为向外输出内容和获取输入内容两大部分. 向外输出 标准库fmt提供了以下几种输出相关函数. Print Print系列函数会将内容 ...

  10. springboot启动过程中常用的回调

    1.介绍 springboot提供非常丰富回调接口,利用这些接口可以做非常多的事情,对于一些常用的回调接口进行介绍 2.常用的拓展接口 1.ApplicationContextInitializer ...