大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是在FDCB裡使能序列NOR Flash的QPI/OPI模式。
我們知道 Flash 讀時序裡有五大子序列 CMD + ADDR + MODE + DUMMY + READ,前面的文章中痞子衡講過《序列NOR Flash的Continuous read模式》,Continuous read 模式是為了在適當的情況下精簡掉連續讀存取裡的後續 CMD 子序列,它可以進一步提高 Flash 存取效能,這已經是極限了嗎?其實沒有,還差最後一招,那就是痞子衡今天要講的 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 模式。
下面是一款典型的四線 Flash(芯成 IS25WP128) 在 QPI 模式下的 Fast Read Quad I/O 傳輸時序,此時 CMD 子序列僅在 2 個 CLK 內就完成了傳輸,因為 IO[3:0] 均參與了 CMD 傳送,效率是 SPI 模式下的 4 倍。後面的子序列與 SPI 模式下一模一樣。
下面是一款典型的八線 Flash(旺宏 MX25UM51345) 在 OPI 模式下的 OCTA Read 傳輸時序,此時 CMD 子序列僅在 1 個 CLK 內就完成了傳輸,因為 SIO[7:0] 均參與了 CMD 傳送,效率是 SPI 模式下的 8 倍。後面的子序列與 SPI 模式下一模一樣。
現在跟著痞子衡去看幾家主流Flash廠商關於 QPI/OPI 模式切換的設計(如果你想快速確認某一款型號Flash是否支援這個特性,找到其資料手冊搜尋"QPI/OPI"看有沒有結果):
QPI 模式是四線 Flash 上一個效能模式特性,並不是所有 Flash 都支援這個特性。而對於支援 QPI 模式的 Flash,不同廠商的切換設計也不太相同,不過大部分廠商都是選擇發一個 CMD 命令時序來切換,比如芯成 IS25WP128 就是如下的時序進入和退出 QPI 模式:
痞子衡找了幾家市面上比較常見的四線 Flash,並整理了它們進出 QPI 模式命令碼如下:
Flash型號 | 進入QPI模式命令碼 | 退出QPI模式命令碼 |
---|---|---|
Adesto AT25SL系列 | 0x38 | 0xFF |
芯成IS25WP系列 | 0x35 | 0xF5 |
華邦W25QxxJV-DTR系列 | 0x38 | 0xFF |
兆易創新GD25Q系列 | 不支援 | 不支援 |
當然也有一些廠商不是發一個 CMD 命令時序來切換的設計,而是通過設定 Flash 內部暫存器的方式來做切換,比如賽普拉斯 S25FS-S 系列就是設定如下的暫存器來進入和退出 QPI 模式:
對於八線 Flash,即使 OPI 模式也算效能模式特性,但是基本上所有 Flash 都能支援這個特性(畢竟目前生產 8 線 Flash 的廠商並不多)。這些廠商都是提供設定 Flash 內部暫存器的方式來做切換:
如下是旺宏 MX25UM51345 切換 OPI 模式的暫存器定義:
如下是鎂光 MT35X 系列切換 OPI 模式(即 Octal 模式)的暫存器定義:
瞭解了上面關於 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模式痞子衡便介紹完畢了,掌聲在哪裡~~~
文章會同時釋出到我的 部落格園主頁、CSDN主頁、知乎主頁、微信公眾號 平臺上。
微信搜尋"痞子衡嵌入式"或者掃描下面二維條碼,就可以在手機上第一時間看了哦。
最後歡迎關注痞子衡個人微信公眾號【痞子衡嵌入式】,一個專注嵌入式技術的公眾號,跟著痞子衡一起玩轉嵌入式。
衡傑(痞子衡),目前就職於恩智浦MCU系統部門,擔任嵌入式系統應用工程師。
專欄內所有文章的轉載請註明出處:http://www.cnblogs.com/henjay724/
與痞子衡進一步交流或諮詢業務合作請發郵件至 https://www.cnblogs.com/henjay724/p/[email protected]
可以關注痞子衡的Github主頁 https://github.com/JayHeng,有很多好玩的嵌入式專案。
關於專欄文章有任何疑問請直接在部落格下面留言,痞子衡會及時回覆免費(劃重點)答疑。
痞子衡郵箱已被私信擠爆,技術問題不推薦私信,堅持私信請先掃碼付款(5元起步)再發。