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

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

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

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

[復(fù)制鏈接]

302

主題

307

帖子

1896

積分

三級會(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讀訪問情形。7 z( l1 t9 E. {+ S/ t
上一篇文章 《i.MXRT中FlexSPI外設(shè)對AHB Burst Read特性的支持》 里痞子衡介紹了FlexSPI外設(shè)在不開啟Prefetch功能下響應(yīng)AHB master的訪問請求完全受AHB總線Burst Read特性決定,這是FlexSPI外設(shè)最基礎(chǔ)的對Flash訪問支持功能,研究這個(gè)其實(shí)是很有意義的,這可以反映出XiP下最原始的代碼執(zhí)行效率。
' i, ~: M: ^, Y; g/ L我們知道在實(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訪問):& U/ c: O  @8 {4 K
一、實(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; l9 j7 l2 F. N! Q
const flexspi_nor_config_t qspiflash_config = {0 y( |# e& a4 w5 q2 Y% y
    .memconfig =4 [/ @* s+ k1 @3 o. r! F8 E  x
        {
6 j/ Q0 }" N$ ]* q            .tag              = FLEXSPI_CFG_BLK_TAG,! _4 z% S8 n( Q% T" y7 l3 a: o
            .version          = FLEXSPI_CFG_BLK_VERSION,
# O, W7 t4 W* Q7 G/ o6 `" l" w( C, u            .readSampleClkSrc = kFlexSPIReadSampleClk_LoopbackFromDqsPad,, A* B0 l0 j7 @1 Y
            .csHoldTime       = 3u,
' P) [7 s$ N: r5 t9 z            .csSetupTime      = 3u,
! r) C- B1 u2 H& R0 W            .controllerMiscOption = 0x10,
- g7 x- K7 }6 p            .deviceType       = kFlexSpiDeviceType_SerialNOR,7 D8 [0 z8 Z% b& N4 O
            .sflashPadType    = kSerialFlash_4pads,3 P! F% c5 e0 [. _
            // Flash工作于30MHz
0 y' c( ^" a: j6 C" U# l. [/ f9 p            .serialClkFreq    = kFlexSpiSerialClk_30MHz,4 ^5 j! P' Z7 ?* W5 q
            .sflashA1Size     = 8u * 1024u * 1024u,
% R" J0 ]6 H  l, n' p            .lookupTable =' ^. |# L. c% p5 R5 m* g
                {
' M) K! Z, N" f, A- K) ~# F                    // Quad I/O Fast Read SDR LUTs
* K1 }2 i$ }, p& K9 i9 T                    [4*CMD_LUT_SEQ_IDX_READ + 0] = FLEXSPI_LUT_SEQ(CMD_SDR,   FLEXSPI_1PAD, 0xEB, RADDR_SDR, FLEXSPI_4PAD, 0x18),% {3 G1 ~; Y2 [" e- t: j, h% r" x
                    [4*CMD_LUT_SEQ_IDX_READ + 1] = FLEXSPI_LUT_SEQ(MODE8_SDR, FLEXSPI_4PAD, 0xF0, DUMMY_SDR, FLEXSPI_4PAD, 0x04),/ `( R" C: ~- o3 X9 t
                    [4*CMD_LUT_SEQ_IDX_READ + 2] = FLEXSPI_LUT_SEQ(READ_SDR,  FLEXSPI_4PAD, 0x04, STOP,      FLEXSPI_1PAD, 0x00),, _; _$ E" D/ H1 h8 v% Z+ I# C( @. P
                    [4*CMD_LUT_SEQ_IDX_READ + 3] = 0,0 p5 [0 d. p, w. f  |$ w
                },
/ s3 U/ v+ L3 T4 {        },3 P1 K/ G: y) P. u0 _7 {
    .pageSize           = 256u,
; s7 k9 R2 J% i    .sectorSize         = 4u * 1024u,  `0 s3 G7 l- i0 }9 h" f: `0 i
    .blockSize          = 64u * 1024u,! E# g& E# H* x5 b  q
    .isUniformBlockSize = false,; N+ y/ a4 q+ P$ u
};
3 Q. y& \/ I3 e# C8 x# }. l下圖是華邦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 返回頂部 返回列表