|
大家好,我是痞子衡,是正經(jīng)搞技術(shù)的痞子。今天痞子衡給大家介紹的是實(shí)抓Flash信號(hào)波形來看i.MXRT的FlexSPI外設(shè)下AHB讀訪問情形。
) O3 X3 {# q; T. e上一篇文章 《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í)行效率。
- m, V/ a4 ]* _& \& `2 Z; h+ ]我們知道在實(shí)際項(xiàng)目中,XiP應(yīng)用程序常常是在L1 Cache和Prefetch加持下運(yùn)行的,代碼執(zhí)行效率會(huì)得到大大提升,但無論是怎樣的緩存策略,極限情況下(比如大數(shù)據(jù)塊搬移,長跳轉(zhuǎn)指令)最終還是拼得FlexSPI最基礎(chǔ)的讀訪問支持。今天痞子衡就從抓Flash信號(hào)波形角度帶大家真切感受下這最基礎(chǔ)的AHB讀訪問情形(為更清晰地分析結(jié)果,本次主要涉及數(shù)據(jù)總線AHB訪問,暫不涉及指令總線AHB訪問):
) q' B, C; O6 A, k4 | X: c8 R一、實(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)來簡單修改一下,把啟動(dòng)頭FDCB修改如下,設(shè)置Flash工作于30MHz Fast Read Quad I/O SDR模式,調(diào)成30MHz低速是為了方便后續(xù)用示波器抓Flash信號(hào)去分析。
/ V+ R& P( I# x# b( fconst flexspi_nor_config_t qspiflash_config = {
, E9 Q4 e, ?* N7 x% m .memconfig =+ ?8 \' D9 F6 M) Q4 B
{5 U/ t' H# ]! {0 b
.tag = FLEXSPI_CFG_BLK_TAG,
& s. y/ j1 n2 g0 j/ K. I .version = FLEXSPI_CFG_BLK_VERSION,$ m7 c8 U" r7 I. `4 `, e
.readSampleClkSrc = kFlexSPIReadSampleClk_LoopbackFromDqsPad,
K" T2 _3 t8 _' q, v' d5 Y .csHoldTime = 3u,
) {$ z, `0 I2 o& i4 X4 L9 W .csSetupTime = 3u,9 ]2 N5 G! `1 b* c) E
.controllerMiscOption = 0x10,
! Y* Q( P7 D( @ .deviceType = kFlexSpiDeviceType_SerialNOR,
5 E7 e- r% k" [& f9 k .sflashPadType = kSerialFlash_4pads,9 u/ Q% S9 ^% }! Y* u* [, L7 N
// Flash工作于30MHz
5 r7 m4 i8 N: x0 m' Q .serialClkFreq = kFlexSpiSerialClk_30MHz,# d9 y8 O$ B. [
.sflashA1Size = 8u * 1024u * 1024u,* L$ k# @' U8 r
.lookupTable =
8 z/ e8 w/ a/ p+ a9 h& c2 s {+ ~2 K) M+ v) @- i% h9 t
// Quad I/O Fast Read SDR LUTs! v% T: F# s) P) X* K o
[4*CMD_LUT_SEQ_IDX_READ + 0] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xEB, RADDR_SDR, FLEXSPI_4PAD, 0x18),) k( i1 E$ v8 [0 V9 A+ o3 y
[4*CMD_LUT_SEQ_IDX_READ + 1] = FLEXSPI_LUT_SEQ(MODE8_SDR, FLEXSPI_4PAD, 0xF0, DUMMY_SDR, FLEXSPI_4PAD, 0x04),
& B8 ]9 A% c3 m5 _7 v, X [4*CMD_LUT_SEQ_IDX_READ + 2] = FLEXSPI_LUT_SEQ(READ_SDR, FLEXSPI_4PAD, 0x04, STOP, FLEXSPI_1PAD, 0x00),. b3 s* s5 d/ N
[4*CMD_LUT_SEQ_IDX_READ + 3] = 0,5 h9 j. z- v- H) k8 \8 }% Y2 ]
},
3 w$ r3 k0 j; m( _- c9 m },
' F. _& u" e' ~; z$ _; ]% w .pageSize = 256u,' b4 V' e9 C7 g1 M% i& f( e
.sectorSize = 4u * 1024u,
+ e' S' |. t6 Y% [% r2 d .blockSize = 64u * 1024u,
& U( o7 t$ i: F% n) ~ .isUniformBlockSize = false,, \. k! K$ g6 B5 ?; H
};) C9 ]5 ]) J, r' x4 l! b% i
下圖是華邦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)頭是符合要求的。 |
|