本文由 发布,转载请注明出处,如有问题请联系我们! 发布时间: 2021-05-26痞子衡嵌入式:串行NOR Flash的Continuous read模式下软复位后i.MXRT无法启动问题解决方案之SW Reset

加载中

无赖衡内嵌式:串行通信NOR Flash的Continuous read方式下软校准后i.MXRT无法启动难题解决方法之SW Reset


  各位好!,我是无赖衡,是正儿八经搞技术性的无赖。今日无赖衡给大伙儿详细介绍的是i.MXRT上也就能NOR Flash的Continuous read方式在软校准后没法一切正常运行难题的处理工作经验

  先回望上篇 《串行NOR Flash的Continuous read模式下软复位后i.MXRT无法启动问题解决方案之RESET#》,运用RESET#脚位校准作用是无赖衡寻找的第一种解决方法,今日无赖衡再次给大伙儿详细介绍第二种解决方法。

  • 本系列产品会出现数篇文章内容,每章文章内容均从一个关键突破口考虑,得出一系列实际完成计划方案。
  • 本系列产品均以MIMXRT1170-EVK板为实例总体目标目标,板载Flash型号规格为芯成IS25WP128(别的i.MXRT集成ic和Flash型号规格下完成步骤也类似,需查询相匹配数据信息指南)。

一、处理构思

  我们知道无法启动难题是因为主集成ic产生软校准但Flash仍处在Continuous read方式导致的,要处理这个问题只不过以下三个视角,无赖衡会在后面实际完成计划方案里按这种视角所有搞一次(假如可用得话)。

  • 一、ROM层面不做一切有关解决,但App在启用NVIC_SystemReset()做校准前将Flash先切返回Normal方式;
  • 二、App层面不做一切有关解决,对BootROM有关配备做一些调节,让BootROM也可以一切正常解决处在Continuous read方式的Flash;
  • 三、ROM和App协同对Flash方式转换做一些独特解决。

二、关键突破口(依靠Flash的软校准指令作用)

  文中找的关键突破口是运用Flash的手机软件校准指令。Flash的手机软件校准时钟频率有二种:一种是JEDEC标准的(严格意义上来说实际上算硬件配置校准,但由于其需CS#,SCK,IO0三根电源线相互配合进行,因而无赖衡将其归到手机软件校准时钟频率类);另一种是生产商界定的手机软件校准指令(由于SOIC-8封裝的Flash沒有单独RESET#脚位,因而生产商提升这一软校准指令来替代缺少的单独RESET#脚位作用)。

2.1 JEDEC规范校准时钟频率

  JEDEC研究会要求了一种Flash校准时钟频率,必须CS#,SCK,IO0三根电源线相互配合进行,时钟频率以下,维持SCK脉冲信号不会改变(高/低均可),拉四次CS#数据信号,根据SI电源线輸出4'b0101(在CS#上升沿取样),则Flash会进到校准情况。

  JEDEC规范校准作用并非是全部Flash都集成化的,华邦、芯成流行Flash型号规格均不兼容JEDEC规范校准,无赖衡了解的Adesto ATXP032系列产品Flash里有JEDEC规范校准。

  ATXP032数据信息指南里有关JEDEC规范校准有关时钟频率规定以下,进到JEDEC校准后必须 tXUDPD 時间来修复。

2.2 手机软件校准指令时钟频率

  Flash数据信息指南命令集里一般都能够寻找reset有关指令。在IS25WP128数据信息指南里我们可以寻找以下软校准时钟频率,它由c066(RSTEN)和c099(RST)指令组成进行,主集成ic发了该指令组成后,Flash即进到校准情况。

  IS25WP128手机软件校准较大 必须100us的修复時间,在修复期内内对Flash开展读写能力擦实际操作并不会起效。

三、实际完成

  本章节目录叙述的方式,如果是在App里(这儿均指XIP App)进行,那麼App里提升的有关解决编码(留意是实行到的所有编码)必须是 ramfunc 特性(即运作在內部RAM里),那样实际操作Flash时可以不受到限制。除此之外程序执行前必须把全局性终断关闭,避免实行全过程中有终断开启,造成Flash里的有关IRQHandler涵数强制执行。

#if (defined(__ICCARM__))
__ramfunc 
#endif
void reset_flash_to_normal(void)
{
    __disable_irq();

    // 解决编码,使Flash回到到Normal方式

    NVIC_SystemReset();
}

3.1 仅ROM层面做有关解决

  大家先仅从ROM单方视角来解决困难,能够 首先看下无赖衡以前的旧文 《了解i.MXRT1060系列ROM中串行NOR Flash启动初始化流程优化点》 里的2.3节。一部分i.MXRT型号规格ROM里在串行通信NOR Flash运行步骤里集成化了JEDEC规范校准。

  假如要运用ROM里集成化的JEDEC规范校准作用,则Flash自身务必适用JEDEC规范校准。本系列产品实例主集成ici.MXRT1170的fusemap表里有关JEDEC_RESET的有关界定以下,因此 大家必须将fuse c0C80[6]位烧写成1。

3.2 仅App层面做有关解决

  上一小标题里的方式前提条件是Flash要适用JEDEC规范校准,但具体顾客新项目中型号选择的Flash通常沒有集成化JEDEC规范校准。因此 大家大量应当在生产商界定的软校准指令上下功夫,这就需要从App层面的视角来解决困难了。

  IS25WP128数据信息指南里寻找以下2个有关reset的指令,reset_flash_to_normal() 涵数里只必须按顺序推送这两个指令,而且延迟等够软校准修复時间就可以。

  编码能够 根据 \SDK_2.9.1_MIMXRT1170-EVK\boards\evkmimxrt1170\driver_examples\flexspi\nor\polling_transfer\cm7下边的 flexspi_nor_polling_transfer.c 和 flexspi_nor_flash_ops.c,并增加以下编码:

#define NOR_CMD_LUT_SEQ_IDX_RESETENABLE 14
#define NOR_CMD_LUT_SEQ_IDX_RESET       15

#define CUSTOM_LUT_LENGTH 64
const uint32_t customLUT[CUSTOM_LUT_LENGTH] = {
    // ...

    /* 增加 Reset Enable */
    [4 * NOR_CMD_LUT_SEQ_IDX_RESETENABLE] =
        FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, c066, kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0),

    /* 增加 Reset */
    [4 * NOR_CMD_LUT_SEQ_IDX_RESET] =
        FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, c099, kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0),
};

status_t flexspi_nor_software_reset(FLEXSPI_Type *base)
{
    flexspi_transfer_t flashXfer;
    status_t status;

    /* Write enable */
    flashXfer.deviceAddress = 0;
    flashXfer.port          = kFLEXSPI_PortA1;
    flashXfer.cmdType       = kFLEXSPI_Command;
    flashXfer.SeqNumber     = 1;
    flashXfer.seqIndex      = NOR_CMD_LUT_SEQ_IDX_RESETENABLE;

    status = FLEXSPI_TransferBlocking(base, &flashXfer);
    if (status != kStatus_Success)
    {
        return status;
    }

    flashXfer.seqIndex      = NOR_CMD_LUT_SEQ_IDX_RESET;

    status = FLEXSPI_TransferBlocking(base, &flashXfer);

    return status;
}

void reset_flash_to_normal(void)
{
    __disable_irq();

    flexspi_nor_flash_init(EXAMPLE_FLEXSPI);
    flexspi_nor_software_reset(EXAMPLE_FLEXSPI);

    // 这儿必须插进充足的延迟
    SDK_DelayAtLeastUs(100, SystemCoreClock);
    NVIC_SystemReset();
}

  为了更好地确保以上编码均实行在RAM里,工程项目链接文件里(以IAR实例)需要以下修改:

initialize by copy { readwrite, 
                     section .textrw, 
                     object fsl_common.o,
                     object I64DivZer.o,
                     object I64DivMod.o,
                     object fsl_flexspi.o,
                     object flexspi_nor_flash_ops.o,
                     object flexspi_nor_polling_transfer.o,
                     section CodeQuickAccess };

3.3 ROM和App协同解决

  有关ROM和App协同解决视角,在校准指令这一突破口上并没什么优点,这里省去。

  到此,i.MXRT上也就能NOR Flash的Continuous read方式在软校准后没法一切正常运行难题的处理工作经验无赖衡便详细介绍结束了,欢呼声在哪儿~~~

热烈欢迎定阅

文章发表另外公布到我的 博客园首页、CSDN首页、知乎问答首页、微信公众平台 服务平台上。

搜索微信"无赖衡内嵌式"或是扫描仪下边二维码,就可以在手机上第一时间看过哦。

评论(0条)

刀客源码 游客评论