当前位置:网络安全 > Piziheng Embedded:同一厂家不同系列Flash型号下Dummy Cycle设置方法可能会有所不同(以IS25LP064A为例)

Piziheng Embedded:同一厂家不同系列Flash型号下Dummy Cycle设置方法可能会有所不同(以IS25LP064A为例)

  • 发布:2023-10-02 18:41


  大家好,我是皮子恒,一个认真科技的痞子。今天皮子恒就给大家介绍一下同一厂家不同系列Flash型号Dummy Cycle设置方法的差异

  上一篇文章《在i.MXRT启动头FDCB里调整Flash工作频率也需同步设Dummy Cycle》,皮子衡以i.MXRT1170-EVK上的板载Flash型号IS25WP128为例,介绍了Dummy Cycle设置。最近,皮子恒正在支持一位需要使用i.MXRT1020-EVK的i.MXRT1020客户。板载Flash为IS25LP064A,与IS25WP128一样,都是同一Flash制造商ISSI的QSPI NOR产品。皮子恒理所当然地认为之前的经验可以直接用在这个Flash上​​,于是我原封不动地复制FDCB并直接使用,却发现i.MXRT1020无法启动。发生了什么事?

1。同一厂家不同系列Flash型号之间Dummy Cycle设置的差异

  ISSI(新诚半导体)是一家比较老牌的内存厂商。从规模上看,它并不算顶尖,但Flash产品线众多,品类齐全。其中串行NOR产品包括QuadSPI NOR、Octal Flash、Twin Quad NOR、HyperFlash等

ISSI 闪存类型:https://www.sychzs.cn/US/product-flash.shtml

  NXP官方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 Cycles默认最大工作频率为104MHz(这与IS25WP系列一致),但是什么是与IS25WP系列不同的是,IS25LP064A上的Dummy Cycle只有四个档位(2bit设置,对应4/6/8/10这四个值),而IS25WP系列Dummy Cycle有十五档(4bit设置,对应数值1-15),所以IS25LP064A上的Dummy Cycle设计实际上是一个精简版本

2。如何更改Flash中的Dummy Cycle?

  认识到IS25LP和IS25WP在Dummy Cycle设计上的差异后,更改起来就很容易了。我们继续看Flash数据手册。 IS25LP064A 内部有一个 8 位 Read Register,其 bit4-bit3 为 Dummy Cycles 设置(简化设计一)。寄存器类型仅表示易失性属性(简化设计二)

  在IS25LP064A的指令集表中,可以看到专门为Read Register编写的指令,即SRP指令。注意指令值只有0xC0(简化设计三)

  在分析的这一点上,不可能用额外的小项目来修改虚拟循环。我们只能在每次 i.MXRT 启动时,通过 FDCB 启动头中的设置,使用 SRP 命令直接更改 Flash 的 Dummy Cycle,如下。显示:

//设置Dummy Cycles数量
#define FLASH_DUMMY_CYCLES 8
#定义FLASH_DUMMY_VALUE 0x2
//在LUT中写入Read Register时序的索引(位置可以自定义,但不要占用BootROM预设的几个时序位置)
#定义CMD_LUT_SEQ_IDX_SET_READ_PARAM 7
//BootROM中预设的LUT命令时序索引
#定义CMD_LUT_SEQ_IDX_READ 0
#定义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,
            .版本 = FLEXSPI_CFG_BLK_VERSION,
            .readSampleClkSrc = kFlexSPIReadSampleClk_LoopbackFromDqsPad,
            .csHoldTime = 3u,
            .csSetupTime = 3u,
            // 启用安全配置.controllerMiscOption = 0x10,
            .deviceType = kFlexSpiDeviceType_SerialNOR,
            .sflashPadType = kSerialFlash_4Pads,
            .serialClkFreq = kFlexSpiSerialClk_133MHz,
            .sflashA1大小 = 8u * 1024u * 1024u,
            // 使能Flash寄存器配置操作
            .configCmdEnable = 1u,
            .configModeType[0] = kDeviceConfigCmdType_Generic,
            //指示Flash寄存器配置时序在LUT中索引
            .configCmdSeqs[0] =
                {
                    .seqNum = 1,
                    .seqId = CMD_LUT_SEQ_IDX_SET_READ_PARAM,
                    .保留= 0,
                },
            //设置Flash寄存器配置值(这里是写入Read Register的值)
            // 注1:IS25WP 系列和IS25LP 系列写入读取寄存器的值不同。
            .configCmdArgs[0] = FLASH_DUMMY_VALUE << 3,
            .lookupTable =
                {
                    // 快速读取四路 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, 停止, FLEXSPI_1PAD, 0x00),
                   
                    // 读取状态寄存器
                    [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),
                   
                    // 写使能
                    [4*CMD_LUT_SEQ_IDX_WRITEENABLE] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x06, 停止, FLEXSPI_1PAD, 0x00),// Flash寄存器配置时序(这个时序需要上面READ STATUS, WRITE ENABLE的配合)
                    // 注2: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,
    .扇区大小 = 4u * 1024u,
    .块大小 = 64u * 1024u,
    .isUniformBlockSize = false,
};

  至此,皮子恒就介绍完了同一厂家不同系列Flash机型下Dummy Cycle设置方法的差异。掌声在哪里~~~

欢迎订阅

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

微信搜索“痽子hengembedded”或扫描下方二维码即可在手机上立即观看。

相关文章