大家好,我是痞子衡,是正經(jīng)搞技術(shù)的痞子。今天痞子衡給大家介紹的是實(shí)抓Flash信號(hào)波形來看i.MXRT的FlexSPI外設(shè)下AHB讀訪問情形。7 z( l1 t9 E. {+ S/ t
上一篇文章 《i.MXRT中FlexSPI外設(shè)對AHB Burst Read特性的支持》 里痞子衡介紹了FlexSPI外設(shè)在不開啟Prefetch功能下響應(yīng)AHB master的訪問請求完全受AHB總線Burst Read特性決定,這是FlexSPI外設(shè)最基礎(chǔ)的對Flash訪問支持功能,研究這個(gè)其實(shí)是很有意義的,這可以反映出XiP下最原始的代碼執(zhí)行效率。
' i, ~: M: ^, Y; g/ L我們知道在實(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訪問):& U/ c: O @8 {4 K
一、實(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; l9 j7 l2 F. N! Q
const flexspi_nor_config_t qspiflash_config = {0 y( |# e& a4 w5 q2 Y% y
.memconfig =4 [/ @* s+ k1 @3 o. r! F8 E x
{
6 j/ Q0 }" N$ ]* q .tag = FLEXSPI_CFG_BLK_TAG,! _4 z% S8 n( Q% T" y7 l3 a: o
.version = FLEXSPI_CFG_BLK_VERSION,
# O, W7 t4 W* Q7 G/ o6 `" l" w( C, u .readSampleClkSrc = kFlexSPIReadSampleClk_LoopbackFromDqsPad,, A* B0 l0 j7 @1 Y
.csHoldTime = 3u,
' P) [7 s$ N: r5 t9 z .csSetupTime = 3u,
! r) C- B1 u2 H& R0 W .controllerMiscOption = 0x10,
- g7 x- K7 }6 p .deviceType = kFlexSpiDeviceType_SerialNOR,7 D8 [0 z8 Z% b& N4 O
.sflashPadType = kSerialFlash_4pads,3 P! F% c5 e0 [. _
// Flash工作于30MHz
0 y' c( ^" a: j6 C" U# l. [/ f9 p .serialClkFreq = kFlexSpiSerialClk_30MHz,4 ^5 j! P' Z7 ?* W5 q
.sflashA1Size = 8u * 1024u * 1024u,
% R" J0 ]6 H l, n' p .lookupTable =' ^. |# L. c% p5 R5 m* g
{
' M) K! Z, N" f, A- K) ~# F // Quad I/O Fast Read SDR LUTs
* K1 }2 i$ }, p& K9 i9 T [4*CMD_LUT_SEQ_IDX_READ + 0] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xEB, RADDR_SDR, FLEXSPI_4PAD, 0x18),% {3 G1 ~; Y2 [" e- t: j, h% r" x
[4*CMD_LUT_SEQ_IDX_READ + 1] = FLEXSPI_LUT_SEQ(MODE8_SDR, FLEXSPI_4PAD, 0xF0, DUMMY_SDR, FLEXSPI_4PAD, 0x04),/ `( R" C: ~- o3 X9 t
[4*CMD_LUT_SEQ_IDX_READ + 2] = FLEXSPI_LUT_SEQ(READ_SDR, FLEXSPI_4PAD, 0x04, STOP, FLEXSPI_1PAD, 0x00),, _; _$ E" D/ H1 h8 v% Z+ I# C( @. P
[4*CMD_LUT_SEQ_IDX_READ + 3] = 0,0 p5 [0 d. p, w. f |$ w
},
/ s3 U/ v+ L3 T4 { },3 P1 K/ G: y) P. u0 _7 {
.pageSize = 256u,
; s7 k9 R2 J% i .sectorSize = 4u * 1024u, `0 s3 G7 l- i0 }9 h" f: `0 i
.blockSize = 64u * 1024u,! E# g& E# H* x5 b q
.isUniformBlockSize = false,; N+ y/ a4 q+ P$ u
};
3 Q. y& \/ I3 e# C8 x# }. l下圖是華邦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)頭是符合要求的。 |