电子产业一站式赋能平台

PCB联盟网

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

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

[复制链接]

355

主题

360

帖子

2831

积分

三级会员

Rank: 3Rank: 3

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

使用道具 举报

发表回复

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

本版积分规则


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