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

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

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

無(wú)緩存下對(duì)Flash的AHB讀訪(fǎng)問(wèn)竟然是這樣!

[復(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)波形來(lái)看i.MXRT的FlexSPI外設(shè)下AHB讀訪(fǎng)問(wèn)情形。
1 f; J% D, y0 L% D5 K上一篇文章 《i.MXRT中FlexSPI外設(shè)對(duì)AHB Burst Read特性的支持》 里痞子衡介紹了FlexSPI外設(shè)在不開(kāi)啟Prefetch功能下響應(yīng)AHB master的訪(fǎng)問(wèn)請(qǐng)求完全受AHB總線(xiàn)Burst Read特性決定,這是FlexSPI外設(shè)最基礎(chǔ)的對(duì)Flash訪(fǎng)問(wèn)支持功能,研究這個(gè)其實(shí)是很有意義的,這可以反映出XiP下最原始的代碼執(zhí)行效率。
# S  N) d( @) z# |" J2 {我們知道在實(shí)際項(xiàng)目中,XiP應(yīng)用程序常常是在L1 Cache和Prefetch加持下運(yùn)行的,代碼執(zhí)行效率會(huì)得到大大提升,但無(wú)論是怎樣的緩存策略,極限情況下(比如大數(shù)據(jù)塊搬移,長(zhǎng)跳轉(zhuǎn)指令)最終還是拼得FlexSPI最基礎(chǔ)的讀訪(fǎng)問(wèn)支持。今天痞子衡就從抓Flash信號(hào)波形角度帶大家真切感受下這最基礎(chǔ)的AHB讀訪(fǎng)問(wèn)情形(為更清晰地分析結(jié)果,本次主要涉及數(shù)據(jù)總線(xiàn)AHB訪(fǎng)問(wèn),暫不涉及指令總線(xiàn)AHB訪(fǎng)問(wèn)):: s  z+ D( f% S; \+ I1 ?! E0 l
一、實(shí)驗(yàn)準(zhǔn)備痞子衡用i.MXRT1050-EVKB來(lái)做這個(gè)AHB讀訪(fǎng)問(wèn)實(shí)驗(yàn),這塊板子上的Flash被痞子衡更換過(guò),目前的型號(hào)是華邦W25Q64JWS-IQ。我們基于 \SDK_2.9.1_EVKB-IMXRT1050\boards\evkbimxrt1050\demo_apps\led_blinky\iar 例程(記得切換到 flexspi_nor_debug build)來(lái)簡(jiǎn)單修改一下,把啟動(dòng)頭FDCB修改如下,設(shè)置Flash工作于30MHz Fast Read Quad I/O SDR模式,調(diào)成30MHz低速是為了方便后續(xù)用示波器抓Flash信號(hào)去分析。9 t1 n: v5 v# W' N
const flexspi_nor_config_t qspiflash_config = {
9 c% @6 R5 \* e4 T2 `6 p$ ?    .memconfig =
+ u$ B% T0 s4 g) ^7 [- v2 y# P: q9 \        {
! |# l! E5 `( n9 J  E" d! Z( F4 }  x            .tag              = FLEXSPI_CFG_BLK_TAG,
" J+ \1 v! c: |+ \7 E" w+ O            .version          = FLEXSPI_CFG_BLK_VERSION,2 B$ Y" |/ |' l( Z+ \, W4 H
            .readSampleClkSrc = kFlexSPIReadSampleClk_LoopbackFromDqsPad,: S/ R/ n! ]. \4 L) q
            .csHoldTime       = 3u,
. u4 [& K4 A- a$ y            .csSetupTime      = 3u,/ q- Q* h. t& C
            .controllerMiscOption = 0x10,
3 D2 t, @, J/ o9 D# s6 M% k            .deviceType       = kFlexSpiDeviceType_SerialNOR,( ?! i2 E- B# C! ]" p% Y
            .sflashPadType    = kSerialFlash_4pads,
2 Y" Z1 |. T$ M+ K; T/ E            // Flash工作于30MHz
2 @$ ?% G2 \& X' t, ?% u            .serialClkFreq    = kFlexSpiSerialClk_30MHz,& u7 x5 D7 q6 m5 M& Z: a, K
            .sflashA1Size     = 8u * 1024u * 1024u,
- i0 ~5 t2 g, C# v            .lookupTable =. z$ l& `  o: b- W' C3 E
                {
1 s; A! \9 r8 T                    // Quad I/O Fast Read SDR LUTs! [. w/ h) o; f& W
                    [4*CMD_LUT_SEQ_IDX_READ + 0] = FLEXSPI_LUT_SEQ(CMD_SDR,   FLEXSPI_1PAD, 0xEB, RADDR_SDR, FLEXSPI_4PAD, 0x18),  {2 Q5 v8 y4 D" K# {$ C
                    [4*CMD_LUT_SEQ_IDX_READ + 1] = FLEXSPI_LUT_SEQ(MODE8_SDR, FLEXSPI_4PAD, 0xF0, DUMMY_SDR, FLEXSPI_4PAD, 0x04),; i4 X  Y2 H4 `# L- l. F* s
                    [4*CMD_LUT_SEQ_IDX_READ + 2] = FLEXSPI_LUT_SEQ(READ_SDR,  FLEXSPI_4PAD, 0x04, STOP,      FLEXSPI_1PAD, 0x00),
8 {6 A5 ]9 X& \$ m. S( C                    [4*CMD_LUT_SEQ_IDX_READ + 3] = 0,3 I/ M  m  X- a- i- c: [/ {
                },
. m- X( c" S9 x1 U        },  d. N, n4 [9 Y5 I
    .pageSize           = 256u,
; K, w& [3 V/ {" P    .sectorSize         = 4u * 1024u,+ Z! I9 f9 I1 t! ~( E" D
    .blockSize          = 64u * 1024u,& C8 a3 j) S& i4 m! Y$ T- `3 U5 N
    .isUniformBlockSize = false,/ Z8 J0 }$ D' [# Q0 @. p3 k$ v( M
};8 B. ?9 S9 ?4 |; K" i5 p8 h9 M  T
下圖是華邦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 返回頂部 返回列表