大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家讲的是一个关于Segger J-Flash在Micron Flash固定区域下载校验失败的故事

  痞子衡最近在支持一个 i.MXRT1170 欧美客户,客户项目里选用了来自 Micron 的四线 NOR Flash - MT25QL256ABA8E12-0AAT 作为启动设备,一般读写倒是没有问题,但是在 Segger J-Flash 下烧写遇到了特定区域内校验失败的问题。

  从痞子衡过往丰富的 Flash 支持经验来看,亚太区客户一般选用 ISSI(芯成)/Winbond(华邦)/MXIC(旺宏)/GigaDevices(兆易创新) 的 Flash 比较多,痞子衡对这些厂商 Flash 可以说是门清了。这个欧美客户选用的是痞子衡不太熟的 Micron(镁光) 产品,借着这个问题,痞子衡带大家一起稍微深入地了解下 Micron Flash 产品:

一、引出客户问题

  首先是复现下客户的问题,痞子衡找了块 MIMXRT1170-EVK 开发板,将板载其他厂商 Flash 换成这颗 MT25QL256ABA8E12-0AAT(因为是 T-PBGA24 封装,所以需要放到原来的 OctalFlash 位置 - U21),然后将 \SDK_2.11.1_MIMXRT1170-EVK\boards\evkmimxrt1170\driver_examples\flexspi\nor\polling_transfer 例程稍作适配性修改,主要是将 customLUT 里的命令表按 Micron 数据手册命令表做调整(全用了四字节地址命令),然后跑了一下例程发现基本的 Flash 读写擦操作没有问题(默认操作的是 0x14000 处的 Sector),这表明硬件修改没有问题。

const uint32_t customLUT[CUSTOM_LUT_LENGTH] = {
/* Fast read quad mode - SDR */
[4 * NOR_CMD_LUT_SEQ_IDX_READ_FAST_QUAD] =
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0xEC, kFLEXSPI_Command_RADDR_SDR, kFLEXSPI_4PAD, 0x20),
[4 * NOR_CMD_LUT_SEQ_IDX_READ_FAST_QUAD + 1] =
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DUMMY_SDR, kFLEXSPI_4PAD, 0x0a, kFLEXSPI_Command_READ_SDR, kFLEXSPI_4PAD, 0x04), /* Erase Sector */
[4 * NOR_CMD_LUT_SEQ_IDX_ERASESECTOR] =
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0xDC, kFLEXSPI_Command_RADDR_SDR, kFLEXSPI_1PAD, 0x20), /* Page Program - quad mode */
[4 * NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM_QUAD] =
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x34, kFLEXSPI_Command_RADDR_SDR, kFLEXSPI_1PAD, 0x20),
[4 * NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM_QUAD + 1] =
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_WRITE_SDR, kFLEXSPI_4PAD, 0x04, kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0x00),
};

  接下来就是按客户操作流程来复现 Segger J-Flash 烧写校验失败问题,客户其实是尝试烧写全部 32MB 数据来查看 J-Flash 及其配套下载算法能否适用这颗 Flash,这里痞子衡就用 《超级下载算法RT-UFL v1.0》,经过测试,确实复现了客户的问题。经过反复测试,定位了问题是这颗 Micron 32MB 的 Flash 前 3/4 区域(0x0 - 0x17FFFFF)是没问题的,但是在后 1/4 区域(0x1800000 - 1FFFFFF)均会出现校验错误(J-Flash软件里看擦写操作是能进行的,但后面发现其实根本没有正常擦写)。

二、Micron QuadSPI NOR Flash有什么不同?

  在分析客户问题之前,我们先来简单认识一下这颗 Micron NOR Flash,痞子衡浏览了 Micron 的官网以及这颗 Flash 的数据手册,发现它确实跟其他厂商的 NOR Flash 设计有点区别。

  首先是 Flash 容量,其他厂商一般都是能够提供从 512Kb 到 2Gb 全范围的 Flash 产品,但是 Micron 串行 NOR Flash 最小容量就是 128Mb,果然是国际 Memory 大厂,设计就是豪横。但是从 Flash 作为 XIP 启动设备角度而言,128Mb 其实挺多的,普通的嵌入式项目没有这么大的代码存储需求。

  其次是 NOR Flash 里的高频问题 《QE bit 设计》,一般 Flash 的 IO2/3 引脚复用功能都是通过内部状态寄存器里的 QE 位来控制,QE 关闭则 IO2/3 是 RESET#/HOLD#/WP# 功能:如果 QE 开启则 IO2/3 用于数据传输(这种情况下才可以用 Quad I/O 相关命令)。然而 Micron Flash 根本就没有 QE 位控制,IO2/3 功能主要靠当前命令类型来决定:如果是 Single SPI 或者 Dual I/O SPI 命令,则 IO2/3 是 RESET#/HOLD#/WP# 功能;如果是 Quad I/O SPI 命令,则 IO2/3 用于传输数据。

  其它设计上的区别就不再详细展开了,等用到具体功能查看数据手册再去了解对比。

三、找到问题原因

  现在来分析客户问题,Flash 后 1/4 区域在 J-Flash 下校验错误,那我们先修改 polling_transfer 例程去操作 0x1800000 之后的 Sector,发现确实跑不过。如果不是 Flash 介质问题,也不是读写擦命令问题,那只能有一种解释,那就是 Flash 里这个区域被保护了,Flash 里是有非易失寄存器可以设置软件保护的,但是默认应该是全部区域不保护,而第一小节里我们先跑了 polling_transfer 例程验证 Flash 读写,那大概率这个例程里有修改 Flash 内部寄存器操作,经过排查痞子衡定位到了 flexspi_nor_enable_quad_mode() 函数。

#define FLASH_QUAD_ENABLE            0x40U

const uint32_t customLUT[CUSTOM_LUT_LENGTH] = {
/* Enable Quad mode */
[4 * NOR_CMD_LUT_SEQ_IDX_WRITESTATUSREG] =
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x01, kFLEXSPI_Command_WRITE_SDR, kFLEXSPI_1PAD, 0x04),
}; int main(void)
{
// 代码省略 /* Enter quad mode. */
status = flexspi_nor_enable_quad_mode(EXAMPLE_FLEXSPI);
if (status != kStatus_Success)
{
return status;
} // 代码省略
}

  第二小节介绍里我们知道 Micron Flash 是没有 QE 位设计的,因此 flexspi_nor_enable_quad_mode() 函数在这里是多余的,这个函数是将 0x40 写入到了命令标号为 0x01 的 Status Register(这个操作适用于 ISSI Flash),我们在数据手册里找到这个寄存器定义,发现被置位的 bit 6 是块保护控制位 BP[3:0] 里的最高位,并且 BP[3:0] 设置是非易失性的(断电不丢失)。

  再进一步往下找 BP[3:0] 设置与 Flash 空间对应关系,发现 4'b1000 设置就是保护后 1/4 区域里的所有 block,至今似乎真相大白了。为了验证发现,我们需要将 Status Register 重设为 0x00,然后再用 J-Flash 烧写一次,这时候校验失败问题消失了,一切恢复正常。

  回顾这个故事,如果痞子衡事先不用 polling_transfer 例程去操作一次 Flash,或者即使跑了例程但事先意识到了 Micron Flash 没有 QE 设计而删除 flexspi_nor_enable_quad_mode() 函数,也就无法复现客户问题了,这也是本次故事里最神奇的地方,客户和痞子衡犯了同样的失误,也许这就是缘分?

  至此,一个关于Segger J-Flash在Micron Flash固定区域下载校验失败的故事痞子衡便介绍完毕了,掌声在哪里~~~

欢迎订阅

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

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

痞子衡嵌入式:一个关于Segger J-Flash在Micron Flash固定区域下载校验失败的故事(SR寄存器BP[x:0]位)的更多相关文章

  1. 痞子衡嵌入式:在SBL项目实战中妙用i.MXRT1xxx里SystemReset不复位的GPR寄存器

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT1xxx里SystemReset不复位的GPR寄存器的小妙用. 我们知道稍大规模的项目代码设计一般都是多人协作完成的,在项目 ...

  2. 痞子衡嵌入式:在IAR开发环境下为工程开启CRC完整性校验功能的方法

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是在IAR开发环境下为工程开启CRC完整性校验功能的方法. CRC校验在嵌入式领域里的应用非常广,比如在通信领域,CRC检验值可以作为数据 ...

  3. 痞子衡嵌入式:轻松为i.MXRT设计更新Segger J-Link Flash下载算法文件

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是为i.MXRT设计更新Segger J-Link Flash下载算法文件. 想要在Flash中调试,基本是离不开Flash下载算法的,毕 ...

  4. 痞子衡嵌入式:kFlashFile v1.0 - 一个基于Flash的掉电数据存取方案

    大家好,我是痞子衡,是正经搞技术的痞子.今天给大家带来的是痞子衡的个人小项目 - kFlashFile. 痞子衡最近在参与一个基于 i.MXRT1170 的项目,项目有个需求,需要在 Flash 里实 ...

  5. 痞子衡嵌入式:MCUXpresso IDE下使用J-Link下载算法在Flash调试注意事项(i.MXRT500为例)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是MCUXpresso IDE下使用J-Link下载算法在Flash调试注意事项. 痞子衡前段时间写过一篇小文<为i.MXRT设计更 ...

  6. 痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU硬件那些事(2.3)- 串行NOR Flash下载算法(J-Link工具篇)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是J-Link工具下i.MXRT的串行NOR Flash下载算法设计. 在i.MXRT硬件那些事系列之<在串行NOR Flash X ...

  7. 痞子衡嵌入式:串行NOR Flash的页编程模式对于量产时间的影响

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是串行NOR Flash的页编程模式对于量产时间的影响. 任何嵌入式产品最终都绕不开量产效率话题,尤其是对于主控是非内置 Flash 型 ...

  8. 痞子衡嵌入式:超级下载算法RT-UFL v1.0在Segger Ozone下的使用

    痞子衡主导的"学术"项目 <RT-UFL - 一个适用全平台i.MXRT的超级下载算法设计> v1.0 版发布近 4 个月了,部分客户已经在实际项目开发调试中用上了这个 ...

  9. 痞子衡嵌入式:MCUBootUtility v2.3发布,这次不再放过任何一款Flash

    -- 痞子衡的 NXP-MCUBootUtility 开源项目自2018年8月27日第一笔提交至今已有21个月,目前累计代码已近50000行.相信这个工具为大家开发 i.MXRT 项目提供了一些便利, ...

随机推荐

  1. Linux上安装java

    1,输入命令,查看是否已经安装了Openjdk:rpm -qa | grep java 如果有已经安装的java版本或者版本低于1.7,卸载该jdk:rpm -e 软件包名字 如果不能卸载,可以加上 ...

  2. MySQL查询时间常用函数

    查看本月数据 SELECT *FROMcontent_publishWHERE date_format(publish_time, '%Y %m') = date_format(DATE_SUB(cu ...

  3. 羽夏看Linux内核——启动那些事

    写在前面   此系列是本人一个字一个字码出来的,包括示例和实验截图.如有好的建议,欢迎反馈.码字不易,如果本篇文章有帮助你的,如有闲钱,可以打赏支持我的创作.如想转载,请把我的转载信息附在文章后面,并 ...

  4. BMP位图之8位位图(三)

    起始结构 typedef struct tagBITMAPFILEHEADER { WORD bfType; //类型名,字符串"BM", DWORD bfSize; //文件大小 ...

  5. Apache DolphinScheduler 2.0.1 来了,备受期待的一键升级、插件化终于实现

    ✎ 编 者 按:好消息!Apache DolphinScheduler 2.0.1 版本正式发布! 本版本中,DolphinScheduler 经历了一场微内核+插件化的架构改进,70% 的代码被重构 ...

  6. Apache DolphinScheduler 架构演进介绍及开源经验分享 - eBay 阮文俊

    引言 来自 eBay 的文俊同学在近期的上海开源大数据 Meetup 上做了十分精彩的 "Apache DolphinScheduler 的架构演进" 分享.本次分享有近 200 ...

  7. 《吐血整理》进阶系列教程-拿捏Fiddler抓包教程(12)-Fiddler设置IOS手机抓包,你知多少???

    1.简介 Fiddler不但能截获各种浏览器发出的 HTTP 请求,也可以截获各种智能手机发出的HTTP/ HTTPS 请求. Fiddler 能捕获Android 和 Windows Phone 等 ...

  8. Redis 02 数据库

    参考源 https://www.bilibili.com/video/BV1S54y1R7SB?spm_id_from=333.999.0.0 版本 本文章基于 Redis 6.2.6 Redis 默 ...

  9. mybatis 09: 动态sql --- part1

    作用 可以定义代码片段 可以进行逻辑判断 可以进行循环处理(批量处理),使条件判断更为简单 使用方式 通过mybatis中与动态sql有关的标签来实现 < sql >标签 + < i ...

  10. 【JAVA】学习路径36-写到硬盘FileOutputStream Write的三种方法

    import java.io.FileOutputStream;import java.io.FileReader;import java.io.IOException;import java.nio ...