|
大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是實抓Flash信號波形來看i.MXRT的FlexSPI外設下AHB讀訪問情形。
, m7 b& o( @) P+ I3 B4 E H) V* g上一篇文章 《i.MXRT中FlexSPI外設對AHB Burst Read特性的支持》 里痞子衡介紹了FlexSPI外設在不開啟Prefetch功能下響應AHB master的訪問請求完全受AHB總線Burst Read特性決定,這是FlexSPI外設最基礎的對Flash訪問支持功能,研究這個其實是很有意義的,這可以反映出XiP下最原始的代碼執(zhí)行效率。- |/ |4 n- @8 M7 X5 G9 O' U* z( ~
我們知道在實際項目中,XiP應用程序常常是在L1 Cache和Prefetch加持下運行的,代碼執(zhí)行效率會得到大大提升,但無論是怎樣的緩存策略,極限情況下(比如大數(shù)據(jù)塊搬移,長跳轉指令)最終還是拼得FlexSPI最基礎的讀訪問支持。今天痞子衡就從抓Flash信號波形角度帶大家真切感受下這最基礎的AHB讀訪問情形(為更清晰地分析結果,本次主要涉及數(shù)據(jù)總線AHB訪問,暫不涉及指令總線AHB訪問):: O$ b$ Z" u% Y; f |: s3 v8 \
一、實驗準備痞子衡用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修改如下,設置Flash工作于30MHz Fast Read Quad I/O SDR模式,調成30MHz低速是為了方便后續(xù)用示波器抓Flash信號去分析。* }& f4 x- ~" Z, l( x% }& Y$ \
const flexspi_nor_config_t qspiflash_config = {
& M) N" M$ M6 {4 y2 m* H6 r .memconfig =
; Q i" q0 @! f- I0 R, N" i {6 N7 i9 C' Q* u
.tag = FLEXSPI_CFG_BLK_TAG,
, t3 M* ?/ x2 y8 i2 Z; X" @ .version = FLEXSPI_CFG_BLK_VERSION,
* k9 Q/ i8 P9 \) `( Z, u* ?5 |" a .readSampleClkSrc = kFlexSPIReadSampleClk_LoopbackFromDqsPad,* H+ M5 g; j, T8 m: n' A
.csHoldTime = 3u,
1 G. a3 o: f% ]0 k5 x .csSetupTime = 3u,/ s, l) B/ u7 h/ d
.controllerMiscOption = 0x10,
" d; Q9 y6 z2 s1 a7 g2 i' g .deviceType = kFlexSpiDeviceType_SerialNOR,
; D' o4 Y8 m6 ?7 f4 L$ u7 o .sflashPadType = kSerialFlash_4pads,
/ x3 V4 g1 ?! w // Flash工作于30MHz; F/ w) X# }, W- ^; ?
.serialClkFreq = kFlexSpiSerialClk_30MHz,
8 M. X& d- x$ U$ [) N+ ^ .sflashA1Size = 8u * 1024u * 1024u,$ z3 [ _( z4 Y6 H" M
.lookupTable =
9 a2 V9 z- w7 j4 V9 d# _ { l# S" p R5 d
// Quad I/O Fast Read SDR LUTs
( `# l' E+ S" L" A- a2 U [4*CMD_LUT_SEQ_IDX_READ + 0] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xEB, RADDR_SDR, FLEXSPI_4PAD, 0x18),
6 q0 C" l! ~) A+ `4 d1 R [4*CMD_LUT_SEQ_IDX_READ + 1] = FLEXSPI_LUT_SEQ(MODE8_SDR, FLEXSPI_4PAD, 0xF0, DUMMY_SDR, FLEXSPI_4PAD, 0x04),
* H/ ]1 W7 G0 D+ h; ^# i1 w3 t [4*CMD_LUT_SEQ_IDX_READ + 2] = FLEXSPI_LUT_SEQ(READ_SDR, FLEXSPI_4PAD, 0x04, STOP, FLEXSPI_1PAD, 0x00),
/ s: P# d6 V0 E' w$ c2 R [4*CMD_LUT_SEQ_IDX_READ + 3] = 0,
% R, Q5 q2 K7 v: } },4 l3 n' C1 c! l( h& T
},
& i* ]1 e5 n" _6 f7 d6 B .pageSize = 256u," ?. c7 L+ H8 u: Q. D- T% }
.sectorSize = 4u * 1024u,) L9 O& T3 A( ?% Y, O
.blockSize = 64u * 1024u,$ m7 J2 ~, r2 h
.isUniformBlockSize = false,
2 m: A" m- @1 v P: a9 c};) h1 L$ x" r. ^, M
下圖是華邦W25Q64JWS-IQ芯片的Fast Read Quad I/O SDR傳輸時序圖,Dummy Cycle連同MODE8_SDR序列一共6個SCK周期,此外還有個特別注意點,MODE8_SDR序列參數(shù)值需要被設成0xFx,我們上面修改的FDCB啟動頭是符合要求的。 |
|