|

大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是实抓Flash信号波形来看i.MXRT的FlexSPI外设下AHB读访问情形。- m# P; X: G' ~& E
上一篇文章 《i.MXRT中FlexSPI外设对AHB Burst Read特性的支持》 里痞子衡介绍了FlexSPI外设在不开启Prefetch功能下响应AHB master的访问请求完全受AHB总线Burst Read特性决定,这是FlexSPI外设最基础的对Flash访问支持功能,研究这个其实是很有意义的,这可以反映出XiP下最原始的代码执行效率。! [( r0 F* y7 y6 E+ h3 l' J: E
我们知道在实际项目中,XiP应用程序常常是在L1 Cache和Prefetch加持下运行的,代码执行效率会得到大大提升,但无论是怎样的缓存策略,极限情况下(比如大数据块搬移,长跳转指令)最终还是拼得FlexSPI最基础的读访问支持。今天痞子衡就从抓Flash信号波形角度带大家真切感受下这最基础的AHB读访问情形(为更清晰地分析结果,本次主要涉及数据总线AHB访问,暂不涉及指令总线AHB访问):/ {9 k2 h/ n0 G
一、实验准备痞子衡用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修改如下,设置Flash工作于30MHz Fast Read Quad I/O SDR模式,调成30MHz低速是为了方便后续用示波器抓Flash信号去分析。
9 i6 ], l6 h9 F- n1 @$ W8 g0 ]. g0 kconst flexspi_nor_config_t qspiflash_config = {' V9 ?+ [, d$ h8 U' Q/ Q8 H' S
.memconfig =
/ ~! I v. t' N" F w8 u {% M2 L3 ^% o* q" j
.tag = FLEXSPI_CFG_BLK_TAG,
* a1 P W# Z4 P9 e3 E3 J; W5 {6 Y2 v .version = FLEXSPI_CFG_BLK_VERSION,) B6 A1 W6 J# g* n; ?5 a. b
.readSampleClkSrc = kFlexSPIReadSampleClk_LoopbackFromDqsPad,
8 P/ I+ d2 v. I: f .csHoldTime = 3u,
. Z$ e$ D& P" A8 l .csSetupTime = 3u,
) |+ t+ o* d8 m5 M6 x2 K: Y .controllerMiscOption = 0x10,
& k. S& e6 p* b( \/ b4 Z .deviceType = kFlexSpiDeviceType_SerialNOR,
$ [ W8 D5 n' j6 a, J .sflashPadType = kSerialFlash_4pads,+ V. W" T/ C+ ~1 O, G- L
// Flash工作于30MHz+ S2 f' P7 `, d" H7 Q# _
.serialClkFreq = kFlexSpiSerialClk_30MHz,
L! C! i" a/ ?7 R .sflashA1Size = 8u * 1024u * 1024u,( j+ Z7 N9 P5 u0 D3 s X7 I( m6 @
.lookupTable =2 L" |6 R) a P' W# W
{
# ?9 R S( F5 o+ L( N8 G3 g // Quad I/O Fast Read SDR LUTs; M- \& R: }5 j) F4 r1 w
[4*CMD_LUT_SEQ_IDX_READ + 0] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xEB, RADDR_SDR, FLEXSPI_4PAD, 0x18),
/ w. B' I. Y0 {8 d [4*CMD_LUT_SEQ_IDX_READ + 1] = FLEXSPI_LUT_SEQ(MODE8_SDR, FLEXSPI_4PAD, 0xF0, DUMMY_SDR, FLEXSPI_4PAD, 0x04),' R, z5 L" f3 U8 w+ d
[4*CMD_LUT_SEQ_IDX_READ + 2] = FLEXSPI_LUT_SEQ(READ_SDR, FLEXSPI_4PAD, 0x04, STOP, FLEXSPI_1PAD, 0x00),2 a a( v" ?8 t
[4*CMD_LUT_SEQ_IDX_READ + 3] = 0,7 d8 G$ U6 P7 _+ I6 ?1 A! l* B
},* @* T! @9 ^% r
},
# U- ^$ h% R6 v1 K; \) {) K1 l .pageSize = 256u,0 x( r! l( L! S5 I/ z" A
.sectorSize = 4u * 1024u,
6 _/ [0 M" P5 G3 k% S2 }& G/ |1 l .blockSize = 64u * 1024u,
' p- }0 H& M& m4 V .isUniformBlockSize = false,) g3 j, f- H0 d% {: m1 q/ ^8 t3 `
};6 M8 w: \ @& S T+ ^
下图是华邦W25Q64JWS-IQ芯片的Fast Read Quad I/O SDR传输时序图,Dummy Cycle连同MODE8_SDR序列一共6个SCK周期,此外还有个特别注意点,MODE8_SDR序列参数值需要被设成0xFx,我们上面修改的FDCB启动头是符合要求的。 |
|