查看: 1261|回复: 0

[分享] [痞子衡]Flash工作频率与Dummy Cycle是怎样的联系?

[复制链接]
  • TA的每日心情
    开心
    2024-3-26 15:16
  • 签到天数: 266 天

    [LV.8]以坛为家I

    3303

    主题

    6550

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    32063
    最后登录
    2024-4-30
    发表于 2021-12-13 16:34:21 | 显示全部楼层 |阅读模式
    Flash工作频率与Dummy Cycle是怎样的联系?


    大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是同一厂商不同系列Flash型号下Dummy Cycle设置方法的差异。


    上一篇文章 《在i.MXRT启动头FDCB里调整Flash工作频率也需同步设Dummy Cycle》, 痞子衡是以i.MXRT1170-EVK上板载Flash型号IS25WP128为例来介绍Dummy Cycle设置的。最近痞子衡在支持一个i.MXRT1020客户的问题,需要用到i.MXRT1020-EVK,这个板载Flash是IS25LP064A,跟IS25WP128一样是来自同一Flash厂商ISSI的QSPI NOR产品,痞子衡想当然地认为之前的经验可以直接用在这颗Flash上,于是把FDCB原封不动地拷贝过来直接使用,但是发现i.MXRT1020竟然启动不了,这是怎么回事?


    一、同一厂商不同系列Flash型号Dummy Cycle设置差异
    ISSI(芯成半导体)是一个比较老牌的存储器厂商,规模上不算顶级,但旗下Flash产品线众多,品类很齐全。其中串行NOR产品涵盖QuadSPI NOR、Octal Flash、Twin Quad NOR、HyperFlash等。


    ISSI Flash种类:https://www.issi.com/US/product-flash.shtml


    恩智浦官方EVK板上选用的是IS25xP系列,属于最常用的QuadSPI NOR大类。这个系列主要分两大类:1.8V供电的IS25WP系列、3.3V供电的IS25LP系列。
    14.png 图片
    前面我们对IS25WP系列Flash的Dummy Cycle设置很了解了,那么IS25LP系列Flash是不是一样的设计呢?我们查看IS25LP064A数据手册来确认一下。


    我们找到如下Read Dummy Cycle与最大工作频率的对应表,从表里可以看到当IS25LP064A工作在Fast Read Quad I/O模式时,默认的6个Dummy Cycle适用的最大工作频率是104MHz(这点上与IS25WP系列是一致的),不过与IS25WP系列不同的是IS25LP064A上Dummy Cycle仅有四档(2bit设置,对应4/6/8/10四种值),而IS25WP系列Dummy Cycle有十五档(4bit设置,对应1-15取值),所以Dummy Cycle设计在IS25LP064A上其实是精简版。
    15.png
    二、如何更改Flash里的Dummy Cycle?
    意识到IS25LP与IS25WP在Dummy Cycle设计上的差异,改起来就容易了。我们继续看Flash数据手册,IS25LP064A内部有个8bit的Read Register,其bit4-bit3是Dummy Cycles设置(精简设计一),寄存器类型里标明仅易失性一种属性(精简设计二)。
    16.png
    在IS25LP064A的指令集表里,可以看到专门写Read Register的指令,即SRP指令,注意指令值就是唯一的0xC0(精简设计三)。
    17.png
    分析到这里,额外的小工程修改Dummy Cycle是不可能了,只能老老实实在i.MXRT每次启动时直接借助FDCB启动头里的设置用SRP指令更改Flash的Dummy Cycle,即如下所示:
    1. // 设置Dummy Cycle数
    2. #define FLASH_DUMMY_CYCLES      8
    3. #define FLASH_DUMMY_VALUE       0x2
    4. // 写Read Register时序在LUT中的index(可自定义位置,但不要占BootROM预设的几个时序位置)
    5. #define CMD_LUT_SEQ_IDX_SET_READ_PARAM 7
    6. // BootROM中预设的LUT命令时序的index
    7. #define CMD_LUT_SEQ_IDX_READ           0
    8. #define CMD_LUT_SEQ_IDX_READSTATUS     1
    9. #define CMD_LUT_SEQ_IDX_WRITEENABLE    3

    10. const flexspi_nor_config_t qspiflash_config = {
    11.     .memConfig =
    12.         {
    13.             .tag              = FLEXSPI_CFG_BLK_TAG,
    14.             .version          = FLEXSPI_CFG_BLK_VERSION,
    15.             .readSampleClkSrc = kFlexSPIReadSampleClk_LoopbackFromDqsPad,
    16.             .csHoldTime       = 3u,
    17.             .csSetupTime      = 3u,
    18.             // Enable Safe configuration
    19.             .controllerMiscOption = 0x10,
    20.             .deviceType           = kFlexSpiDeviceType_SerialNOR,
    21.             .sflashPadType        = kSerialFlash_4Pads,
    22.             .serialClkFreq        = kFlexSpiSerialClk_133MHz,
    23.             .sflashA1Size         = 8u * 1024u * 1024u,
    24.             // 使能Flash寄存器配置操作
    25.             .configCmdEnable = 1u,
    26.             .configModeType[0] = kDeviceConfigCmdType_Generic,
    27.             // 指示Flash寄存器配置时序在LUT中index
    28.             .configCmdSeqs[0] =
    29.                 {
    30.                     .seqNum = 1,
    31.                     .seqId = CMD_LUT_SEQ_IDX_SET_READ_PARAM,
    32.                     .reserved = 0,
    33.                 },
    34.             // 设定Flash寄存器配置值(这里就是写入Read Register的值)
    35.             // Note1: 这里写入Read Register的值在IS25WP系列和IS25LP系列有区别
    36.             .configCmdArgs[0] = FLASH_DUMMY_VALUE << 3,
    37.             .lookupTable =
    38.                 {
    39.                     // Fast Read Quad I/O
    40.                     [4*CMD_LUT_SEQ_IDX_READ]               = FLEXSPI_LUT_SEQ(CMD_SDR,   FLEXSPI_1PAD, 0xEB, RADDR_SDR, FLEXSPI_4PAD, 0x18),
    41.                     [4*CMD_LUT_SEQ_IDX_READ + 1]           = FLEXSPI_LUT_SEQ(MODE8_SDR, FLEXSPI_4PAD, 0x00, DUMMY_SDR, FLEXSPI_4PAD, FLASH_DUMMY_CYCLES-2),
    42.                     [4*CMD_LUT_SEQ_IDX_READ + 2]           = FLEXSPI_LUT_SEQ(READ_SDR,  FLEXSPI_4PAD, 0x04, STOP,      FLEXSPI_1PAD, 0x00),
    43.                   
    44.                     // READ STATUS REGISTER
    45.                     [4*CMD_LUT_SEQ_IDX_READSTATUS]         = FLEXSPI_LUT_SEQ(CMD_SDR,   FLEXSPI_1PAD, 0x05, READ_SDR,  FLEXSPI_1PAD, 0x01),
    46.                     [4*CMD_LUT_SEQ_IDX_READSTATUS + 1]     = FLEXSPI_LUT_SEQ(STOP,      FLEXSPI_1PAD, 0x00, 0, 0, 0),
    47.                   
    48.                     // WRTIE ENABLE
    49.                     [4*CMD_LUT_SEQ_IDX_WRITEENABLE]        = FLEXSPI_LUT_SEQ(CMD_SDR,   FLEXSPI_1PAD, 0x06, STOP,      FLEXSPI_1PAD, 0x00),

    50.                     // Flash寄存器配置时序(这个时序需要上面READ STATUS, WRITE ENABLE的配合)
    51.                     // Note2: 这里写入的指令在IS25WP系列和IS25LP系列有区别
    52.                     [4*CMD_LUT_SEQ_IDX_SET_READ_PARAM]     = FLEXSPI_LUT_SEQ(CMD_SDR,   FLEXSPI_1PAD, 0xC0, WRITE_SDR, FLEXSPI_1PAD, 0x01),
    53.                     [4*CMD_LUT_SEQ_IDX_SET_READ_PARAM + 1] = FLEXSPI_LUT_SEQ(STOP,      FLEXSPI_1PAD, 0x00, 0, 0, 0),
    54.                 },
    55.         },
    56.     .pageSize           = 256u,
    57.     .sectorSize         = 4u * 1024u,
    58.     .blockSize          = 64u * 1024u,
    59.     .isUniformBlockSize = false,
    60. };
    复制代码
    至此,同一厂商不同系列Flash型号下Dummy Cycle设置方法的差异痞子衡便介绍完毕了,掌声在哪里~~~









    签到签到
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-5-6 00:41 , Processed in 0.115328 second(s), 21 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表