|
大家好,我是痞子衡,是正經(jīng)搞技術(shù)的痞子。今天痞子衡給大家介紹的是實(shí)抓Flash信號(hào)波形來看i.MXRT的FlexSPI外設(shè)下AHB讀訪問情形。
7 e. h* R( U- C" U0 w上一篇文章 《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í)行效率。
) L9 d# x% ^# f. q7 j* ~我們知道在實(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訪問):
! k2 M) g% z3 _- i% ?, h一、實(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)去分析。
^1 ~0 K6 B& ]/ [7 P+ sconst flexspi_nor_config_t qspiflash_config = {; y1 ~! `9 X9 ^3 f* J
.memconfig =+ k4 B9 ?0 E7 M* E2 }3 ^
{
6 ?( h' Q: S* L9 {2 \$ Z .tag = FLEXSPI_CFG_BLK_TAG,# f c' i2 H2 J1 l b2 G
.version = FLEXSPI_CFG_BLK_VERSION,; }- f5 f' \6 u9 T1 h1 W5 D8 J
.readSampleClkSrc = kFlexSPIReadSampleClk_LoopbackFromDqsPad,
4 u+ q: ^: `; s# `, f, S .csHoldTime = 3u,, B x0 o8 T4 w. J1 E6 `1 O% ?
.csSetupTime = 3u,
' |' k3 k! v5 T0 `& |% |$ r .controllerMiscOption = 0x10,1 D! |$ W+ D; f7 I: h! F$ x
.deviceType = kFlexSpiDeviceType_SerialNOR,3 W: e9 K5 g' ~- \
.sflashPadType = kSerialFlash_4pads,8 z2 r" e5 q" P6 r6 w& M- A% N
// Flash工作于30MHz: L1 T- ]8 W' t/ i/ O4 c
.serialClkFreq = kFlexSpiSerialClk_30MHz,
! ]" L) I" g! g/ `" p( c) y .sflashA1Size = 8u * 1024u * 1024u,; a5 v8 m6 Z9 _% G
.lookupTable =5 H0 I# m* n+ [& \
{
1 E' k. G3 Y; J8 j" H7 L // Quad I/O Fast Read SDR LUTs
& c: @* K4 a% T/ _/ F5 ?, t [4*CMD_LUT_SEQ_IDX_READ + 0] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xEB, RADDR_SDR, FLEXSPI_4PAD, 0x18),' _3 ~/ a9 v' k& Q! r7 Y3 a
[4*CMD_LUT_SEQ_IDX_READ + 1] = FLEXSPI_LUT_SEQ(MODE8_SDR, FLEXSPI_4PAD, 0xF0, DUMMY_SDR, FLEXSPI_4PAD, 0x04),
" \* B7 ?" M# v% r) T8 N4 n [4*CMD_LUT_SEQ_IDX_READ + 2] = FLEXSPI_LUT_SEQ(READ_SDR, FLEXSPI_4PAD, 0x04, STOP, FLEXSPI_1PAD, 0x00),2 P- I: U) m$ B2 B! M% v1 R
[4*CMD_LUT_SEQ_IDX_READ + 3] = 0,: m7 D+ H) f) t, ?
},
" W; O* b* h& k! b. Y0 p0 A7 y },' |+ }. d3 M* Q' X$ I& @
.pageSize = 256u,
: z6 z5 N& A; k: }/ A& ] c5 m) C .sectorSize = 4u * 1024u,
2 s4 l# d; q" F .blockSize = 64u * 1024u,
2 W3 H3 _4 K" m2 P0 S .isUniformBlockSize = false,
! h; s r" l0 v' f! S' h/ F# m};/ @- I- D! ~6 t: z X' H% {& j
下圖是華邦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)頭是符合要求的。 |
|