加入星計(jì)劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專(zhuān)業(yè)用戶(hù)
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長(zhǎng)期合作伙伴
立即加入
  • 正文
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

什么是串行Flash的Continuous read模式?

09/21 16:21
3.9萬(wàn)
閱讀需 15 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

大家好,我是痞子衡,是正經(jīng)搞技術(shù)的痞子。今天痞子衡給大家介紹的是在FDCB里使能串行NOR Flash的Continuous read模式。

前面關(guān)于串行Flash傳輸時(shí)序的文章 《Fast Read Quad I/O SDR模式》 與 《Fast Read Quad I/O DTR模式》, 痞子衡介紹的其實(shí)都屬于經(jīng)典SPI工作模式大類(lèi)下的Non-Continuous read傳輸模式,即任何獨(dú)立的Fast Read Quad I/O讀數(shù)據(jù)時(shí)序(一次CS低有效期間),都必須由Command子序列(命令碼0xEB/0xEC/0xED/0xEE)先行,且不管是SDR還是DTR模式,命令碼都是要在8個(gè)SCK周期內(nèi)由IO0信號(hào)進(jìn)行傳輸(別小看這8個(gè)SCLK周期,對(duì)于小數(shù)據(jù)塊讀取時(shí)序,它在總傳輸時(shí)間里占比是不可忽視的)。

我們知道在XIP情況下CPU從Flash里取指令數(shù)據(jù)往往是非常隨機(jī)且零碎無(wú)序的,這時(shí)候雖然有L1 Cache和和FlexSPI Prefetch Buffer加速,但如果還想再進(jìn)一步提升訪問(wèn)性能,就只能從Flash底層傳輸序列里想辦法了。Flash讀時(shí)序里有五大子序列CMD + ADDR + MODE + DUMMY + READ,其中除了CMD和DUMMY子序列是固定的,其他子序列參數(shù)值都可能會(huì)變,會(huì)變的就不能被優(yōu)化,所以只能想辦法在CMD和DUMMY子序列里做文章。今天痞子衡要介紹的Continuous read模式就是拿CMD子序列開(kāi)刀:

 

一、什么是Continuous read模式?

Continuous read顧名思義就是連續(xù)讀。在串行Flash世界里,連續(xù)讀的意思是讀傳輸時(shí)序里除了第一次CS有效期必須傳輸Command子序列,其后的讀傳輸時(shí)序里均省去Command子序列。下面痞子衡結(jié)合i.MXRT的FlexSPI外設(shè)來(lái)對(duì)比介紹Non-Continuous read與Continuous read模式的區(qū)別:

 

1.1 FlexSPI的XIP Enhanced Mode

我們知道NOR Flash因?yàn)橹С种髟O(shè)備隨機(jī)讀取其任意地址處的數(shù)據(jù),因此從原理上可以用作XIP設(shè)備。但因?yàn)槭?a class="article-link" target="_blank" href="/baike/492696.html">串行接口,所以不能直接X(jué)IP(沒(méi)有獨(dú)立并行地址線(xiàn),CPU無(wú)法直接尋址),需要FlexSPI外設(shè)在底層完成AHB總線(xiàn)讀訪問(wèn)的實(shí)時(shí)響應(yīng)工作,這個(gè)實(shí)時(shí)響應(yīng)工作就是FlexSPI的XIP特性。

FlexSPI的XIP特性可以支持任意串行NOR Flash,對(duì)Flash廠商設(shè)計(jì)沒(méi)要求。為了提升XIP代碼執(zhí)行效率,F(xiàn)lexSPI中也集成了XIP Enhanced Mode特性(其實(shí)就是Continuous read模式),見(jiàn)下圖,CS1是包含CMD子序列的讀時(shí)序(即第一次CS),CS2/3(包括后續(xù)所有CS)相比CS1少了CMD子序列,這就是Continuous read訪問(wèn)時(shí)序。

 

FlexSPI的XIP Enhanced Mode特性并不能夠用于任意串行NOR Flash,這對(duì)Flash廠商設(shè)計(jì)有要求,必須Flash本身支持Continuous read模式才行。

 

1.2 Fast Read Quad I/O Continuous read時(shí)序

了解了XIP Enhanced Mode,我們?cè)賮?lái)看LUT里Quad I/O Read SDR Continuous read傳輸序列,它由CMD_SDR + RADDR_SDR + MODE8_SDR + DUMMY_SDR + READ_SDR + JMP_ON_CS + STOP七個(gè)子序列組成,如下表所示。

這個(gè)Continuous read傳輸序列相比Non-Continuous read傳輸時(shí)序主要有兩處區(qū)別:


1. 原MODE8_SDR子序列里參數(shù)值不同:這個(gè)參數(shù)值用于通知Flash器件當(dāng)前傳輸類(lèi)型(Non-Continuous read/Continuous read),具體數(shù)值由Flash廠商定義。下圖是以Cypress S25FS-S系列Flash為例的,0xA0表明Flash需進(jìn)入/保持Continuous read模式。
2. 新增了JMP_ON_CS子序列:該子序列是FlexSPI外設(shè)實(shí)現(xiàn)Continuous read的核心,第一次CS有效傳輸時(shí)序里CMD_SDR子序列命令碼會(huì)被自動(dòng)存在該子序列參數(shù)值里,這樣后續(xù)傳輸FlexSPI就不用再發(fā)命令碼了。

 

LUT中Quad I/O Read DDR Continuous read傳輸序列如下,差異與前面SDR下的分析一致,這里不予贅述。

 

二、不同F(xiàn)lash廠商關(guān)于Continuous read特性設(shè)計(jì)

現(xiàn)在跟著痞子衡去看幾家主流Flash廠商關(guān)于Continuous read特性的設(shè)計(jì)(如果你想快速確認(rèn)某一款型號(hào)Flash是否支持這個(gè)特性,找到其數(shù)據(jù)手冊(cè)搜索"Continuous read"看有沒(méi)有如下時(shí)序圖):

 

2.1 賽普拉斯S25FS-S系列

MODE子序列里參數(shù)值M[7:4]通過(guò)包含/不包含Command子序列來(lái)控制下一次讀傳輸時(shí)序的長(zhǎng)度,M[7:4] = 0xA則進(jìn)入/保持Continuous Read模式,否則不進(jìn)入/退出。

 

2.2 Adesto AT25SL系列

MODE子序列里參數(shù)值M[7:4] = 0xA則進(jìn)入/保持Continuous Read模式,否則不進(jìn)入/退出。

 

2.3 芯成IS25WP系列

MODE子序列里參數(shù)值M[7:4] = 0xA則進(jìn)入/保持AX Read模式(就是Continuous Read),否則不進(jìn)入/退出。

 

2.4 華邦W25QxxJV-DTR系列

MODE子序列里參數(shù)值M[5:4] = 2'b10則進(jìn)入/保持Continuous Read模式(有的型號(hào)上也叫Read Command Bypass Mode,比如W25QxxJW-DTR),否則不進(jìn)入/退出。如果要退出Continuous Read模式,F(xiàn)lash數(shù)據(jù)手冊(cè)里特別推薦下一次時(shí)序里命令碼臨時(shí)設(shè)為0xFF,以保證M4=1使得Flash徹底回到Non-Continuous Read模式。

Note: 華邦Flash型號(hào)絲印后綴為IQ,則不支持Continuous Read模式;為IM則支持。

 

2.5 兆易創(chuàng)新GD25Q系列

MODE子序列里參數(shù)值M[5:4] = 2'b10則進(jìn)入/保持Continuous Read模式,否則不進(jìn)入/退出。

 

三、在i.MXRT1170-EVK上實(shí)戰(zhàn)(IS25WP128)

了解了上面關(guān)于Continuous read模式知識(shí)后,我們?cè)?a class="article-link" target="_blank" href="/manufacturer/1000215/">恩智浦i.MXRT1170-EVK板子上實(shí)踐一下。默認(rèn)連接的Flash是IS25WP128,這款Flash是支持Continuous read模式的,我們隨便在SDK包里找一個(gè)XIP例程,修改工程里 evkmimxrt1170_flexspi_nor_config.c 文件里的 FDCB 啟動(dòng)頭如下(主要就是改LUT表),改完下載程序進(jìn)Flash運(yùn)行,代碼執(zhí)行效率應(yīng)該會(huì)有所提升(等下一篇QPI模式文章寫(xiě)完,痞子衡會(huì)設(shè)計(jì)一個(gè)用例一起來(lái)實(shí)測(cè)下性能)。

const flexspi_nor_config_t qspiflash_config_100mhz_sdr_cont = {
    .memConfig =
        {
            .tag              = FLEXSPI_CFG_BLK_TAG,
            .version          = FLEXSPI_CFG_BLK_VERSION,
            .readSampleClkSrc = kFlexSPIReadSampleClk_LoopbackFromDqsPad,
            .csHoldTime       = 3u,
            .csSetupTime      = 3u,
            // Enable Safe configuration
            .controllerMiscOption = 0x10,
            .deviceType           = kFlexSpiDeviceType_SerialNOR,
            .sflashPadType        = kSerialFlash_4Pads,
            .serialClkFreq        = kFlexSpiSerialClk_100MHz,
            .sflashA1Size         = 16u * 1024u * 1024u,
            .lookupTable =
                {
                    // Fast Read Quad I/O LUTs
                    [4*CMD_LUT_SEQ_IDX_READ + 0] = FLEXSPI_LUT_SEQ(CMD_SDR,   FLEXSPI_1PAD, 0xEB, RADDR_SDR, FLEXSPI_4PAD, 0x18),
                                                                   // MODE8_SDR里參數(shù)值填入0xA0
                    [4*CMD_LUT_SEQ_IDX_READ + 1] = FLEXSPI_LUT_SEQ(MODE8_SDR, FLEXSPI_4PAD, 0xA0, DUMMY_SDR, FLEXSPI_4PAD, 0x04),
                                                                                                  // 增加JMP_ON_CS子序列
                    [4*CMD_LUT_SEQ_IDX_READ + 2] = FLEXSPI_LUT_SEQ(READ_SDR,  FLEXSPI_4PAD, 0x04, JMP_ON_CS, FLEXSPI_1PAD, 0x01),
                    [4*CMD_LUT_SEQ_IDX_READ + 3] = FLEXSPI_LUT_SEQ(STOP,      FLEXSPI_1PAD, 0x00, 0, 0, 0),
                },
        },
    .pageSize           = 256u,
    .sectorSize         = 4u * 1024u,
    .blockSize          = 256u * 1024u,
    .isUniformBlockSize = false,
};

至此,在FDCB里使能串行NOR Flash的Continuous read模式痞子衡便介紹完畢了,掌聲在哪里~~~

相關(guān)推薦

電子產(chǎn)業(yè)圖譜

碩士畢業(yè)于蘇州大學(xué)電子信息學(xué)院,目前就職于恩智浦(NXP)半導(dǎo)體MCU系統(tǒng)部門(mén),擔(dān)任嵌入式系統(tǒng)應(yīng)用工程師。痞子衡會(huì)定期分享嵌入式相關(guān)文章