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

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

搜索
查看: 114|回復(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讀訪問情形。
8 g( ]) p2 n' b" X6 O  i$ I上一篇文章 《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í)行效率。% s/ S* G9 {( d, Q! j; ]" y% _1 V5 r& t
我們知道在實(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訪問):
- d9 V0 T2 X$ i( v2 M一、實(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)去分析。0 Q4 f) s# J5 d7 W' `7 i
const flexspi_nor_config_t qspiflash_config = {6 Z* \) U5 R7 l4 o1 U$ e7 {
    .memconfig =
7 r6 ~; o$ Q1 U, [        {
/ u7 \0 J* A/ x8 W; H. X            .tag              = FLEXSPI_CFG_BLK_TAG,& M4 @6 j: J2 @  m8 V* U
            .version          = FLEXSPI_CFG_BLK_VERSION,
, r1 i- k- H% q  p5 I            .readSampleClkSrc = kFlexSPIReadSampleClk_LoopbackFromDqsPad,
0 r# w8 `* {  k6 X0 h9 D" L4 x* ~, \5 \            .csHoldTime       = 3u,' X; P* |) h8 _9 V6 A/ B" b
            .csSetupTime      = 3u,0 ~: g6 X6 l7 f( Z( [
            .controllerMiscOption = 0x10,
9 m# O% r0 P0 u            .deviceType       = kFlexSpiDeviceType_SerialNOR," K1 o, N. G7 |3 B% y, z6 X
            .sflashPadType    = kSerialFlash_4pads,( Y+ q3 q4 e9 r2 \  G
            // Flash工作于30MHz: O. ^/ h  g' r5 n. U& b, p2 t
            .serialClkFreq    = kFlexSpiSerialClk_30MHz,* }% p7 `. v5 N5 \, u, B
            .sflashA1Size     = 8u * 1024u * 1024u,
/ ^4 l( J) U$ c; O. R$ L/ h            .lookupTable =
# }8 W6 |9 O4 ~; ]  `6 G                {
! F: q; O  j$ c9 ~$ x" ?9 }2 }                    // Quad I/O Fast Read SDR LUTs3 T# c/ D/ s, P
                    [4*CMD_LUT_SEQ_IDX_READ + 0] = FLEXSPI_LUT_SEQ(CMD_SDR,   FLEXSPI_1PAD, 0xEB, RADDR_SDR, FLEXSPI_4PAD, 0x18),
2 r# P  b9 l2 h2 u                    [4*CMD_LUT_SEQ_IDX_READ + 1] = FLEXSPI_LUT_SEQ(MODE8_SDR, FLEXSPI_4PAD, 0xF0, DUMMY_SDR, FLEXSPI_4PAD, 0x04),, ~; e7 e. d  U; [) e9 |
                    [4*CMD_LUT_SEQ_IDX_READ + 2] = FLEXSPI_LUT_SEQ(READ_SDR,  FLEXSPI_4PAD, 0x04, STOP,      FLEXSPI_1PAD, 0x00),
$ g8 S- m+ F( Q% @3 b. q                    [4*CMD_LUT_SEQ_IDX_READ + 3] = 0,
9 }8 J6 d0 T* Y* S- S                },
# H  n/ {9 q$ i! Y/ M6 T7 ]        },- r' U4 J/ N- H
    .pageSize           = 256u,* g; {$ Q2 f  ^
    .sectorSize         = 4u * 1024u,/ L4 U+ Z8 r" q; h# v
    .blockSize          = 64u * 1024u,# z) O! l& B) K2 z/ Q' y5 Q
    .isUniformBlockSize = false,1 ?( _5 F! H8 N/ \
};
! Q; Y2 g) M' O: k/ y下圖是華邦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 返回頂部 返回列表