我們知道Flash讀時序里有五大子序列CMD + ADDR + MODE + DUMMY + READ,前面的文章中講過《串行NOR Flash的Continuous read模式》,Continuous read模式是為了在適當的情況下精簡掉連續讀訪問里的后續CMD子序列,它可以進一步提高Flash訪問性能,這已經是極限了嗎?其實沒有,還差最后一招,那就是今天要講的QPI/OPI模式。
一、什么是QPI/OPI模式?
截至到目前為止,不管是四線Flash還是八線Flash,之前講的所有Flash傳輸時序中的CMD子序列都是以單線形式發送的(即只通過IO0來發送),我想你肯定也曾經覺得奇怪過,為何其他子序列都有1/2/4/8線模式可選,偏偏這個CMD子序列總是1線模式?
其實這也不能怨CMD,畢竟所有的Flash傳輸時序都從CMD子序列開始的,后續子序列的Pad模式都是靠CMD命令碼來區分的,為了保證CMD值能被正確獲取,只能犧牲CMD序列的靈活性,就固定以單線形式發送,這也就是所謂的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模式下一模一樣。
1.2 八線Flash的OPI模式
下面是一款典型的八線Flash(旺宏 MX25UM51345)在OPI模式下的OCTA Read傳輸時序,此時CMD子序列僅在1個CLK內就完成了傳輸,因為SIO[7:0]均參與了CMD發送,效率是SPI模式下的8倍。后面的子序列與SPI模式下一模一樣。
二、不同Flash廠商關于QPI/OPI切換設計
現在我們來看幾家主流Flash廠商關于QPI/OPI模式切換的設計(如果你想快速確認某一款型號Flash是否支持這個特性,找到其數據手冊搜索"QPI/OPI"看有沒有結果):
2.1 四線 Flash 上切換設計
QPI模式是四線Flash上一個性能模式特性,并不是所有 Flash 都支持這個特性。而對于支持QPI模式的Flash,不同廠商的切換設計也不太相同,不過大部分廠商都是選擇發一個CMD命令時序來切換,比如芯成IS25WP128就是如下的時序進入和退出QPI模式:
找了幾家市面上比較常見的四線 Flash,并整理了它們進出QPI模式命令碼如下:
當然也有一些廠商不是發一個CMD命令時序來切換的設計,而是通過設置Flash內部寄存器的方式來做切換,比如賽普拉斯S25FS-S系列就是設置如下的寄存器來進入和退出QPI模式:
2.2 八線 Flash 上切換設計
對于八線Flash,即使OPI模式也算性能模式特性,但是基本上所有Flash都能支持這個特性(畢竟目前生產8線Flash的廠商并不多)。這些廠商都是提供設置Flash內部寄存器的方式來做切換:
如下是旺宏 MX25UM51345 切換 OPI 模式的寄存器定義:
如下是鎂光 MT35X 系列切換 OPI 模式(即 Octal 模式)的寄存器定義:
三、在i.MXRT1170-EVK上實戰
了解了上面關于QPI/OPI模式知識后,我們在恩智浦i.MX RT1170-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模式的配置代碼的。
-
寄存器
+關注
關注
31文章
5421瀏覽量
123308 -
數據
+關注
關注
8文章
7239瀏覽量
90990 -
SPI
+關注
關注
17文章
1779瀏覽量
94694
原文標題:在i.MX RT啟動頭FDCB里使能串行NOR Flash的QPI/OPI模式
文章出處:【微信號:NXP_SMART_HARDWARE,微信公眾號:恩智浦MCU加油站】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
【orangepi zero試用體驗】之二:給OPI配合個殼,加裝散熱風扇
一種低成本的 高速SRAM 替代解決方案
如何在服務板上使用QPI總線的FPGA接口?
art_pi_bootloader例程為什么啟動時直接QPI模式
在QPI模式下輪詢NOR閃存的SR時HAL_QSPI_AutoPolling()失敗了怎么處理?
STM32L476VGT6在QPI模式下發送命令的問題如何解決?
Optekinc推出2Mbd傳輸速率的光隔離器OPI1268
QPI-21LZ有源EMI濾波器的數據手冊免費下載

評論