|
大家好,我是痞子衡,是正經(jīng)搞技術(shù)的痞子。今天痞子衡給大家介紹的是實抓Flash信號波形來看i.MXRT的FlexSPI外設(shè)下AHB讀訪問情形。" } R1 o3 _) `, w- L
上一篇文章 《i.MXRT中FlexSPI外設(shè)對AHB Burst Read特性的支持》 里痞子衡介紹了FlexSPI外設(shè)在不開啟Prefetch功能下響應(yīng)AHB master的訪問請求完全受AHB總線Burst Read特性決定,這是FlexSPI外設(shè)最基礎(chǔ)的對Flash訪問支持功能,研究這個其實是很有意義的,這可以反映出XiP下最原始的代碼執(zhí)行效率。3 O) F- W5 u* i! ~ T8 ^: x4 c
我們知道在實際項目中,XiP應(yīng)用程序常常是在L1 Cache和Prefetch加持下運行的,代碼執(zhí)行效率會得到大大提升,但無論是怎樣的緩存策略,極限情況下(比如大數(shù)據(jù)塊搬移,長跳轉(zhuǎn)指令)最終還是拼得FlexSPI最基礎(chǔ)的讀訪問支持。今天痞子衡就從抓Flash信號波形角度帶大家真切感受下這最基礎(chǔ)的AHB讀訪問情形(為更清晰地分析結(jié)果,本次主要涉及數(shù)據(jù)總線AHB訪問,暫不涉及指令總線AHB訪問):/ ^! c7 H8 H8 a/ v& g
一、實驗準備痞子衡用i.MXRT1050-EVKB來做這個AHB讀訪問實驗,這塊板子上的Flash被痞子衡更換過,目前的型號是華邦W25Q64JWS-IQ。我們基于 \SDK_2.9.1_EVKB-IMXRT1050\boards\evkbimxrt1050\demo_apps\led_blinky\iar 例程(記得切換到 flexspi_nor_debug build)來簡單修改一下,把啟動頭FDCB修改如下,設(shè)置Flash工作于30MHz Fast Read Quad I/O SDR模式,調(diào)成30MHz低速是為了方便后續(xù)用示波器抓Flash信號去分析。 d: x. H' Y) b. U n2 p4 u2 m
const flexspi_nor_config_t qspiflash_config = {$ B F! [! y! G3 ]* I, k/ R
.memconfig =
2 d# W2 S4 m. y& f. `& { {! V+ K z0 K, l, a! }4 K" ]8 W$ L. x
.tag = FLEXSPI_CFG_BLK_TAG,
K( f( c+ a9 J .version = FLEXSPI_CFG_BLK_VERSION,9 ?4 n! `( \4 E$ w
.readSampleClkSrc = kFlexSPIReadSampleClk_LoopbackFromDqsPad,( `/ O% [) G" K, G
.csHoldTime = 3u,7 P- I# ~) ?5 V2 l/ S; |- V E
.csSetupTime = 3u,/ C& T. r# S! s% P
.controllerMiscOption = 0x10,
' N. a5 J, v, A .deviceType = kFlexSpiDeviceType_SerialNOR,
% |3 O& X7 p- ~4 R. t .sflashPadType = kSerialFlash_4pads,
5 j7 @. V9 c0 ~' k7 @" ? ? // Flash工作于30MHz
- X) b- b% n- b* ]5 v .serialClkFreq = kFlexSpiSerialClk_30MHz,$ W- X4 S ]6 u0 ~. a( ~' @
.sflashA1Size = 8u * 1024u * 1024u," i7 O5 h& R2 l5 R
.lookupTable =9 }! {% H" d' {
{6 y0 @ F# [" J7 W
// Quad I/O Fast Read SDR LUTs; q* x5 s" H, C0 u
[4*CMD_LUT_SEQ_IDX_READ + 0] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xEB, RADDR_SDR, FLEXSPI_4PAD, 0x18),
! j2 k6 [ d x, Q [4*CMD_LUT_SEQ_IDX_READ + 1] = FLEXSPI_LUT_SEQ(MODE8_SDR, FLEXSPI_4PAD, 0xF0, DUMMY_SDR, FLEXSPI_4PAD, 0x04),1 b5 t$ B7 H n
[4*CMD_LUT_SEQ_IDX_READ + 2] = FLEXSPI_LUT_SEQ(READ_SDR, FLEXSPI_4PAD, 0x04, STOP, FLEXSPI_1PAD, 0x00),3 C+ T! n# N7 w2 r& w9 P
[4*CMD_LUT_SEQ_IDX_READ + 3] = 0,
: V4 v# b5 S. ~1 c },/ y5 l1 t% K2 T/ k/ ?: C3 L
},
# m& ^# c0 J' m' c .pageSize = 256u,7 L' T3 y6 x. _9 k2 ?5 E& S
.sectorSize = 4u * 1024u,6 M% F) x$ [+ \; v. Z) n
.blockSize = 64u * 1024u,1 _+ T% }( h9 R9 b9 S: d4 \
.isUniformBlockSize = false,
. Y5 E% Z* S9 S% R1 _( o};# l0 ?/ P+ J9 P( Y8 n W
下圖是華邦W25Q64JWS-IQ芯片的Fast Read Quad I/O SDR傳輸時序圖,Dummy Cycle連同MODE8_SDR序列一共6個SCK周期,此外還有個特別注意點,MODE8_SDR序列參數(shù)值需要被設(shè)成0xFx,我們上面修改的FDCB啟動頭是符合要求的。 |
|