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

PCB聯(lián)盟網

搜索
查看: 51|回復: 0
收起左側

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

[復制鏈接]

302

主題

307

帖子

1896

積分

三級會員

Rank: 3Rank: 3

積分
1896
跳轉到指定樓層
樓主
發(fā)表于 2021-4-30 23:44:00 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是實抓Flash信號波形來看i.MXRT的FlexSPI外設下AHB讀訪問情形
, m7 b& o( @) P+ I3 B4 E  H) V* g上一篇文章 《i.MXRT中FlexSPI外設對AHB Burst Read特性的支持》 里痞子衡介紹了FlexSPI外設在不開啟Prefetch功能下響應AHB master的訪問請求完全受AHB總線Burst Read特性決定,這是FlexSPI外設最基礎的對Flash訪問支持功能,研究這個其實是很有意義的,這可以反映出XiP下最原始的代碼執(zhí)行效率。- |/ |4 n- @8 M7 X5 G9 O' U* z( ~
我們知道在實際項目中,XiP應用程序常常是在L1 Cache和Prefetch加持下運行的,代碼執(zhí)行效率會得到大大提升,但無論是怎樣的緩存策略,極限情況下(比如大數(shù)據(jù)塊搬移,長跳轉指令)最終還是拼得FlexSPI最基礎的讀訪問支持。今天痞子衡就從抓Flash信號波形角度帶大家真切感受下這最基礎的AHB讀訪問情形(為更清晰地分析結果,本次主要涉及數(shù)據(jù)總線AHB訪問,暫不涉及指令總線AHB訪問):: O$ b$ Z" u% Y; f  |: s3 v8 \
一、實驗準備痞子衡用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修改如下,設置Flash工作于30MHz Fast Read Quad I/O SDR模式,調成30MHz低速是為了方便后續(xù)用示波器抓Flash信號去分析。* }& f4 x- ~" Z, l( x% }& Y$ \
const flexspi_nor_config_t qspiflash_config = {
& M) N" M$ M6 {4 y2 m* H6 r    .memconfig =
; Q  i" q0 @! f- I0 R, N" i        {6 N7 i9 C' Q* u
            .tag              = FLEXSPI_CFG_BLK_TAG,
, t3 M* ?/ x2 y8 i2 Z; X" @            .version          = FLEXSPI_CFG_BLK_VERSION,
* k9 Q/ i8 P9 \) `( Z, u* ?5 |" a            .readSampleClkSrc = kFlexSPIReadSampleClk_LoopbackFromDqsPad,* H+ M5 g; j, T8 m: n' A
            .csHoldTime       = 3u,
1 G. a3 o: f% ]0 k5 x            .csSetupTime      = 3u,/ s, l) B/ u7 h/ d
            .controllerMiscOption = 0x10,
" d; Q9 y6 z2 s1 a7 g2 i' g            .deviceType       = kFlexSpiDeviceType_SerialNOR,
; D' o4 Y8 m6 ?7 f4 L$ u7 o            .sflashPadType    = kSerialFlash_4pads,
/ x3 V4 g1 ?! w            // Flash工作于30MHz; F/ w) X# }, W- ^; ?
            .serialClkFreq    = kFlexSpiSerialClk_30MHz,
8 M. X& d- x$ U$ [) N+ ^            .sflashA1Size     = 8u * 1024u * 1024u,$ z3 [  _( z4 Y6 H" M
            .lookupTable =
9 a2 V9 z- w7 j4 V9 d# _                {  l# S" p  R5 d
                    // Quad I/O Fast Read SDR LUTs
( `# l' E+ S" L" A- a2 U                    [4*CMD_LUT_SEQ_IDX_READ + 0] = FLEXSPI_LUT_SEQ(CMD_SDR,   FLEXSPI_1PAD, 0xEB, RADDR_SDR, FLEXSPI_4PAD, 0x18),
6 q0 C" l! ~) A+ `4 d1 R                    [4*CMD_LUT_SEQ_IDX_READ + 1] = FLEXSPI_LUT_SEQ(MODE8_SDR, FLEXSPI_4PAD, 0xF0, DUMMY_SDR, FLEXSPI_4PAD, 0x04),
* H/ ]1 W7 G0 D+ h; ^# i1 w3 t                    [4*CMD_LUT_SEQ_IDX_READ + 2] = FLEXSPI_LUT_SEQ(READ_SDR,  FLEXSPI_4PAD, 0x04, STOP,      FLEXSPI_1PAD, 0x00),
/ s: P# d6 V0 E' w$ c2 R                    [4*CMD_LUT_SEQ_IDX_READ + 3] = 0,
% R, Q5 q2 K7 v: }                },4 l3 n' C1 c! l( h& T
        },
& i* ]1 e5 n" _6 f7 d6 B    .pageSize           = 256u," ?. c7 L+ H8 u: Q. D- T% }
    .sectorSize         = 4u * 1024u,) L9 O& T3 A( ?% Y, O
    .blockSize          = 64u * 1024u,$ m7 J2 ~, r2 h
    .isUniformBlockSize = false,
2 m: A" m- @1 v  P: a9 c};) h1 L$ x" r. ^, M
下圖是華邦W25Q64JWS-IQ芯片的Fast Read Quad I/O SDR傳輸時序圖,Dummy Cycle連同MODE8_SDR序列一共6個SCK周期,此外還有個特別注意點,MODE8_SDR序列參數(shù)值需要被設成0xFx,我們上面修改的FDCB啟動頭是符合要求的。
回復

使用道具 舉報

發(fā)表回復

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

本版積分規(guī)則


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