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

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

3天内不再提示

一个关于Segger J-Flash在Micron Flash固定区域下载校验失败的故事

麦克泰技术 来源:麦克泰技术 作者:麦克泰技术 2022-11-01 11:28 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

今天痞子衡给大家讲的是一个关于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-EVKoardsevkmimxrt1170driver_examplesflexspi orpolling_transfer 例程稍作适配性修改,主要是将 customLUT 里的命令表按 Micron 数据手册命令表做调整(全用了四字节地址命令),然后跑了一下例程发现基本的 Flash 读写擦操作没有问题(默认操作的是 0x14000 处的 Sector),这表明硬件修改没有问题。

constuint32_tcustomLUT[CUSTOM_LUT_LENGTH]={
/*Fastreadquadmode-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),

/*EraseSector*/
[4*NOR_CMD_LUT_SEQ_IDX_ERASESECTOR]=
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR,kFLEXSPI_1PAD,0xDC,kFLEXSPI_Command_RADDR_SDR,kFLEXSPI_1PAD,0x20),

/*PageProgram-quadmode*/
[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软件里看擦写操作是能进行的,但后面发现其实根本没有正常擦写)。

76efd28c-5992-11ed-a3b6-dac502259ad0.png

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

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

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

771720a8-5992-11ed-a3b6-dac502259ad0.png

其次是 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() 函数。

#defineFLASH_QUAD_ENABLE0x40U

constuint32_tcustomLUT[CUSTOM_LUT_LENGTH]={
/*EnableQuadmode*/
[4*NOR_CMD_LUT_SEQ_IDX_WRITESTATUSREG]=
FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR,kFLEXSPI_1PAD,0x01,kFLEXSPI_Command_WRITE_SDR,kFLEXSPI_1PAD,0x04),
};

intmain(void)
{
//代码省略

/*Enterquadmode.*/
status=flexspi_nor_enable_quad_mode(EXAMPLE_FLEXSPI);
if(status!=kStatus_Success)
{
returnstatus;
}

//代码省略
}

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

7725eb38-5992-11ed-a3b6-dac502259ad0.png

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

773e860c-5992-11ed-a3b6-dac502259ad0.png

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

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

审核编辑 :李倩


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

    关注

    8

    文章

    7315

    浏览量

    93985
  • 开发板
    +关注

    关注

    25

    文章

    6125

    浏览量

    113371

原文标题:好文推荐| J-Flash在Micron Flash固定区域下载校验失败的故事

文章出处:【微信号:麦克泰技术,微信公众号:麦克泰技术】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    MCU固件几种Flash(闪存)划分方式

    你通过U盘、OTA远程等方式下载的程序,其实你还是需要提前下载BootLoader程序,才能进下载APP程序。     今天就来说说通过OTA方式升级固件时,几种
    的头像 发表于 11-27 18:20 959次阅读

    使用J-Flash来编程CW32 MCU

    1.安装J-Flash: 从SEGGER官方网站下载最新版本的J-Flash工具。 按照安装向导的指示完成安装过程。 2.连接硬件: 将CW32 MCU通过调试器(如
    发表于 11-25 07:00

    如何使用新版本J-Flash编程CW32 MCU

    1、从Segger公司官网下载安装最新版本JLink驱动,比如V7.96a,安装目录下没有JLinkDevices.xml文件。 2、C:Users<用户名>
    发表于 11-12 07:24

    CW32L012实现外部flash下载算法

    外部flash或者内置的片上flash,都是编译器通过调用写好的FLM文件来实现下载,单片机内部的安装pack包就会有(官方实现),外部flash的情况比较复杂,例如用的哪种
    的头像 发表于 10-09 17:38 1200次阅读
    CW32L012实现外部<b class='flag-5'>flash</b><b class='flag-5'>下载</b>算法

    SEGGER J-Probe工具的工作原理和应用

    SEGGER J-Probe工具的核心理念是提供可定制的图形用户界面(GUI),使开发人员能够应用程序运行时与嵌入式系统的内部数据进行
    的头像 发表于 08-14 10:04 1887次阅读
    <b class='flag-5'>SEGGER</b> <b class='flag-5'>J</b>-Probe工具的工作原理和应用

    FLASH模拟EEPROM入门指南

    0xFF,而EEPROM支持直接覆盖写入。 寿命考量:FLASH擦写次数有限(约10万次),需通过策略降低磨损;EEPROM则达百万次以上。 关键技术路线 双页轮换机制:使用两固定大小的存储页交替
    发表于 08-14 06:13

    使用Segger J-Link Pro对XMC7200的CM0+内核进行编程遇到的问题求解

    当我使用 GNU C 编译器编译起始(.text)地址为 0x10000000 的 CM0+ 程序时,我无法 Segger J-Link Pro 中下载该程序。我
    发表于 07-21 06:05

    SEGGER工具支持GigaDevice GD32C2系列微控制器

    J-Link和Flasher软件包从V8.46版本开始,SEGGER增加了基于Cortex-M23内核的GigaDevice GD32C2系列微控制器的调试和Flash编程支持。
    的头像 发表于 07-09 16:12 704次阅读

    如何使用新版本J-Flash编程CW32 MCU?

    1、从Segger公司官网下载安装最新版本JLink驱动,比如V7.96a,安装目录下没有JLinkDevices.xml文件。 2、C:Users AppDataRoamingSEGGER目录
    的头像 发表于 07-01 15:05 465次阅读
    如何使用新版本<b class='flag-5'>J-Flash</b>编程CW32 MCU?

    CYUSB3014不能给Flash下载程序怎么解决?

    我们这边在开发带USB3.0接口的CAN通讯监控工具的时候,USB出现了问题。USB3.0接口上通过control center工
    发表于 06-03 11:56

    如何通过SFL为设备添加Flash编程支持

    SEGGER Flash Loader(SFL)是J-Link设备支持套件(DSK)的部分,通过SFL,用户可以为自己的新设备添加Flash
    的头像 发表于 05-19 16:35 1102次阅读
    如何通过SFL为设备添加<b class='flag-5'>Flash</b>编程支持

    基于SEGGER的Ozone调试器和J-Trace工具跟踪Ferrocene的Rust应用

    2025年3月,SEGGER和Ferrous Systems合作,确保使用Ferrous Systems的Ferrocene工具链编译的Rust应用程序可以通过SEGGERJ-Trace工具实时
    的头像 发表于 03-14 11:27 1272次阅读

    使用STM32 ST-LINK Utility和j-flash无法擦除怎么解决?

    keil烧录程序中直接报错 使用工具擦除报 使用STM32 ST-LINK Utility 和j-flash也无法擦除这个要怎么解决
    发表于 03-12 07:07

    Flash下载工具用户指南

    电子发烧友网站提供《Flash下载工具用户指南.pdf》资料免费下载
    发表于 01-12 09:31 0次下载

    关于NAND Flash些小知识

    前言 作为名电子专业的学生,半导体存储显然是绕不过去的坎,今天聊关于Nand Flash
    的头像 发表于 12-17 17:33 1426次阅读