电子产业一站式赋能平台

PCB联盟网

搜索
查看: 304|回复: 0
收起左侧

无缓存下对Flash的AHB读访问竟然是这样!

[复制链接]

359

主题

364

帖子

2891

积分

三级会员

Rank: 3Rank: 3

积分
2891
发表于 2021-4-30 23:44:00 | 显示全部楼层 |阅读模式
大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是实抓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启动头是符合要求的。
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


联系客服 关注微信 下载APP 返回顶部 返回列表