大家好,我是痞子衡,是正經(jīng)搞技術(shù)的痞子。今天痞子衡給大家介紹的是實(shí)抓Flash信號(hào)波形來看i.MXRT的FlexSPI外設(shè)下AHB讀訪問情形。
8 g( ]) p2 n' b" X6 O i$ I上一篇文章 《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í)行效率。% s/ S* G9 {( d, Q! j; ]" y% _1 V5 r& t
我們知道在實(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訪問):
- d9 V0 T2 X$ i( v2 M一、實(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)去分析。0 Q4 f) s# J5 d7 W' `7 i
const flexspi_nor_config_t qspiflash_config = {6 Z* \) U5 R7 l4 o1 U$ e7 {
.memconfig =
7 r6 ~; o$ Q1 U, [ {
/ u7 \0 J* A/ x8 W; H. X .tag = FLEXSPI_CFG_BLK_TAG,& M4 @6 j: J2 @ m8 V* U
.version = FLEXSPI_CFG_BLK_VERSION,
, r1 i- k- H% q p5 I .readSampleClkSrc = kFlexSPIReadSampleClk_LoopbackFromDqsPad,
0 r# w8 `* { k6 X0 h9 D" L4 x* ~, \5 \ .csHoldTime = 3u,' X; P* |) h8 _9 V6 A/ B" b
.csSetupTime = 3u,0 ~: g6 X6 l7 f( Z( [
.controllerMiscOption = 0x10,
9 m# O% r0 P0 u .deviceType = kFlexSpiDeviceType_SerialNOR," K1 o, N. G7 |3 B% y, z6 X
.sflashPadType = kSerialFlash_4pads,( Y+ q3 q4 e9 r2 \ G
// Flash工作于30MHz: O. ^/ h g' r5 n. U& b, p2 t
.serialClkFreq = kFlexSpiSerialClk_30MHz,* }% p7 `. v5 N5 \, u, B
.sflashA1Size = 8u * 1024u * 1024u,
/ ^4 l( J) U$ c; O. R$ L/ h .lookupTable =
# }8 W6 |9 O4 ~; ] `6 G {
! F: q; O j$ c9 ~$ x" ?9 }2 } // Quad I/O Fast Read SDR LUTs3 T# c/ D/ s, P
[4*CMD_LUT_SEQ_IDX_READ + 0] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xEB, RADDR_SDR, FLEXSPI_4PAD, 0x18),
2 r# P b9 l2 h2 u [4*CMD_LUT_SEQ_IDX_READ + 1] = FLEXSPI_LUT_SEQ(MODE8_SDR, FLEXSPI_4PAD, 0xF0, DUMMY_SDR, FLEXSPI_4PAD, 0x04),, ~; e7 e. d U; [) e9 |
[4*CMD_LUT_SEQ_IDX_READ + 2] = FLEXSPI_LUT_SEQ(READ_SDR, FLEXSPI_4PAD, 0x04, STOP, FLEXSPI_1PAD, 0x00),
$ g8 S- m+ F( Q% @3 b. q [4*CMD_LUT_SEQ_IDX_READ + 3] = 0,
9 }8 J6 d0 T* Y* S- S },
# H n/ {9 q$ i! Y/ M6 T7 ] },- r' U4 J/ N- H
.pageSize = 256u,* g; {$ Q2 f ^
.sectorSize = 4u * 1024u,/ L4 U+ Z8 r" q; h# v
.blockSize = 64u * 1024u,# z) O! l& B) K2 z/ Q' y5 Q
.isUniformBlockSize = false,1 ?( _5 F! H8 N/ \
};
! Q; Y2 g) M' O: k/ y下圖是華邦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)頭是符合要求的。 |