2

串行NOR Flash执行性能的究极模式 - QPIOPI

 1 year ago
source link: https://www.eefocus.com/embedded/526493
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是在FDCB里使能串行NOR Flash的QPI/OPI模式

我们知道 Flash 读时序里有五大子序列 CMD + ADDR + MODE + DUMMY + READ,前面的文章中痞子衡讲过《串行NOR Flash的Continuous read模式》,Continuous read 模式是为了在适当的情况下精简掉连续读访问里的后续 CMD 子序列,它可以进一步提高 Flash 访问性能,这已经是极限了吗?其实没有,还差最后一招,那就是痞子衡今天要讲的 QPI/OPI 模式。

一、什么是QPI/OPI模式?

截至到目前为止,不管是四线 Flash 还是 八线 Flash,痞子衡讲的所有 Flash 传输时序中的 CMD 子序列都是以 1 线形式发送的(即只通过 IO0 来发送),我想你肯定也曾经觉得奇怪过,为何其他子序列都有 1/2/4/8 线模式可选,偏偏这个 CMD 子序列总是 1 线模式?其实这也不能怨 CMD,毕竟所有的 Flash 传输时序都从 CMD 子序列开始的,后续子序列的 Pad 模式都是靠 CMD 命令码来区分的,为了保证 CMD 值能被正确获取,只能牺牲 CMD 序列的灵活性,就固定以 1 线形式发送,这也就是所谓的 SPI 模式。

为了不让 CMD 子序列太委屈,Flash 厂商也为了它单独做了设计,四线 Flash 可以切换到 4 线模式来发送 CMD 子序列(即 QPI 模式),八线 Flash 可以切换到 8 线模式来发送 CMD 子序列(即 OPI 模式),默认上电是 SPI 模式,然后在 SPI 模式下做指定设置可以切换到 QPI/OPI 模式,在 QPI/OPI 模式下做指定设置或者复位也能再回到 SPI 模式。

1.1 四线Flash的QPI模式

下面是一款典型的四线 Flash(芯成 IS25WP128) 在 QPI 模式下的 Fast Read Quad I/O 传输时序,此时 CMD 子序列仅在 2 个 CLK 内就完成了传输,因为 IO[3:0] 均参与了 CMD 发送,效率是 SPI 模式下的 4 倍。后面的子序列与 SPI 模式下一模一样。

forward?url=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FicSsJyL95utaibtL1pEC61husy5Nk4UDiaw8vFhZPFJYmFEHKZRuZNgfGlibkE3ljjBahRWPLB5ed0Lu5KTd1llyzQ%2F640%3Fwx_fmt%3Dpng&s=3090fd

1.2 八线Flash的OPI模式

下面是一款典型的八线 Flash(旺宏 MX25UM51345) 在 OPI 模式下的 OCTA Read 传输时序,此时 CMD 子序列仅在 1 个 CLK 内就完成了传输,因为 SIO[7:0] 均参与了 CMD 发送,效率是 SPI 模式下的 8 倍。后面的子序列与 SPI 模式下一模一样。

forward?url=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FicSsJyL95utaibtL1pEC61husy5Nk4UDiawGSlicCCnzupicsqbwYlqRdXFD1qHpJNNrbmLWLbwr47u7JlTnumdOia8w%2F640%3Fwx_fmt%3Dpng&s=abc213

二、不同Flash厂商关于QPI/OPI切换设计

现在跟着痞子衡去看几家主流Flash厂商关于 QPI/OPI 模式切换的设计(如果你想快速确认某一款型号Flash是否支持这个特性,找到其数据手册搜索"QPI/OPI"看有没有结果):

2.1 四线 Flash 上切换设计

QPI 模式是四线 Flash 上一个性能模式特性,并不是所有 Flash 都支持这个特性。而对于支持 QPI 模式的 Flash,不同厂商的切换设计也不太相同,不过大部分厂商都是选择发一个 CMD 命令时序来切换,比如芯成 IS25WP128 就是如下的时序进入和退出 QPI 模式:

forward?url=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FicSsJyL95utaibtL1pEC61husy5Nk4UDiawaYJordVXic62zAezcA8UtJavEFk73iawIzkmvR8VsxXY7WPW25Ke6SaA%2F640%3Fwx_fmt%3Dpng&s=4385e7

痞子衡找了几家市面上比较常见的四线 Flash,并整理了它们进出 QPI 模式命令码如下:

Flash型号 进入QPI模式命令码 退出QPI模式命令码
Adesto AT25SL系列 0x38 0xFF
芯成IS25WP系列 0x35 0xF5
华邦W25QxxJV-DTR系列 0x38 0xFF
兆易创新GD25Q系列 不支持 不支持

当然也有一些厂商不是发一个 CMD 命令时序来切换的设计,而是通过设置 Flash 内部寄存器的方式来做切换,比如赛普拉斯 S25FS-S 系列就是设置如下的寄存器来进入和退出 QPI 模式:

forward?url=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FicSsJyL95utaibtL1pEC61husy5Nk4UDiawGV3LYEQzdPWjVl7Stq4b51Rmiau1CepLw35Nfbz1tkNZfkJcgr0aTDQ%2F640%3Fwx_fmt%3Dpng&s=d0caea

2.2 八线 Flash 上切换设计

对于八线 Flash,即使 OPI 模式也算性能模式特性,但是基本上所有 Flash 都能支持这个特性(毕竟目前生产 8 线 Flash 的厂商并不多)。这些厂商都是提供设置 Flash 内部寄存器的方式来做切换:

如下是旺宏 MX25UM51345 切换 OPI 模式的寄存器定义:

forward?url=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FicSsJyL95utaibtL1pEC61husy5Nk4UDiaw54z9HicrTDNnH1NSqibyTicsMXROoxk4c7B39rcro8QEDy9svUY2Lj0oQ%2F640%3Fwx_fmt%3Dpng&s=f2da1e

如下是镁光 MT35X 系列切换 OPI 模式(即 Octal 模式)的寄存器定义:

forward?url=https%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_png%2FicSsJyL95utaibtL1pEC61husy5Nk4UDiawwHaDvwoAcaFAFxOPsFEKtLUsyxDjCRfF6ofVDmxotnjClTHofna37A%2F640%3Fwx_fmt%3Dpng&s=0bd409

三、在i.MXRT1170-EVK上实战(IS25WP128)

了解了上面关于 QPI/OPI 模式知识后,我们在恩智浦 i.MXRT1170-EVK 板子上实践一下。默认连接的 Flash 是IS25WP128,这款 Flash 是支持 QPI 模式的,我们随便在SDK包里找一个 XIP 例程,修改工程里  evkmimxrt1170_flexspi_nor_config.c 文件里的 FDCB 启动头如下,改完下载程序进 Flash 运行,代码执行效率应该会有所提升。

#define CMD_LUT_SEQ_IDX_ENTER_QPI 7
const flexspi_nor_config_t qspiflash_config = {
    .memConfig =
        {
            // ... 默认设置省略
            
            // 使能 QPI 配置操作
            .deviceModeCfgEnable = 1u,
            .deviceModeType = kDeviceConfigCmdType_Spi2Xpi,
            .waitTimeCfgCommands = 1,
            .deviceModeSeq =
                {
                    .seqNum   = 1,
                    .seqId    = CMD_LUT_SEQ_IDX_ENTER_QPI,
                    .reserved = 0,
                },
            .deviceModeArg = 0,
            .lookupTable =
                {
                    // Fast Read Quad I/O LUTs (将 CMD_SDR 的 Pad 模式由 FLEXSPI_1PAD 改为 FLEXSPI_4PAD)
                    [0]               = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_4PAD, 0xEB, RADDR_SDR, FLEXSPI_4PAD, 0x18),
                    [1]               = FLEXSPI_LUT_SEQ(MODE8_SDR, FLEXSPI_4PAD, 0x00, DUMMY_SDR, FLEXSPI_4PAD, 0x04),
                    [2]               = FLEXSPI_LUT_SEQ(READ_SDR, FLEXSPI_4PAD, 0x04, 0, 0, 0),
                    // 增加 Enter QPI 命令序列
                    [4*CMD_LUT_SEQ_IDX_ENTER_QPI]     = FLEXSPI_LUT_SEQ(CMD_SDR,   FLEXSPI_1PAD, 0x35, 0, 0, 0),
                },
        },
    // ... 默认设置省略
};

关于 OPI 模式使能的例子可以直接参考 MIMXRT500/600 SDK,因为其配套 EVK 使用的是旺宏 MX25UM51345,所以官方 SDK 里启动头 FDCB 都是包含开启 OPI 模式的配置代码的。

和使能 Continuous read 模式一样,使能 QPI/OPI 模式后,对项目最大的影响是考虑软复位后芯片再次启动的问题,具体可以参考痞子衡的旧文 《深扒i.MXRT系列ROM中集成的串行NOR Flash启动SW Reset功能及其应用场合》。

至此,在FDCB里使能串行NOR Flash的QPI/OPI模式痞子衡便介绍完毕了,掌声在哪里~~~


版权声明:与非网经原作者授权转载,版权属于原作者。文章观点仅代表作者本人,不代表与非网立场。文章及其配图仅供工程师学习之用,如有侵权或者其他问题,请联系本站作侵删。 侵权投诉


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK