我們知道Flash讀時(shí)序里有五大子序列CMD + ADDR + MODE + DUMMY + READ,前面的文章中講過《串行NOR Flash的Continuous read模式》,Continuous read模式是為了在適當(dāng)?shù)那闆r下精簡掉連續(xù)讀訪問里的后續(xù)CMD子序列,它可以進(jìn)一步提高Flash訪問性能,這已經(jīng)是極限了嗎?其實(shí)沒有,還差最后一招,那就是今天要講的QPI/OPI模式。
一、什么是QPI/OPI模式?
截至到目前為止,不管是四線Flash還是八線Flash,之前講的所有Flash傳輸時(shí)序中的CMD子序列都是以單線形式發(fā)送的(即只通過IO0來發(fā)送),我想你肯定也曾經(jīng)覺得奇怪過,為何其他子序列都有1/2/4/8線模式可選,偏偏這個(gè)CMD子序列總是1線模式?
其實(shí)這也不能怨CMD,畢竟所有的Flash傳輸時(shí)序都從CMD子序列開始的,后續(xù)子序列的Pad模式都是靠CMD命令碼來區(qū)分的,為了保證CMD值能被正確獲取,只能犧牲CMD序列的靈活性,就固定以單線形式發(fā)送,這也就是所謂的SPI模式。
為了不讓CMD子序列太委屈,F(xiàn)lash 廠商也為了它單獨(dú)做了設(shè)計(jì),四線Flash可以切換到4線模式來發(fā)送CMD子序列(即QPI模式),八線Flash可以切換到8線模式來發(fā)送CMD子序列(即OPI模式),上電默認(rèn)是SPI模式,然后在SPI模式下做指定設(shè)置可以切換到QPI/OPI模式,在QPI/OPI模式下做指定設(shè)置或者復(fù)位也能再回到SPI模式。
1.1 四線Flash的QPI模式
下面是一款典型的四線Flash芯成 IS25WP128)在QPI模式下的Fast Read Quad I/O傳輸時(shí)序,此時(shí)CMD子序列僅在2個(gè)CLK內(nèi)就完成了傳輸,因?yàn)镮O[3:0]均參與了CMD發(fā)送,效率是SPI模式下的 4 倍。后面的子序列與SPI模式下一模一樣。
1.2 八線Flash的OPI模式
下面是一款典型的八線Flash(旺宏 MX25UM51345)在OPI模式下的OCTA Read傳輸時(shí)序,此時(shí)CMD子序列僅在1個(gè)CLK內(nèi)就完成了傳輸,因?yàn)镾IO[7:0]均參與了CMD發(fā)送,效率是SPI模式下的8倍。后面的子序列與SPI模式下一模一樣。
二、不同F(xiàn)lash廠商關(guān)于QPI/OPI切換設(shè)計(jì)
現(xiàn)在我們來看幾家主流Flash廠商關(guān)于QPI/OPI模式切換的設(shè)計(jì)(如果你想快速確認(rèn)某一款型號(hào)Flash是否支持這個(gè)特性,找到其數(shù)據(jù)手冊(cè)搜索"QPI/OPI"看有沒有結(jié)果):
2.1 四線 Flash 上切換設(shè)計(jì)
QPI模式是四線Flash上一個(gè)性能模式特性,并不是所有 Flash 都支持這個(gè)特性。而對(duì)于支持QPI模式的Flash,不同廠商的切換設(shè)計(jì)也不太相同,不過大部分廠商都是選擇發(fā)一個(gè)CMD命令時(shí)序來切換,比如芯成IS25WP128就是如下的時(shí)序進(jìn)入和退出QPI模式:
找了幾家市面上比較常見的四線 Flash,并整理了它們進(jìn)出QPI模式命令碼如下:
當(dāng)然也有一些廠商不是發(fā)一個(gè)CMD命令時(shí)序來切換的設(shè)計(jì),而是通過設(shè)置Flash內(nèi)部寄存器的方式來做切換,比如賽普拉斯S25FS-S系列就是設(shè)置如下的寄存器來進(jìn)入和退出QPI模式:
2.2 八線 Flash 上切換設(shè)計(jì)
對(duì)于八線Flash,即使OPI模式也算性能模式特性,但是基本上所有Flash都能支持這個(gè)特性(畢竟目前生產(chǎn)8線Flash的廠商并不多)。這些廠商都是提供設(shè)置Flash內(nèi)部寄存器的方式來做切換:
如下是旺宏 MX25UM51345 切換 OPI 模式的寄存器定義:
如下是鎂光 MT35X 系列切換 OPI 模式(即 Octal 模式)的寄存器定義:
三、在i.MXRT1170-EVK上實(shí)戰(zhàn)
了解了上面關(guān)于QPI/OPI模式知識(shí)后,我們?cè)诙髦瞧謎.MX RT1170-EVK板子上實(shí)踐一下。
默認(rèn)連接的Flash是IS25WP128,這款Flash是支持QPI模式的,我們隨便在SDK包里找一個(gè)XIP例程,修改工程里evkmimxrt1170_flexspi_nor_config.c文件里的FDCB啟動(dòng)頭如下,改完下載程序進(jìn)Flash運(yùn)行,代碼執(zhí)行效率應(yīng)該會(huì)有所提升。
#define CMD_LUT_SEQ_IDX_ENTER_QPI 7 const flexspi_nor_config_t qspiflash_config = { .memConfig = { // ... 默認(rèn)設(shè)置省略 // 使能 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), }, }, // ... 默認(rèn)設(shè)置省略 };
關(guān)于OPI模式使能的例子可以直接參考MIMXRT500/600 SDK,因?yàn)槠渑涮譋VK使用的是旺宏MX25UM51345,所以官方SDK里啟動(dòng)頭FDCB都是包含開啟OPI模式的配置代碼的。
-
寄存器
+關(guān)注
關(guān)注
31文章
5357瀏覽量
120581 -
數(shù)據(jù)
+關(guān)注
關(guān)注
8文章
7073瀏覽量
89139 -
SPI
+關(guān)注
關(guān)注
17文章
1708瀏覽量
91714
原文標(biāo)題:在i.MX RT啟動(dòng)頭FDCB里使能串行NOR Flash的QPI/OPI模式
文章出處:【微信號(hào):NXP_SMART_HARDWARE,微信公眾號(hào):恩智浦MCU加油站】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論