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

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

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

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

[復(fù)制鏈接]

281

主題

286

帖子

1632

積分

三級(jí)會(huì)員

Rank: 3Rank: 3

積分
1632
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2021-4-30 23:44:00 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
大家好,我是痞子衡,是正經(jīng)搞技術(shù)的痞子。今天痞子衡給大家介紹的是實(shí)抓Flash信號(hào)波形來看i.MXRT的FlexSPI外設(shè)下AHB讀訪問情形。
) O3 X3 {# q; T. e上一篇文章 《i.MXRT中FlexSPI外設(shè)對(duì)AHB Burst Read特性的支持》 里痞子衡介紹了FlexSPI外設(shè)在不開啟Prefetch功能下響應(yīng)AHB master的訪問請(qǐng)求完全受AHB總線Burst Read特性決定,這是FlexSPI外設(shè)最基礎(chǔ)的對(duì)Flash訪問支持功能,研究這個(gè)其實(shí)是很有意義的,這可以反映出XiP下最原始的代碼執(zhí)行效率。
- m, V/ a4 ]* _& \& `2 Z; h+ ]我們知道在實(shí)際項(xiàng)目中,XiP應(yīng)用程序常常是在L1 Cache和Prefetch加持下運(yùn)行的,代碼執(zhí)行效率會(huì)得到大大提升,但無論是怎樣的緩存策略,極限情況下(比如大數(shù)據(jù)塊搬移,長跳轉(zhuǎn)指令)最終還是拼得FlexSPI最基礎(chǔ)的讀訪問支持。今天痞子衡就從抓Flash信號(hào)波形角度帶大家真切感受下這最基礎(chǔ)的AHB讀訪問情形(為更清晰地分析結(jié)果,本次主要涉及數(shù)據(jù)總線AHB訪問,暫不涉及指令總線AHB訪問):
) q' B, C; O6 A, k4 |  X: c8 R一、實(shí)驗(yàn)準(zhǔn)備痞子衡用i.MXRT1050-EVKB來做這個(gè)AHB讀訪問實(shí)驗(yàn),這塊板子上的Flash被痞子衡更換過,目前的型號(hào)是華邦W25Q64JWS-IQ。我們基于 \SDK_2.9.1_EVKB-IMXRT1050\boards\evkbimxrt1050\demo_apps\led_blinky\iar 例程(記得切換到 flexspi_nor_debug build)來簡單修改一下,把啟動(dòng)頭FDCB修改如下,設(shè)置Flash工作于30MHz Fast Read Quad I/O SDR模式,調(diào)成30MHz低速是為了方便后續(xù)用示波器抓Flash信號(hào)去分析。
/ V+ R& P( I# x# b( fconst flexspi_nor_config_t qspiflash_config = {
, E9 Q4 e, ?* N7 x% m    .memconfig =+ ?8 \' D9 F6 M) Q4 B
        {5 U/ t' H# ]! {0 b
            .tag              = FLEXSPI_CFG_BLK_TAG,
& s. y/ j1 n2 g0 j/ K. I            .version          = FLEXSPI_CFG_BLK_VERSION,$ m7 c8 U" r7 I. `4 `, e
            .readSampleClkSrc = kFlexSPIReadSampleClk_LoopbackFromDqsPad,
  K" T2 _3 t8 _' q, v' d5 Y            .csHoldTime       = 3u,
) {$ z, `0 I2 o& i4 X4 L9 W            .csSetupTime      = 3u,9 ]2 N5 G! `1 b* c) E
            .controllerMiscOption = 0x10,
! Y* Q( P7 D( @            .deviceType       = kFlexSpiDeviceType_SerialNOR,
5 E7 e- r% k" [& f9 k            .sflashPadType    = kSerialFlash_4pads,9 u/ Q% S9 ^% }! Y* u* [, L7 N
            // Flash工作于30MHz
5 r7 m4 i8 N: x0 m' Q            .serialClkFreq    = kFlexSpiSerialClk_30MHz,# d9 y8 O$ B. [
            .sflashA1Size     = 8u * 1024u * 1024u,* L$ k# @' U8 r
            .lookupTable =
8 z/ e8 w/ a/ p+ a9 h& c2 s                {+ ~2 K) M+ v) @- i% h9 t
                    // Quad I/O Fast Read SDR LUTs! v% T: F# s) P) X* K  o
                    [4*CMD_LUT_SEQ_IDX_READ + 0] = FLEXSPI_LUT_SEQ(CMD_SDR,   FLEXSPI_1PAD, 0xEB, RADDR_SDR, FLEXSPI_4PAD, 0x18),) k( i1 E$ v8 [0 V9 A+ o3 y
                    [4*CMD_LUT_SEQ_IDX_READ + 1] = FLEXSPI_LUT_SEQ(MODE8_SDR, FLEXSPI_4PAD, 0xF0, DUMMY_SDR, FLEXSPI_4PAD, 0x04),
& B8 ]9 A% c3 m5 _7 v, X                    [4*CMD_LUT_SEQ_IDX_READ + 2] = FLEXSPI_LUT_SEQ(READ_SDR,  FLEXSPI_4PAD, 0x04, STOP,      FLEXSPI_1PAD, 0x00),. b3 s* s5 d/ N
                    [4*CMD_LUT_SEQ_IDX_READ + 3] = 0,5 h9 j. z- v- H) k8 \8 }% Y2 ]
                },
3 w$ r3 k0 j; m( _- c9 m        },
' F. _& u" e' ~; z$ _; ]% w    .pageSize           = 256u,' b4 V' e9 C7 g1 M% i& f( e
    .sectorSize         = 4u * 1024u,
+ e' S' |. t6 Y% [% r2 d    .blockSize          = 64u * 1024u,
& U( o7 t$ i: F% n) ~    .isUniformBlockSize = false,, \. k! K$ g6 B5 ?; H
};) C9 ]5 ]) J, r' x4 l! b% i
下圖是華邦W25Q64JWS-IQ芯片的Fast Read Quad I/O SDR傳輸時(shí)序圖,Dummy Cycle連同MODE8_SDR序列一共6個(gè)SCK周期,此外還有個(gè)特別注意點(diǎn),MODE8_SDR序列參數(shù)值需要被設(shè)成0xFx,我們上面修改的FDCB啟動(dòng)頭是符合要求的。

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

本版積分規(guī)則


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