0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

i.MXRTxxx里FLEXSPI_MCR0寄存器保留位会造成IP CMD读写异常?

痞子衡嵌入式 来源:痞子衡嵌入式 2024-03-11 10:28 次阅读

一、引出NAND访问问题

痞子衡最近需要在恩智浦无线系列 SoC(RW612)上调试串行 NAND Flash 驱动,简单理解这颗芯片其实就是 RT600 + 多模无线 SIP 到一起,但是其 MCU 部分对 RT600 做了精简以及魔改。因为痞子衡对 i.MX RT 特别熟,所以自然想到先在 RT500/600 上调通串行 NAND Flash,然后再做简单移植就大功告成了,没想到被这么个想法坑惨了。

痞子衡手里早就有成熟的 RT1050 系列串行 NAND Flash 驱动(并不是基于官方 SDK 底层驱动),单从 FlexSPI 外设角度来看,RT1xxx 和 RTxxx 差异不太大,基本是兼容的,所以痞子衡很快就将代码从 RT1050 移植到了 RT500 上,工程编译几乎是一把过,然而在 RT500 上实测时却连 NAND 的 JEDEC ID 都无法正常读取,IP CMD 获取到的值永远是 0x0。

由于串行 NAND Flash 驱动代码在 RT1050 上得到过验证,所以其本身不存在逻辑问题,大概率问题还是出在 FlexSPI 外设配置上,于是痞子衡经过 RT1050 vs RT500 各种单元对比测试(此处耗费时间较长),最终发现是由 FLEXSPI_MCR0[7:6] 的配置值不同引起的。

二、关于LEXSPI_MCR0寄存器保留位

在 RT500 参考手册(Rev.2)以及 RT600 参考手册(Rev1.5)里查看 FlexSPI 模块的 MCR0 寄存器描述,会发现 MCR0[7:6] 是保留位,且复位默认值为 1。

1. RT500 手册描述来看,这两个保留位可读不建议写,且读回值应该是 0
2. RT600 手册对这两个保留位描述是 both bits must be written with ones.
d9558714-dddf-11ee-a297-92fbcf53809c.png

作为对比我们再查看一下 RT 四位数系列(如 RT1050)上相关描述,这两个位并不是保留位,其具体功能是决定访问 IP TX/RX FIFO 数据的方式是 AHB bus 还是 IP bus。默认值 1 表明只能从 AHB bus 访问 IP TX/RX FIFO,这个初始值设置其实稍微有点不合理,毕竟 AHB bus 已经有专用的 AHB TX/RX Buffer 传输数据了。

d95e827e-dddf-11ee-a297-92fbcf53809c.png

三、FLEXSPI_MCR0寄存器保留位测试

在 RT500/600 上 FLEXSPI_MCR0[7:6] 是保留位,那这个保留位到底是什么意思?到底是没有这个 ATDFEN/ARDFEN 相应功能,还是单纯不对用户开放而已,这里就需要做一个实验来验证。

痞子衡在 RT500-EVK 上用连在 FlexSPI PortA 上的那颗四线 NOR 做测试,我们尝试用 IP CMD 发 Read JEDEC ID 命令读取 2byte 数据,在 FLEXSPI_MCR0[7:6] 为默认 2'b11 的情况下,可以看到 FLEXSPI_RFDRx 寄存器全是 0,这意味着 IP bus 根本就没有触发 IP RX FIFO 工作。

d96eb090-dddf-11ee-a297-92fbcf53809c.png

将 FLEXSPI_MCR0[7:6] 设为 2'b00 再测一次,这时可以看到 FLEXSPI_RFDRx 寄存器里开始有数据了,IP bus 触发 IP RX FIFO 干活了。

d9735dd4-dddf-11ee-a297-92fbcf53809c.png

现在我们知道了,RT500/600 上 FLEXSPI_MCR0[7:6] 虽然是保留位,但是其 ATDFEN/ARDFEN 功能仍然是存在的。

四、SDK驱动处理方法

在官方 SDK 2.14 的 fsl_flexspi 驱动 FLEXSPI_Init() 函数里对于 MCR0 寄存器采取得是忽略初值直接整体赋值的初始化方式,其关于 ATDFEN/ARDFEN 位操作根据特性宏来做条件编译。这样的处理导致 RT500/600 上 FLEXSPI_MCR0[7:6] 永远被重置为 2'b00。例程测试结果上来看似乎没有问题,但是这里存在一定不合理的地方。

1. 在 RTxxx 头文件 FlexSPI 模块寄存器定义里没有 ATDFEN/ARDFEN 位信息,但有如下特性宏定义
  #define FSL_FEATURE_FLEXSPI_HAS_NO_MCR0_ARDFEN (1)
  #define FSL_FEATURE_FLEXSPI_HAS_NO_MCR0_ATDFEN (1)
2. 在 RT1xxx 头文件 FlexSPI 模块寄存器定义里有 ATDFEN/ARDFEN 位信息,无上述特性宏定义
d9801236-dddf-11ee-a297-92fbcf53809c.png

五、经验与教训

回到文章开头,痞子衡推荐的 MCU 外设寄存器谨慎赋值法在这个案例里就完全失效了。我们知道 MCU 外设寄存器有保留位是业界常规做法,但是保留位到底是无功能还是功能不开放,这个要看具体情况。如果应用代码是基于官方 SDK 底层驱动,那么可能不会遇到问题。如果你需要重写底层驱动,想手撕寄存器,那就要特别小心了,关于寄存器保留位的处理是值得深思的。




审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • mcu
    mcu
    +关注

    关注

    146

    文章

    17458

    浏览量

    354428
  • 驱动器
    +关注

    关注

    54

    文章

    8372

    浏览量

    147672
  • 寄存器
    +关注

    关注

    31

    文章

    5390

    浏览量

    121889
  • SoC芯片
    +关注

    关注

    1

    文章

    620

    浏览量

    35201
  • Nand flash
    +关注

    关注

    7

    文章

    241

    浏览量

    40202

原文标题:是谁说MCU寄存器一定要谨慎赋值来着?

文章出处:【微信号:pzh_mcu,微信公众号:痞子衡嵌入式】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    芯片I2C通信异常无法读写寄存器破解

    时钟芯片PCF2129在批量生产过程中,有客户反馈出现PCF2129有0.2%左右芯片I2C通信异常,无法读写寄存器
    的头像 发表于 09-20 16:14 1.4w次阅读

    MCU外设寄存器谨慎赋值法

    今天给大家介绍的是改动i.MXRT1xxxIOMUXC_GPR寄存器保留可能
    的头像 发表于 12-12 09:14 857次阅读
    MCU外设<b class='flag-5'>寄存器</b>谨慎赋值法

    为什么改动i.MXRT1xxxIOMUXC_GPR寄存器保留造成系统异常

    为什么改动i.MXRT1xxxIOMUXC_GPR寄存器保留
    发表于 11-29 06:34

    i.MXRTxxx系列ROM中灵活的串行NOR Flash启动硬复位引脚选择

    今天痞子衡给大家介绍的是i.MXRTxxx系列ROM中灵活的串行NOR Flash启动硬复位引脚选择。  关于 i.MXRT 系列 BootROM 中串行 NOR Flash 启动流程,痞子衡写过一
    发表于 12-21 06:34

    32寄存器,32寄存器是什么意思

    32寄存器,32寄存器是什么意思  从X8086开始学了一年,第一个ASM的程序就是变32换16进制的程序,不过现在叫我从新开始写ASM程
    发表于 03-08 17:26 1.8w次阅读

    MIPS寄存器详解

    保留,由于I型指令的立即数字段只有16,在加载大常数时,编译或汇编程序需要把大常数拆开,然后重新组合到寄存器
    发表于 04-27 10:34 6283次阅读
    MIPS<b class='flag-5'>寄存器</b>详解

    51单片机的寄存器组应该如何设置

    大家都知道51单片机有的寄存器R0-R7共有四组。最近1年来,我在与新手朋友交流时发现,很多朋友对寄存器组的使用时经常出现问题。虽然这并不是多难的问题,但如果出现错误,也
    发表于 09-11 17:24 0次下载
    51单片机的<b class='flag-5'>寄存器</b>组应该如何设置

    【学习笔记】51单片机常用寄存器

    为98H,地址为98H~9FH。SCON控制寄存器结构SCON寄存器各位定义(1)方式0( SM0 SM1 :
    发表于 11-14 16:21 9次下载
    【学习笔记】51单片机常用<b class='flag-5'>寄存器</b>

    C语言操作在(单片机)寄存器中的应用

    C语言操作在寄存器中的应用本文参考另一篇博客写成附链接,个人感觉内容过多不便于吸收,就写了这篇博客。整体思想:设置一个就是设置该位为1,清除就是设置该位为0
    发表于 11-29 10:06 8次下载
    C语言<b class='flag-5'>位</b>操作在(单片机)<b class='flag-5'>寄存器</b>中的应用

    痞子衡嵌入式:改动i.MXRT1xxxIOMUXC_GPR寄存器保留可能造成系统异常

      大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是改动i.MXRT1xxxIOMUXC_GPR寄存器保留可能
    发表于 12-04 17:36 8次下载
    痞子衡嵌入式:改动<b class='flag-5'>i</b>.MXRT1xxx<b class='flag-5'>里</b>IOMUXC_GPR<b class='flag-5'>寄存器</b><b class='flag-5'>保留</b><b class='flag-5'>位</b>可能<b class='flag-5'>会</b><b class='flag-5'>造成</b>系统<b class='flag-5'>异常</b>

    GPIO寄存器

    ,一般高16保留BSRR寄存器32分为低16BSRRL和高16BSRRH,BSRRL配置
    发表于 12-08 17:06 5次下载
    GPIO<b class='flag-5'>寄存器</b>

    CS,IP和PC寄存器

    CS寄存器IP寄存器:首先强调一下,这两个寄存器非常非常重要,CS的全拼为“Code segment”,即代码段寄存器,对应于内存中的存放
    发表于 12-17 18:31 2次下载
    CS,<b class='flag-5'>IP</b>和PC<b class='flag-5'>寄存器</b>

    16和32寄存器的区别 16寄存器有哪些

    16寄存器可以存储2个字节(16)的数据,数据范围为0~65535。在单片机中,16寄存器
    发表于 03-31 18:14 1.7w次阅读

    一文了解i.MXRTxxx系列片内SRAM分区电源控制

    大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是从功耗测试角度了解i.MXRTxxx系列片内SRAM分区电源控制。
    的头像 发表于 07-07 09:58 1248次阅读
    一文了解<b class='flag-5'>i.MXRTxxx</b>系列片内SRAM分区电源控制

    IP2368寄存器说明文档

    转换芯片,转到 3.3V; IP2368 INT 应用说明:IP2368 休眠时检测到 INT 为高就会唤醒,唤醒之后,IP2368 主动拉高 INT,100ms之后,MCU 可进行 I
    发表于 12-04 14:30 17次下载