電子產(chǎn)業(yè)一站式賦能平臺

PCB聯(lián)盟網(wǎng)

搜索
查看: 52|回復(fù): 0
收起左側(cè)

無緩存下對Flash的AHB讀訪問竟然是這樣!

[復(fù)制鏈接]

302

主題

307

帖子

1896

積分

三級會員

Rank: 3Rank: 3

積分
1896
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2021-4-30 23:44:00 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
大家好,我是痞子衡,是正經(jīng)搞技術(shù)的痞子。今天痞子衡給大家介紹的是實抓Flash信號波形來看i.MXRT的FlexSPI外設(shè)下AHB讀訪問情形。" }  R1 o3 _) `, w- L
上一篇文章 《i.MXRT中FlexSPI外設(shè)對AHB Burst Read特性的支持》 里痞子衡介紹了FlexSPI外設(shè)在不開啟Prefetch功能下響應(yīng)AHB master的訪問請求完全受AHB總線Burst Read特性決定,這是FlexSPI外設(shè)最基礎(chǔ)的對Flash訪問支持功能,研究這個其實是很有意義的,這可以反映出XiP下最原始的代碼執(zhí)行效率。3 O) F- W5 u* i! ~  T8 ^: x4 c
我們知道在實際項目中,XiP應(yīng)用程序常常是在L1 Cache和Prefetch加持下運行的,代碼執(zhí)行效率會得到大大提升,但無論是怎樣的緩存策略,極限情況下(比如大數(shù)據(jù)塊搬移,長跳轉(zhuǎn)指令)最終還是拼得FlexSPI最基礎(chǔ)的讀訪問支持。今天痞子衡就從抓Flash信號波形角度帶大家真切感受下這最基礎(chǔ)的AHB讀訪問情形(為更清晰地分析結(jié)果,本次主要涉及數(shù)據(jù)總線AHB訪問,暫不涉及指令總線AHB訪問):/ ^! c7 H8 H8 a/ v& g
一、實驗準備痞子衡用i.MXRT1050-EVKB來做這個AHB讀訪問實驗,這塊板子上的Flash被痞子衡更換過,目前的型號是華邦W25Q64JWS-IQ。我們基于 \SDK_2.9.1_EVKB-IMXRT1050\boards\evkbimxrt1050\demo_apps\led_blinky\iar 例程(記得切換到 flexspi_nor_debug build)來簡單修改一下,把啟動頭FDCB修改如下,設(shè)置Flash工作于30MHz Fast Read Quad I/O SDR模式,調(diào)成30MHz低速是為了方便后續(xù)用示波器抓Flash信號去分析。  d: x. H' Y) b. U  n2 p4 u2 m
const flexspi_nor_config_t qspiflash_config = {$ B  F! [! y! G3 ]* I, k/ R
    .memconfig =
2 d# W2 S4 m. y& f. `& {        {! V+ K  z0 K, l, a! }4 K" ]8 W$ L. x
            .tag              = FLEXSPI_CFG_BLK_TAG,
  K( f( c+ a9 J            .version          = FLEXSPI_CFG_BLK_VERSION,9 ?4 n! `( \4 E$ w
            .readSampleClkSrc = kFlexSPIReadSampleClk_LoopbackFromDqsPad,( `/ O% [) G" K, G
            .csHoldTime       = 3u,7 P- I# ~) ?5 V2 l/ S; |- V  E
            .csSetupTime      = 3u,/ C& T. r# S! s% P
            .controllerMiscOption = 0x10,
' N. a5 J, v, A            .deviceType       = kFlexSpiDeviceType_SerialNOR,
% |3 O& X7 p- ~4 R. t            .sflashPadType    = kSerialFlash_4pads,
5 j7 @. V9 c0 ~' k7 @" ?  ?            // Flash工作于30MHz
- X) b- b% n- b* ]5 v            .serialClkFreq    = kFlexSpiSerialClk_30MHz,$ W- X4 S  ]6 u0 ~. a( ~' @
            .sflashA1Size     = 8u * 1024u * 1024u," i7 O5 h& R2 l5 R
            .lookupTable =9 }! {% H" d' {
                {6 y0 @  F# [" J7 W
                    // Quad I/O Fast Read SDR LUTs; q* x5 s" H, C0 u
                    [4*CMD_LUT_SEQ_IDX_READ + 0] = FLEXSPI_LUT_SEQ(CMD_SDR,   FLEXSPI_1PAD, 0xEB, RADDR_SDR, FLEXSPI_4PAD, 0x18),
! j2 k6 [  d  x, Q                    [4*CMD_LUT_SEQ_IDX_READ + 1] = FLEXSPI_LUT_SEQ(MODE8_SDR, FLEXSPI_4PAD, 0xF0, DUMMY_SDR, FLEXSPI_4PAD, 0x04),1 b5 t$ B7 H  n
                    [4*CMD_LUT_SEQ_IDX_READ + 2] = FLEXSPI_LUT_SEQ(READ_SDR,  FLEXSPI_4PAD, 0x04, STOP,      FLEXSPI_1PAD, 0x00),3 C+ T! n# N7 w2 r& w9 P
                    [4*CMD_LUT_SEQ_IDX_READ + 3] = 0,
: V4 v# b5 S. ~1 c                },/ y5 l1 t% K2 T/ k/ ?: C3 L
        },
# m& ^# c0 J' m' c    .pageSize           = 256u,7 L' T3 y6 x. _9 k2 ?5 E& S
    .sectorSize         = 4u * 1024u,6 M% F) x$ [+ \; v. Z) n
    .blockSize          = 64u * 1024u,1 _+ T% }( h9 R9 b9 S: d4 \
    .isUniformBlockSize = false,
. Y5 E% Z* S9 S% R1 _( o};# l0 ?/ P+ J9 P( Y8 n  W
下圖是華邦W25Q64JWS-IQ芯片的Fast Read Quad I/O SDR傳輸時序圖,Dummy Cycle連同MODE8_SDR序列一共6個SCK周期,此外還有個特別注意點,MODE8_SDR序列參數(shù)值需要被設(shè)成0xFx,我們上面修改的FDCB啟動頭是符合要求的。
回復(fù)

使用道具 舉報

發(fā)表回復(fù)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則


聯(lián)系客服 關(guān)注微信 下載APP 返回頂部 返回列表