当前位置: 首页 > news >正文

痞子衡嵌入式:16MB以上NOR Flash地址模式切换会造成软复位后i.MXRT无法正常启动


大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是i.MXRT上使用16MB以上NOR Flash软复位无法正常启动问题的分析解决经验

五年前痞子衡写过一篇文章 《IS25WP256D的Bank Address Register[0]使用对RT1050软复位启动的影响》,这篇文章介绍了对大容量 Flash(>16MB) 的3字节地址命令下高/低地址空间(128Mb segment)切换特殊设计的利用需要注意,如果主芯片 App 程序中包含内核软复位设计,记得内核复位前先将 Flash 设置到初始状态。

最近有一个 RT1180 客户,启动 Flash 选用得是 IS25LP256H,App 程序里使用 Zephyr Flash 驱动时发现只要调用了 flash_flexspi_nor_4byte_enable() 函数后再做内核软复位,芯片就不能再次启动了,这其实还是大容量 Flash 地址模式搞的鬼。今天痞子衡就和大家聊聊这个问题:

一、大容量Flash地址模式设计

痞子衡列出了下面 6 个主流 Flash 厂商的代表大容量 QSPI NOR 型号,将其关于地址模式的信息整理在了一起,开头提及的文章里4.3 关于Flash的3/4字节地址小节说了,大容量 Flash 一般都支持 3/4B 地址两套命令,4B 地址命令只接受 4B 地址(不受地址模式影响),3B 地址命令则根据当前地址模式来决定到底跟 3/4B 地址。

Flash地址模式设计
进/出4B地址命令高低Segment配置位高低Segment寄存器写命令3/4B地址配置位3/4B地址寄存器写命令
IS25LP256H0xB7/0xE9Bank Address Register[0] - BA240x18/0xC5Bank Address Register[7] - EXTADD0x18/0xC5
W25Q256JV0xB7/0xE9Extended Address Register[0] - A240xC5Status Register-3[1:0] - ADP,ADS0x11
GD25Q256M0xB7/0xE9Extended Address Register[0] - A240xC5Status Register-2[13:12] - ADS,ADP0x31
MX25L25645G0xB7/0xE9Extended Address Register[0] - A240xC5Configuration Register[5] - 4BYTE0x01
S25FL256L0xB7/0xE9N/AN/AConfiguration Register 2 Volatile[1:0] - ADP,ADS0x71
MT25QL256A0xB7/0xE9Extended Address Register[0] - A24
16bit Configuration Register[0]
0xC5,0xB1N/AN/A

上表里我们可以看到所有厂商对于进入/退出 4B 地址模式的命令设计都是一样的(初始情况下 Flash 都是 3B 地址模式),关于高低 Segment 配置设计除了 Infineon 之外,其他厂商都支持并且设计上也兼容。最后就是 3/4B 地址模式切换除了有专用命令设计外,除 Micron 之外的其他厂商也提供直接写配置寄存器的方式,但是这里分为两派:一派是 Winbond、GigaDevice、Infineon,其写寄存器切换地址模式仅在 POR 或者 reset 时才会生效,而另一派 ISSI、MXIC 则写了相应配置寄存器后新地址模式直接生效。

二、Zephyr下flash_flexspi_nor_4byte_enable()

了解了大容量 Flash 的地址模式以及切换方法,我们再来看看 Zephyr 驱动里是怎么处理的,我们找到这个函数实现,其 en4b 参数区分了好几种不同处理,最主要的方式就是发 0xB7 专用命令切到 4B 地址模式。

/* by 01130.hk - online tools website : 01130.hk/zh/calcheat.html */ en4b & BIT(6) - Flash is always in 4 byte mode. We just need to configure LUT en4b & BIT(0) - Issue instruction 0xB7 en4b & BIT(1) - Issue write enable, then instruction 0xB7 en4b & BIT(4) - Set bit 0 of 16 bit configuration register via 0xB1 cmd Other methods not supported. Include: BIT(2): 8-bit volatile extended address register used to define A[31:24] bits. BIT(3): 8-bit volatile bank register used to define A[31:24] bits. BIT(5): Dedicated vendor instruction set.

从这个函数设计我们知道 Zephyr Flash 驱动使用了 3B 地址命令结合地址模式切换来支持所有容量 Flash 的全部空间访问,并没有启用 4B 地址命令(毕竟 4B 地址命令仅在大容量 Flash 上支持)。

三、RT系列对于Flash地址模式处理

我们知道 RT 系列芯片上电 ROM 默认是用 0x03 命令 + 3B 地址来获取 FCB 的,当第一次启动成功之后,如果 App 程序里将 Flash 切换到 4B 地址模式,然后做内核软复位重新启动,此时 ROM 再用 0x03 命令 + 3B 地址就不能再拿到正确的 FCB 了,这就是再次启动失败的原因。

3.1 RT10xx系列ROM设计

在 RT10xx 上 ROM 在 BT_CFG 的 FLASH_TYPE 里放了 3'b000 和 3'b001 两种配置,分别对应 Flash 是 3B/4B 地址模式两种情况,从而用 0x03 命令 +3/4B 地址来获取 FCB。这样的设计仅对 RT 芯片 POR 时有效,但如果是切换 Flash 地址模式后内核软复位的情况依然失效(因为 BT_CFG 不能动态更改)。

更进一步的理解是这种设计是针对 Flash 默认地址模式是 4B 的情况,但实际上几乎没有 Flash 默认地址模式是 4B,毕竟已经有一套专门 4B 地址命令在这了。

3.2 RT11xx/RT3digits系列ROM设计

为了改进 RT10xx 上 ROM 缺陷,在 RT11xx ROM 里 xSPI_FLASH_TYPE 干脆就拿掉了 3'b001 配置(注意这里仅仅是文档方面移除,代码里实际上支持还在),取而代之的是真正解决地址模式切换问题的手段,详见痞子衡旧文 《RT系列ROM中集成的NOR SW Reset功能》,简单来说就是假设 Flash 软复位后状态是 3B 地址模式,ROM 上电后先对 Flash 做一次软复位,再用 0x03 命令 +3B 地址来获取 FCB,这个设计逻辑看起来通顺了,唯一需要注意的是软复位能不能将 Flash 地址模式恢复到默认状态,这个需要检查具体 Flash 数据手册。

四、通用解决方案

上一节讲得都是依赖 ROM 来解决 Flash 地址模式切换问题,这其实还是没有把控全局的感觉,毕竟 Flash 地址模式是在 App 程序里切换的,那显然 App 程序在做内核软复位的时候自己主动将 Flash 地址模式再切回来不就完了吗!就像痞子衡旧文 《SW Reset退出NOR Continuous read模式》 里做法那样,App 程序里加上 Flash 复位命令相关代码(对本文来说也可以是退出 4B 地址模式命令相关代码),在需要的地方调用一下即可。

至此,i.MXRT上使用16MB以上NOR Flash软复位无法正常启动问题的分析解决经验痞子衡便介绍完毕了,掌声在哪里~~~

欢迎订阅

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

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

最后欢迎关注痞子衡个人微信公众号【痞子衡嵌入式】,一个专注嵌入式技术的公众号,跟着痞子衡一起玩转嵌入式。


衡杰(痞子衡),目前就职于恩智浦(NXP)半导体MCU系统应用部门,担任高级嵌入式系统应用工程师。

专栏内所有文章的转载请注明出处:http://www.cnblogs.com/henjay724/

与痞子衡进一步交流或咨询业务合作请发邮件至 hengjie1989@foxmail.com

可以关注痞子衡的Github主页 https://github.com/JayHeng,有很多好玩的嵌入式项目。

关于专栏文章有任何疑问请直接在博客下面留言,痞子衡会及时回复免费(划重点)答疑。

痞子衡邮箱已被私信挤爆,技术问题不推荐私信,坚持私信请先扫码付款(5元起步)再发。


http://www.cnnetsun.cn/news/167426.html

相关文章:

  • 爬山算法:无需微积分的机器学习之旅
  • 【Ctfer训练计划】——命令执行的解题技巧(持续更新中)
  • CTF wed安全(攻防世界)练习题
  • CTF进阶解题,掌握这套框架+技巧就够了!
  • Vue面试中,经常会被问到的面试题/Vue知识点整理,收藏这篇就够了
  • 复习2——线程(pthread)
  • 【DPFSP问题】基于matlab鳄鱼伏击算法CAOA求解分布式置换流水车间调度DPFSP【含Matlab源码 14744期】
  • 格雷厄姆特价股票策略在新能源行业的应用挑战
  • 毕业论文写不下去?百考通AI平台,一句话生成完整初稿,助你高效通关!
  • 【NWFSP问题】鳄鱼伏击算法CAOA求解零等待流水车间调度问题NWFSP【含Matlab源码 14745期】
  • 还在手动回复希音咨询?RPA+AI自动客服,效率提升30倍![特殊字符]
  • AI应用开发全景图:从LLM到Agent的硬核指南!这些大模型核心概念你必须懂
  • 揭秘Open-AutoGLM如何实现毫秒级快递轨迹更新:技术架构全解析
  • 换个角度看境外支付系统:警惕金融风险之安全测试实践
  • Home-Assistant智能家居平台搭建与远程控制
  • 盲盒小程序定制案例|轻松打造专属盲盒乐园
  • 【Open-AutoGLM快递轨迹追踪实战】:掌握AI驱动物流监控的5大核心技术
  • 【Open-AutoGLM酒店比价实战】:揭秘AI驱动的实时价格监控系统核心技术
  • requirements.txt配置踩坑实录,99%新手都会忽略的5个关键包
  • Open-AutoGLM部署效率提升10倍?你不可错过的Docker优化策略
  • 收藏!非技术党也能玩转大模型:10大行业落地指南+可复制提示词模板
  • Hugging Face下载Open-AutoGLM太慢怎么办?资深工程师推荐4种加速方案
  • 【专家级调优建议】:提升Open-AutoGLM ModelScope镜像运行效率的7种方法
  • 多进程相关函数
  • 持续集成中的测试策略:构建高效质量保障体系
  • 什么是持续集成CI,与DevOps关系
  • 结构类算法题
  • 为什么你的Open-AutoGLM部署总失败?Docker最佳实践全解析
  • Open-AutoGLM安装总失败?深度解析Python依赖树中的隐藏陷阱
  • 软件测试生命周期管理的核心框架与实践策略