大家好,我是痞子衡,是正經(jīng)搞技術(shù)的痞子。今天痞子衡給大家介紹的是實(shí)抓Flash信號(hào)波形來看i.MXRT的FlexSPI外設(shè)下AHB讀訪問情形。
$ U5 {+ G B, W* t上一篇文章 《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í)行效率。" z' v, x, D8 x; ~" X) S
我們知道在實(shí)際項(xiàng)目中,XiP應(yīng)用程序常常是在L1 Cache和Prefetch加持下運(yùn)行的,代碼執(zhí)行效率會(huì)得到大大提升,但無論是怎樣的緩存策略,極限情況下(比如大數(shù)據(jù)塊搬移,長(zhǎng)跳轉(zhuǎn)指令)最終還是拼得FlexSPI最基礎(chǔ)的讀訪問支持。今天痞子衡就從抓Flash信號(hào)波形角度帶大家真切感受下這最基礎(chǔ)的AHB讀訪問情形(為更清晰地分析結(jié)果,本次主要涉及數(shù)據(jù)總線AHB訪問,暫不涉及指令總線AHB訪問):) W G% c$ I5 H( N6 ^0 \
一、實(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)來簡(jiǎn)單修改一下,把啟動(dòng)頭FDCB修改如下,設(shè)置Flash工作于30MHz Fast Read Quad I/O SDR模式,調(diào)成30MHz低速是為了方便后續(xù)用示波器抓Flash信號(hào)去分析。! v# K. q" o1 J9 U$ z. `2 R
const flexspi_nor_config_t qspiflash_config = {
( R& b" M; }& ~' I, @ .memconfig =* ^% Q% w2 V4 F8 P+ a, r' j& t
{
6 [5 K$ ~$ C% i9 j% s! n' U .tag = FLEXSPI_CFG_BLK_TAG,0 Y( L7 q2 j( } \
.version = FLEXSPI_CFG_BLK_VERSION,
- d/ N- @9 {+ c- {9 a: O4 D .readSampleClkSrc = kFlexSPIReadSampleClk_LoopbackFromDqsPad,
+ [% ^" G; m! F' ` .csHoldTime = 3u,
, A- {! ?+ g3 h; M. { .csSetupTime = 3u,- I+ V0 Y9 i: M( ~7 I3 t
.controllerMiscOption = 0x10,
( N0 O! D/ J. Z .deviceType = kFlexSpiDeviceType_SerialNOR,# Z& [: t. v( C
.sflashPadType = kSerialFlash_4pads,! H0 l' |% L2 z5 d; \2 ~
// Flash工作于30MHz, Y$ l/ X& q/ |* v7 l
.serialClkFreq = kFlexSpiSerialClk_30MHz,. e: \3 ?- z5 W! E9 T4 W
.sflashA1Size = 8u * 1024u * 1024u,
; U2 q; V3 r5 ^9 X! g1 o .lookupTable =. y3 ]0 y- H/ `& i) f
{/ t7 Z; u1 q4 E9 T/ k2 A
// Quad I/O Fast Read SDR LUTs
! R1 C3 X7 L- M2 x5 f- ^5 e4 w/ @ [4*CMD_LUT_SEQ_IDX_READ + 0] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xEB, RADDR_SDR, FLEXSPI_4PAD, 0x18),4 `. H( H$ A" b. V1 c6 H5 l
[4*CMD_LUT_SEQ_IDX_READ + 1] = FLEXSPI_LUT_SEQ(MODE8_SDR, FLEXSPI_4PAD, 0xF0, DUMMY_SDR, FLEXSPI_4PAD, 0x04),
5 |# w; ^; r5 M [4*CMD_LUT_SEQ_IDX_READ + 2] = FLEXSPI_LUT_SEQ(READ_SDR, FLEXSPI_4PAD, 0x04, STOP, FLEXSPI_1PAD, 0x00),
8 h1 R7 X1 @5 z7 w4 m0 m [4*CMD_LUT_SEQ_IDX_READ + 3] = 0,0 W: [9 H* a! P' v+ e% G
},
7 T& H) g6 M: L) C: e },$ q) B% g) b) X0 L D& r2 s! y6 a
.pageSize = 256u,! [. i% [1 w2 T6 N+ i
.sectorSize = 4u * 1024u,
7 Z) p+ l/ n! }) I9 J/ @ .blockSize = 64u * 1024u,+ X3 k; L( C' {- f, e4 I
.isUniformBlockSize = false,' J: c K8 m; T4 X
};( Z& R: K! ^; h
下圖是華邦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)頭是符合要求的。 |