加入星计划,您可以享受以下权益:

  • 创作内容快速变现
  • 行业影响力扩散
  • 作品版权保护
  • 300W+ 专业用户
  • 1.5W+ 优质创作者
  • 5000+ 长期合作伙伴
立即加入
  • 正文
  • 推荐器件
  • 相关推荐
  • 电子产业图谱
申请入驻 产业图谱

Flash厂商不讲武德,竟有这种Dummy Cycle设置差异

2021/04/21
1137
阅读需 10 分钟
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是同一厂商不同系列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系列。

 

前面我们对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上其实是精简版。

 

二、如何更改Flash里的Dummy Cycle?

意识到IS25LP与IS25WP在Dummy Cycle设计上的差异,改起来就容易了。我们继续看Flash数据手册,IS25LP064A内部有个8bit的Read Register,其bit4-bit3是Dummy Cycles设置(精简设计一),寄存器类型里标明仅易失性一种属性(精简设计二)。

在IS25LP064A的指令集表里,可以看到专门写Read Register的指令,即SRP指令,注意指令值就是唯一的0xC0(精简设计三)。

分析到这里,额外的小工程修改Dummy Cycle是不可能了,只能老老实实在i.MXRT每次启动时直接借助FDCB启动头里的设置用SRP指令更改Flash的Dummy Cycle,即如下所示:

// 设置Dummy Cycle数
#define FLASH_DUMMY_CYCLES      8
#define FLASH_DUMMY_VALUE       0x2
// 写Read Register时序在LUT中的index(可自定义位置,但不要占BootROM预设的几个时序位置)
#define CMD_LUT_SEQ_IDX_SET_READ_PARAM 7
// BootROM中预设的LUT命令时序的index
#define CMD_LUT_SEQ_IDX_READ           0
#define CMD_LUT_SEQ_IDX_READSTATUS     1
#define CMD_LUT_SEQ_IDX_WRITEENABLE    3

const flexspi_nor_config_t qspiflash_config = {
    .memConfig =
        {
            .tag              = FLEXSPI_CFG_BLK_TAG,
            .version          = FLEXSPI_CFG_BLK_VERSION,
            .readSampleClkSrc = kFlexSPIReadSampleClk_LoopbackFromDqsPad,
            .csHoldTime       = 3u,
            .csSetupTime      = 3u,
            // Enable Safe configuration
            .controllerMiscOption = 0x10,
            .deviceType           = kFlexSpiDeviceType_SerialNOR,
            .sflashPadType        = kSerialFlash_4Pads,
            .serialClkFreq        = kFlexSpiSerialClk_133MHz,
            .sflashA1Size         = 8u * 1024u * 1024u,
            // 使能Flash寄存器配置操作
            .configCmdEnable = 1u,
            .configModeType[0] = kDeviceConfigCmdType_Generic,
            // 指示Flash寄存器配置时序在LUT中index
            .configCmdSeqs[0] = 
                {
                    .seqNum = 1,
                    .seqId = CMD_LUT_SEQ_IDX_SET_READ_PARAM,
                    .reserved = 0,
                },
            // 设定Flash寄存器配置值(这里就是写入Read Register的值)
            // Note1: 这里写入Read Register的值在IS25WP系列和IS25LP系列有区别
            .configCmdArgs[0] = FLASH_DUMMY_VALUE << 3,
            .lookupTable =
                {
                    // Fast Read Quad I/O
                    [4*CMD_LUT_SEQ_IDX_READ]               = FLEXSPI_LUT_SEQ(CMD_SDR,   FLEXSPI_1PAD, 0xEB, RADDR_SDR, FLEXSPI_4PAD, 0x18),
                    [4*CMD_LUT_SEQ_IDX_READ + 1]           = FLEXSPI_LUT_SEQ(MODE8_SDR, FLEXSPI_4PAD, 0x00, DUMMY_SDR, FLEXSPI_4PAD, FLASH_DUMMY_CYCLES-2),
                    [4*CMD_LUT_SEQ_IDX_READ + 2]           = FLEXSPI_LUT_SEQ(READ_SDR,  FLEXSPI_4PAD, 0x04, STOP,      FLEXSPI_1PAD, 0x00),
                   
                    // READ STATUS REGISTER
                    [4*CMD_LUT_SEQ_IDX_READSTATUS]         = FLEXSPI_LUT_SEQ(CMD_SDR,   FLEXSPI_1PAD, 0x05, READ_SDR,  FLEXSPI_1PAD, 0x01),
                    [4*CMD_LUT_SEQ_IDX_READSTATUS + 1]     = FLEXSPI_LUT_SEQ(STOP,      FLEXSPI_1PAD, 0x00, 0, 0, 0),
                   
                    // WRTIE ENABLE
                    [4*CMD_LUT_SEQ_IDX_WRITEENABLE]        = FLEXSPI_LUT_SEQ(CMD_SDR,   FLEXSPI_1PAD, 0x06, STOP,      FLEXSPI_1PAD, 0x00),

                    // Flash寄存器配置时序(这个时序需要上面READ STATUS, WRITE ENABLE的配合)
                    // Note2: 这里写入的指令在IS25WP系列和IS25LP系列有区别
                    [4*CMD_LUT_SEQ_IDX_SET_READ_PARAM]     = FLEXSPI_LUT_SEQ(CMD_SDR,   FLEXSPI_1PAD, 0xC0, WRITE_SDR, FLEXSPI_1PAD, 0x01),
                    [4*CMD_LUT_SEQ_IDX_SET_READ_PARAM + 1] = FLEXSPI_LUT_SEQ(STOP,      FLEXSPI_1PAD, 0x00, 0, 0, 0),
                },
        },
    .pageSize           = 256u,
    .sectorSize         = 4u * 1024u,
    .blockSize          = 64u * 1024u,
    .isUniformBlockSize = false,
};

至此,同一厂商不同系列Flash型号下Dummy Cycle设置方法的差异痞子衡便介绍完毕了,掌声在哪里~~~

推荐器件

更多器件
器件型号 数量 器件厂商 器件描述 数据手册 ECAD模型 风险等级 参考价格 更多信息
5003 1 Cobham PLC RF Connector Adapter, 3.5MM-1.85MM, Male-Male, ROHS COMPLIANT
$0.36 查看
CC0603KRX7R9BB104 1 YAGEO Corporation Capacitor, Ceramic, Chip, General Purpose, 0.1uF, 50V, ±10%, X7R, 0603 (1608 mm), 0.034"T, -55º ~ +125ºC, 7" Reel/Paper Tape

ECAD模型

下载ECAD模型
$0.03 查看
RCNL25R0F01R0KTT 1 American Technical Ceramics Corp RC Network
$3.98 查看
恩智浦

恩智浦

恩智浦半导体创立于2006年,其前身为荷兰飞利浦公司于1953年成立的半导体事业部,总部位于荷兰埃因霍温。恩智浦2010年在美国纳斯达克上市。恩智浦2010年在美国纳斯达克上市。恩智浦半导体致力于打造全球化解决方案,实现智慧生活,安全连结。

恩智浦半导体创立于2006年,其前身为荷兰飞利浦公司于1953年成立的半导体事业部,总部位于荷兰埃因霍温。恩智浦2010年在美国纳斯达克上市。恩智浦2010年在美国纳斯达克上市。恩智浦半导体致力于打造全球化解决方案,实现智慧生活,安全连结。收起

查看更多

相关推荐

电子产业图谱

硕士毕业于苏州大学电子信息学院,目前就职于恩智浦(NXP)半导体MCU系统部门,担任嵌入式系统应用工程师。痞子衡会定期分享嵌入式相关文章