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

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

搜索
查看: 110|回復(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讀訪問情形。2 E, M) Z, r; z
上一篇文章 《i.MXRT中FlexSPI外設(shè)對AHB Burst Read特性的支持》 里痞子衡介紹了FlexSPI外設(shè)在不開啟Prefetch功能下響應(yīng)AHB master的訪問請求完全受AHB總線Burst Read特性決定,這是FlexSPI外設(shè)最基礎(chǔ)的對Flash訪問支持功能,研究這個其實是很有意義的,這可以反映出XiP下最原始的代碼執(zhí)行效率。# u* h  M& k- O& `, b
我們知道在實際項目中,XiP應(yīng)用程序常常是在L1 Cache和Prefetch加持下運行的,代碼執(zhí)行效率會得到大大提升,但無論是怎樣的緩存策略,極限情況下(比如大數(shù)據(jù)塊搬移,長跳轉(zhuǎn)指令)最終還是拼得FlexSPI最基礎(chǔ)的讀訪問支持。今天痞子衡就從抓Flash信號波形角度帶大家真切感受下這最基礎(chǔ)的AHB讀訪問情形(為更清晰地分析結(jié)果,本次主要涉及數(shù)據(jù)總線AHB訪問,暫不涉及指令總線AHB訪問):
+ z0 {) s9 R% I+ g7 m一、實驗準(zhǔn)備痞子衡用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信號去分析。9 l$ X# y6 N; Y% m
const flexspi_nor_config_t qspiflash_config = {
$ b  F- d% o& f    .memconfig =
& v4 J& ?+ |# B4 x. l        {* G  g- o* x+ }
            .tag              = FLEXSPI_CFG_BLK_TAG,
( m3 i! x. b" z0 J* b- d: |( q9 z            .version          = FLEXSPI_CFG_BLK_VERSION,
+ W0 j# k+ d2 _6 M; M6 L            .readSampleClkSrc = kFlexSPIReadSampleClk_LoopbackFromDqsPad,
$ U2 W/ E/ Y2 d2 L: O            .csHoldTime       = 3u,5 a- O+ W/ g; A( }& J7 u5 @2 ~; p
            .csSetupTime      = 3u,
2 D% g( {3 H' [& c# I$ w            .controllerMiscOption = 0x10,+ }, r! e0 \8 X9 Y
            .deviceType       = kFlexSpiDeviceType_SerialNOR,+ Z, Y4 Q8 }4 s" \
            .sflashPadType    = kSerialFlash_4pads,3 f; n- |$ j* j# k
            // Flash工作于30MHz2 j& _! g& q3 Q- V# e& \
            .serialClkFreq    = kFlexSpiSerialClk_30MHz,
- t$ W  b* I  M/ B' _9 E5 T/ U) P            .sflashA1Size     = 8u * 1024u * 1024u,
7 k  q1 H5 u/ l! h' v* a            .lookupTable =
7 z- M6 t/ [! A/ O+ a  I, {                {! Z0 L2 i% V9 @, u
                    // Quad I/O Fast Read SDR LUTs
6 @! @6 Q" J/ X6 d3 v                    [4*CMD_LUT_SEQ_IDX_READ + 0] = FLEXSPI_LUT_SEQ(CMD_SDR,   FLEXSPI_1PAD, 0xEB, RADDR_SDR, FLEXSPI_4PAD, 0x18),. x7 z  u0 w$ U7 a
                    [4*CMD_LUT_SEQ_IDX_READ + 1] = FLEXSPI_LUT_SEQ(MODE8_SDR, FLEXSPI_4PAD, 0xF0, DUMMY_SDR, FLEXSPI_4PAD, 0x04),
. I5 y# q- y( `5 t# L                    [4*CMD_LUT_SEQ_IDX_READ + 2] = FLEXSPI_LUT_SEQ(READ_SDR,  FLEXSPI_4PAD, 0x04, STOP,      FLEXSPI_1PAD, 0x00),, d5 K, ^) \, `$ ^/ y3 \$ g
                    [4*CMD_LUT_SEQ_IDX_READ + 3] = 0,
3 t% _! B( |) ^' o. I                },
8 f3 W% G6 e6 z4 K( r- t2 q        },2 o* ?: g3 J% W; P
    .pageSize           = 256u,& U% y% o+ B9 E* E) V) J* S4 W
    .sectorSize         = 4u * 1024u,
$ s/ H3 O. G$ h/ Q% C/ G    .blockSize          = 64u * 1024u,
: ^/ B1 K: F/ ]) P% ]  K5 v    .isUniformBlockSize = false,
" F; [. i$ q: y) e9 A0 \/ ^};0 V, C' A" y: e+ Z4 q1 X8 r
下圖是華邦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 返回頂部 返回列表