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

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

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

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

[復(fù)制鏈接]

302

主題

307

帖子

1896

積分

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

Rank: 3Rank: 3

積分
1896
跳轉(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讀訪問情形。
$ U5 {+ G  B, W* t上一篇文章 《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í)行效率。" z' v, x, D8 x; ~" X) S
我們知道在實(shí)際項(xiàng)目中,XiP應(yīng)用程序常常是在L1 Cache和Prefetch加持下運(yùn)行的,代碼執(zhí)行效率會(huì)得到大大提升,但無論是怎樣的緩存策略,極限情況下(比如大數(shù)據(jù)塊搬移,長(zhǎng)跳轉(zhuǎn)指令)最終還是拼得FlexSPI最基礎(chǔ)的讀訪問支持。今天痞子衡就從抓Flash信號(hào)波形角度帶大家真切感受下這最基礎(chǔ)的AHB讀訪問情形(為更清晰地分析結(jié)果,本次主要涉及數(shù)據(jù)總線AHB訪問,暫不涉及指令總線AHB訪問):) W  G% c$ I5 H( N6 ^0 \
一、實(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)來簡(jiǎn)單修改一下,把啟動(dòng)頭FDCB修改如下,設(shè)置Flash工作于30MHz Fast Read Quad I/O SDR模式,調(diào)成30MHz低速是為了方便后續(xù)用示波器抓Flash信號(hào)去分析。! v# K. q" o1 J9 U$ z. `2 R
const flexspi_nor_config_t qspiflash_config = {
( R& b" M; }& ~' I, @    .memconfig =* ^% Q% w2 V4 F8 P+ a, r' j& t
        {
6 [5 K$ ~$ C% i9 j% s! n' U            .tag              = FLEXSPI_CFG_BLK_TAG,0 Y( L7 q2 j( }  \
            .version          = FLEXSPI_CFG_BLK_VERSION,
- d/ N- @9 {+ c- {9 a: O4 D            .readSampleClkSrc = kFlexSPIReadSampleClk_LoopbackFromDqsPad,
+ [% ^" G; m! F' `            .csHoldTime       = 3u,
, A- {! ?+ g3 h; M. {            .csSetupTime      = 3u,- I+ V0 Y9 i: M( ~7 I3 t
            .controllerMiscOption = 0x10,
( N0 O! D/ J. Z            .deviceType       = kFlexSpiDeviceType_SerialNOR,# Z& [: t. v( C
            .sflashPadType    = kSerialFlash_4pads,! H0 l' |% L2 z5 d; \2 ~
            // Flash工作于30MHz, Y$ l/ X& q/ |* v7 l
            .serialClkFreq    = kFlexSpiSerialClk_30MHz,. e: \3 ?- z5 W! E9 T4 W
            .sflashA1Size     = 8u * 1024u * 1024u,
; U2 q; V3 r5 ^9 X! g1 o            .lookupTable =. y3 ]0 y- H/ `& i) f
                {/ t7 Z; u1 q4 E9 T/ k2 A
                    // Quad I/O Fast Read SDR LUTs
! R1 C3 X7 L- M2 x5 f- ^5 e4 w/ @                    [4*CMD_LUT_SEQ_IDX_READ + 0] = FLEXSPI_LUT_SEQ(CMD_SDR,   FLEXSPI_1PAD, 0xEB, RADDR_SDR, FLEXSPI_4PAD, 0x18),4 `. H( H$ A" b. V1 c6 H5 l
                    [4*CMD_LUT_SEQ_IDX_READ + 1] = FLEXSPI_LUT_SEQ(MODE8_SDR, FLEXSPI_4PAD, 0xF0, DUMMY_SDR, FLEXSPI_4PAD, 0x04),
5 |# w; ^; r5 M                    [4*CMD_LUT_SEQ_IDX_READ + 2] = FLEXSPI_LUT_SEQ(READ_SDR,  FLEXSPI_4PAD, 0x04, STOP,      FLEXSPI_1PAD, 0x00),
8 h1 R7 X1 @5 z7 w4 m0 m                    [4*CMD_LUT_SEQ_IDX_READ + 3] = 0,0 W: [9 H* a! P' v+ e% G
                },
7 T& H) g6 M: L) C: e        },$ q) B% g) b) X0 L  D& r2 s! y6 a
    .pageSize           = 256u,! [. i% [1 w2 T6 N+ i
    .sectorSize         = 4u * 1024u,
7 Z) p+ l/ n! }) I9 J/ @    .blockSize          = 64u * 1024u,+ X3 k; L( C' {- f, e4 I
    .isUniformBlockSize = false,' J: c  K8 m; T4 X
};( Z& R: K! ^; h
下圖是華邦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 返回頂部 返回列表