|
大家好,我是痞子衡,是正經(jīng)搞技術(shù)的痞子。今天痞子衡給大家介紹的是實抓Flash信號波形來看i.MXRT的FlexSPI外設(shè)下AHB讀訪問情形。2 E, M) Z, r; z
上一篇文章 《i.MXRT中FlexSPI外設(shè)對AHB Burst Read特性的支持》 里痞子衡介紹了FlexSPI外設(shè)在不開啟Prefetch功能下響應(yīng)AHB master的訪問請求完全受AHB總線Burst Read特性決定,這是FlexSPI外設(shè)最基礎(chǔ)的對Flash訪問支持功能,研究這個其實是很有意義的,這可以反映出XiP下最原始的代碼執(zhí)行效率。# u* h M& k- O& `, b
我們知道在實際項目中,XiP應(yīng)用程序常常是在L1 Cache和Prefetch加持下運行的,代碼執(zhí)行效率會得到大大提升,但無論是怎樣的緩存策略,極限情況下(比如大數(shù)據(jù)塊搬移,長跳轉(zhuǎn)指令)最終還是拼得FlexSPI最基礎(chǔ)的讀訪問支持。今天痞子衡就從抓Flash信號波形角度帶大家真切感受下這最基礎(chǔ)的AHB讀訪問情形(為更清晰地分析結(jié)果,本次主要涉及數(shù)據(jù)總線AHB訪問,暫不涉及指令總線AHB訪問):
+ z0 {) s9 R% I+ g7 m一、實驗準(zhǔn)備痞子衡用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信號去分析。9 l$ X# y6 N; Y% m
const flexspi_nor_config_t qspiflash_config = {
$ b F- d% o& f .memconfig =
& v4 J& ?+ |# B4 x. l {* G g- o* x+ }
.tag = FLEXSPI_CFG_BLK_TAG,
( m3 i! x. b" z0 J* b- d: |( q9 z .version = FLEXSPI_CFG_BLK_VERSION,
+ W0 j# k+ d2 _6 M; M6 L .readSampleClkSrc = kFlexSPIReadSampleClk_LoopbackFromDqsPad,
$ U2 W/ E/ Y2 d2 L: O .csHoldTime = 3u,5 a- O+ W/ g; A( }& J7 u5 @2 ~; p
.csSetupTime = 3u,
2 D% g( {3 H' [& c# I$ w .controllerMiscOption = 0x10,+ }, r! e0 \8 X9 Y
.deviceType = kFlexSpiDeviceType_SerialNOR,+ Z, Y4 Q8 }4 s" \
.sflashPadType = kSerialFlash_4pads,3 f; n- |$ j* j# k
// Flash工作于30MHz2 j& _! g& q3 Q- V# e& \
.serialClkFreq = kFlexSpiSerialClk_30MHz,
- t$ W b* I M/ B' _9 E5 T/ U) P .sflashA1Size = 8u * 1024u * 1024u,
7 k q1 H5 u/ l! h' v* a .lookupTable =
7 z- M6 t/ [! A/ O+ a I, { {! Z0 L2 i% V9 @, u
// Quad I/O Fast Read SDR LUTs
6 @! @6 Q" J/ X6 d3 v [4*CMD_LUT_SEQ_IDX_READ + 0] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xEB, RADDR_SDR, FLEXSPI_4PAD, 0x18),. x7 z u0 w$ U7 a
[4*CMD_LUT_SEQ_IDX_READ + 1] = FLEXSPI_LUT_SEQ(MODE8_SDR, FLEXSPI_4PAD, 0xF0, DUMMY_SDR, FLEXSPI_4PAD, 0x04),
. I5 y# q- y( `5 t# L [4*CMD_LUT_SEQ_IDX_READ + 2] = FLEXSPI_LUT_SEQ(READ_SDR, FLEXSPI_4PAD, 0x04, STOP, FLEXSPI_1PAD, 0x00),, d5 K, ^) \, `$ ^/ y3 \$ g
[4*CMD_LUT_SEQ_IDX_READ + 3] = 0,
3 t% _! B( |) ^' o. I },
8 f3 W% G6 e6 z4 K( r- t2 q },2 o* ?: g3 J% W; P
.pageSize = 256u,& U% y% o+ B9 E* E) V) J* S4 W
.sectorSize = 4u * 1024u,
$ s/ H3 O. G$ h/ Q% C/ G .blockSize = 64u * 1024u,
: ^/ B1 K: F/ ]) P% ] K5 v .isUniformBlockSize = false,
" F; [. i$ q: y) e9 A0 \/ ^};0 V, C' A" y: e+ Z4 q1 X8 r
下圖是華邦W25Q64JWS-IQ芯片的Fast Read Quad I/O SDR傳輸時序圖,Dummy Cycle連同MODE8_SDR序列一共6個SCK周期,此外還有個特別注意點,MODE8_SDR序列參數(shù)值需要被設(shè)成0xFx,我們上面修改的FDCB啟動頭是符合要求的。 |
|