|

大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是实抓Flash信号波形来看i.MXRT的FlexSPI外设下AHB读访问情形。
2 m! C( x- P) q, m* t$ A上一篇文章 《i.MXRT中FlexSPI外设对AHB Burst Read特性的支持》 里痞子衡介绍了FlexSPI外设在不开启Prefetch功能下响应AHB master的访问请求完全受AHB总线Burst Read特性决定,这是FlexSPI外设最基础的对Flash访问支持功能,研究这个其实是很有意义的,这可以反映出XiP下最原始的代码执行效率。( n: M$ z$ I+ y' ~& b
我们知道在实际项目中,XiP应用程序常常是在L1 Cache和Prefetch加持下运行的,代码执行效率会得到大大提升,但无论是怎样的缓存策略,极限情况下(比如大数据块搬移,长跳转指令)最终还是拼得FlexSPI最基础的读访问支持。今天痞子衡就从抓Flash信号波形角度带大家真切感受下这最基础的AHB读访问情形(为更清晰地分析结果,本次主要涉及数据总线AHB访问,暂不涉及指令总线AHB访问):8 V) e# V& l& M; `4 x7 r
一、实验准备痞子衡用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信号去分析。2 y5 O7 _( b3 }- y# \
const flexspi_nor_config_t qspiflash_config = {
& L. S7 g6 j! ?3 C" ~ .memconfig =
A# R! e7 J* o: E- H { ~* c& |; D# x: j* V
.tag = FLEXSPI_CFG_BLK_TAG,
% }8 D d( k# k4 o2 I$ ~& }, r .version = FLEXSPI_CFG_BLK_VERSION,
7 {+ K# m5 j/ C2 o% U .readSampleClkSrc = kFlexSPIReadSampleClk_LoopbackFromDqsPad,
$ |4 F) Y6 c& N7 Q! W .csHoldTime = 3u,
2 W+ m" @. D1 ]: l .csSetupTime = 3u,+ t9 o6 j# M. t" R+ K7 E" m) L4 @
.controllerMiscOption = 0x10,4 \2 C9 h, K H4 T/ F) B- E6 T
.deviceType = kFlexSpiDeviceType_SerialNOR,+ a, p( l# m7 z; k
.sflashPadType = kSerialFlash_4pads,
3 S- |4 Z' D5 F // Flash工作于30MHz
. z% a+ X/ d$ ^$ R }7 ]& i .serialClkFreq = kFlexSpiSerialClk_30MHz,! s5 [# x, V$ L6 \
.sflashA1Size = 8u * 1024u * 1024u,
2 ~# @ H, \7 z! g+ J! x; G8 u .lookupTable =; Q' e- t5 l) t. E# n
{
" p1 @8 P# v; C `3 P; ^/ D, t y // Quad I/O Fast Read SDR LUTs; L) I' p! J" u+ F
[4*CMD_LUT_SEQ_IDX_READ + 0] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xEB, RADDR_SDR, FLEXSPI_4PAD, 0x18),
( z$ o" `7 g# M, K; A [4*CMD_LUT_SEQ_IDX_READ + 1] = FLEXSPI_LUT_SEQ(MODE8_SDR, FLEXSPI_4PAD, 0xF0, DUMMY_SDR, FLEXSPI_4PAD, 0x04), ^' W& L) X- Z3 v9 r* o
[4*CMD_LUT_SEQ_IDX_READ + 2] = FLEXSPI_LUT_SEQ(READ_SDR, FLEXSPI_4PAD, 0x04, STOP, FLEXSPI_1PAD, 0x00),
$ m) W' I! S! m$ A8 j* q [4*CMD_LUT_SEQ_IDX_READ + 3] = 0,
" ?8 n, m, h& ]6 k' F$ _9 a },* e4 O1 s' s: M: _3 ^
},+ {" Q& Y' F0 H
.pageSize = 256u,+ `+ |# E0 X) P
.sectorSize = 4u * 1024u,( m" V5 o+ [* o7 J5 E( h5 z! Z
.blockSize = 64u * 1024u,0 G0 p% ?+ f; g8 m: z* W! {( H# m
.isUniformBlockSize = false,
Y3 H9 G- k. z* S% q};* c: {5 ]/ F% t; W# h
下图是华邦W25Q64JWS-IQ芯片的Fast Read Quad I/O SDR传输时序图,Dummy Cycle连同MODE8_SDR序列一共6个SCK周期,此外还有个特别注意点,MODE8_SDR序列参数值需要被设成0xFx,我们上面修改的FDCB启动头是符合要求的。 |
|