大家好,我是痞子衡,是正經(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)頭是符合要求的。 |