|

大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是实抓Flash信号波形来看i.MXRT的FlexSPI外设下AHB读访问情形。' N- N. U+ G: c I# I
上一篇文章 《i.MXRT中FlexSPI外设对AHB Burst Read特性的支持》 里痞子衡介绍了FlexSPI外设在不开启Prefetch功能下响应AHB master的访问请求完全受AHB总线Burst Read特性决定,这是FlexSPI外设最基础的对Flash访问支持功能,研究这个其实是很有意义的,这可以反映出XiP下最原始的代码执行效率。/ I) d* {4 _% G% r# F/ Q3 F
我们知道在实际项目中,XiP应用程序常常是在L1 Cache和Prefetch加持下运行的,代码执行效率会得到大大提升,但无论是怎样的缓存策略,极限情况下(比如大数据块搬移,长跳转指令)最终还是拼得FlexSPI最基础的读访问支持。今天痞子衡就从抓Flash信号波形角度带大家真切感受下这最基础的AHB读访问情形(为更清晰地分析结果,本次主要涉及数据总线AHB访问,暂不涉及指令总线AHB访问):
5 X9 |3 K, F0 s& q一、实验准备痞子衡用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信号去分析。$ L2 h4 ~) J0 J b! }
const flexspi_nor_config_t qspiflash_config = {
% _5 W! u( L2 ^) S( K" N .memconfig =
: a8 p7 G* i0 B {
/ K1 r5 ?$ T" X .tag = FLEXSPI_CFG_BLK_TAG,: X9 S' q' T7 v
.version = FLEXSPI_CFG_BLK_VERSION,
. ]: x" Z7 T. f$ [ .readSampleClkSrc = kFlexSPIReadSampleClk_LoopbackFromDqsPad,! q+ ]" j' Z0 a$ T
.csHoldTime = 3u,
4 Q# J4 U0 F0 t$ A .csSetupTime = 3u,
* {( N# q! @* L* ?& z1 S .controllerMiscOption = 0x10,
; F% u w7 w/ e4 p! B .deviceType = kFlexSpiDeviceType_SerialNOR,
% z' T" S2 M& X1 r ^' A6 B, H .sflashPadType = kSerialFlash_4pads,
: L7 z8 A# L k // Flash工作于30MHz
/ I, M; ]5 @1 G) F! |( ]1 f .serialClkFreq = kFlexSpiSerialClk_30MHz,8 ~+ W8 @& l* l z' ~( H
.sflashA1Size = 8u * 1024u * 1024u,
0 i Z( X& g; e' P8 k .lookupTable =( j( Y% j0 M4 y# ~5 _4 o% a
{9 |8 F/ `9 i; ?5 T2 C) h
// Quad I/O Fast Read SDR LUTs- ~$ j( N5 I- b
[4*CMD_LUT_SEQ_IDX_READ + 0] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xEB, RADDR_SDR, FLEXSPI_4PAD, 0x18), ^6 p9 v5 l% V( q1 ?
[4*CMD_LUT_SEQ_IDX_READ + 1] = FLEXSPI_LUT_SEQ(MODE8_SDR, FLEXSPI_4PAD, 0xF0, DUMMY_SDR, FLEXSPI_4PAD, 0x04), b7 _5 }7 T2 w4 b1 D) ^7 k
[4*CMD_LUT_SEQ_IDX_READ + 2] = FLEXSPI_LUT_SEQ(READ_SDR, FLEXSPI_4PAD, 0x04, STOP, FLEXSPI_1PAD, 0x00),
4 X0 U) g9 Q% x* B- R: R [4*CMD_LUT_SEQ_IDX_READ + 3] = 0,9 e7 t1 K; D$ \4 R$ S
},
; @' @+ }+ W" n0 D! R0 m) H },
0 ?, }, B; W& m" b, h1 q .pageSize = 256u,
. C( E1 j4 H- H+ v+ ^; S( [ .sectorSize = 4u * 1024u,0 Y" r7 P1 g5 n+ c
.blockSize = 64u * 1024u,
1 Y9 s8 z6 p4 I .isUniformBlockSize = false,
6 c, X% g, E* Y9 [5 j# }6 H2 I};
; j1 v7 \* ^: k# P, T3 f下图是华邦W25Q64JWS-IQ芯片的Fast Read Quad I/O SDR传输时序图,Dummy Cycle连同MODE8_SDR序列一共6个SCK周期,此外还有个特别注意点,MODE8_SDR序列参数值需要被设成0xFx,我们上面修改的FDCB启动头是符合要求的。 |
|