电子产业一站式赋能平台

PCB联盟网

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

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

[复制链接]

355

主题

360

帖子

2831

积分

三级会员

Rank: 3Rank: 3

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

使用道具 举报

发表回复

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

本版积分规则


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