91视频免费?看_蜜芽MY188精品TV在线观看_国产免费无遮挡在线观看视频_深夜国产_亚洲精品欧洲精品_欧美黑人粗暴多交

啟動Flash時(shí)DQS與Dummy Cycle設(shè)置是怎樣的關(guān)系?

大家好,我是痞子衡,是正經(jīng)搞技術(shù)的痞子。今天痞子衡給大家介紹的是Octal或Hyper Flash上DQS信號與Dummy Cycle聯(lián)系

關(guān)于在 i.MXRT 上啟動 NOR Flash 時(shí)如何設(shè)置正確的 Dummy Cycle 值,痞子衡一共寫過四篇文章:《IS25WP系列Dummy Cycle設(shè)置》《IS25LP系列Dummy Cycle設(shè)置》《Dummy Cycle設(shè)置為0的誤區(qū)》《DTR模式下Dummy Cycle設(shè)置》, 這四篇文章都是針對普通 QuadSPI 型 Flash 而言的(一般沒有 DQS 信號)。而如果在 i.MXRT 上啟動的是包含 DQS 信號的 Octal Flash 或者 Hyper Flash,此時(shí) Dummy Cycle 設(shè)置有什么不同之處呢?今天痞子衡就和大家聊聊這個(gè)話題:

一、Flash讀時(shí)序中DQS與Dummy Cycle作用

我們知道對于普通 QuadSPI 型 Flash,在 FlexSPI 模塊 LUT 里配置讀時(shí)序時(shí),其中 Dummy Cycle 子序列中填的值必須要與 Flash 端的 Dummy Cycle 嚴(yán)格一致,否則會發(fā)生時(shí)序錯(cuò)亂(如下圖 Extended 時(shí)序所示,圖中是單線模式,四線模式類似)。

Flash 里一般都會開放寄存器給用戶去配置 Dummy Cycle 值,F(xiàn)lash 工作頻率越高,所需的最小 Dummy Cycle 也越大(可以理解為 Flash 存儲體從接收到讀命令開始到輸出有效數(shù)據(jù)這一段時(shí)間間隔是恒定的,而我們衡量時(shí)間的基準(zhǔn)是連接到 Flash 的 SCK,SCK 頻率越高,相同間隔內(nèi)所需 SCK 周期數(shù)就越多)。

Note1: 簡單來說,Dummy Cycle 就是 Flash 響應(yīng)主機(jī)每一次讀時(shí)序所需要的準(zhǔn)備時(shí)間,在 NOR Flash 上這個(gè)時(shí)間是固定且可設(shè)的,跟訪問地址無關(guān)。

Note2: 一個(gè)確定的 Dummy Cycle 值決定了 Flash 上限工作頻率,但此時(shí) Flash 并不是只能在這個(gè)上限頻率下工作,低于這個(gè)上限頻率均可以。

DQS 信號正常是為 OctalSPI / HyperBus 型 Flash 工作在八線 DTR 模式下同步 DQ[7:0] 線輸出而生的(見上圖 Octal DDR 時(shí)序),關(guān)于其基本概念詳見痞子衡舊文 《DQS信號簡介》

Note: 在 Hyper Flash 上負(fù)責(zé) DQS 功能的信號是 RWDS。

當(dāng) OctalSPI / HyperBus 型 Flash 工作在 Octal DDR 模式下時(shí),DQS/RWDS 信號會向主設(shè)備(這里指 i.MXRT)提示 DQ[7:0] 何時(shí)有效,所以這時(shí)候 DQS 信號其實(shí)也兼?zhèn)淞?Dummy Cycle 的作用。不過考慮到有時(shí)候主設(shè)備端不一定會使能 DQS 信號,Dummy Cycle 的存在仍然是有必要的。

二、FlexSPI外設(shè)里DQS和Dummy Cycle聯(lián)系

 《FlexSPI外設(shè)的LUT機(jī)制》  《DTR模式下Dummy Cycle設(shè)置》 兩篇文章里有詳細(xì)的關(guān)于 FlexSPI 外設(shè)中 Dummy Cycle 設(shè)置方法和 DQS 引腳功能配置方法介紹,但是這兩者是怎樣的聯(lián)系關(guān)系呢?

我們在 i.MXRT 參考手冊 FlexSPI 章節(jié)可以找到如下 Hyper Bus 讀時(shí)序示意圖(對于 Octal Flash 也基本適用,僅微小區(qū)別),這張圖很清晰地闡述了 RWDS 信號與 Latency Count 的聯(lián)系,F(xiàn)lexSPI 外設(shè)在發(fā)起實(shí)際讀時(shí)序時(shí)一定會輸出 DUMMY_DDR 子序列里實(shí)際配置的延時(shí)周期,但如果配置的延時(shí)周期結(jié)束后,RWDS 有效信號還沒有到來,F(xiàn)lexSPI 會自動插入足夠的延時(shí)周期(即圖中所謂的 Additional Latency count)直到 RWDS 信號有效。

Note: 在 Hyper Flash 上不用 Dummy Cycle 術(shù)語,其術(shù)語是 Latency Count。

基于這樣的設(shè)計(jì),當(dāng)在 FlexSPI 里使能外部 DQS 信號時(shí),我們在 DUMMY_DDR 子序列里只要象征性地填一個(gè)比 Flash 里 Latency Count 稍小的值就行了,在一些 i.MXRT 型號上理想情況下甚至可以去除 DUMMY_DDR 子序列(即延時(shí)周期 配 0),但切記這個(gè)值不應(yīng)配得比 Flash 里 Latency Count 大。

三、在i.MXRT1170上實(shí)測MT35XU512

最近恩智浦 SE 團(tuán)隊(duì)做了一個(gè)基于 i.MXRT1170 的 Auto Development Platform 原型板,在 FlexSPI1 上掛的是來自 Micron 的 Octal Flash - MT35XU512,這顆 Flash 作為代碼存儲與啟動設(shè)備。我們就在這個(gè)原型板上測試一下 FlexSPI 外設(shè)的 DQS 與 Dummy Cycle 不同配置能否去正常啟動 Flash。

3.1 MT35XU512基本情況

首先看一下這顆 Octal Flash 的基本情況,主要關(guān)注 DQS 和 Dummy Cycle 方面。Flash 內(nèi)部有 256 個(gè) 8bit 的配置寄存器(address 從 0 - 255),其中 address 0 配置寄存器用于設(shè)置 Flash 工作模式(我們需要設(shè)為 0xE7,開啟 Octal DDR 且需要 DQS),address 1 配置寄存器用于設(shè)置 Dummy Cycle(可保持初值 0x00 不變,即使用默認(rèn) Dummy Cycle 值)。

再來看一下這顆 Octal Flash 所支持的讀命令,根據(jù)工作模式不同一共有 10 種命令,我們選用最后一條命令 4-byte DDR Octal I/O Fast Read(命令值 0xFD),這條讀命令可訪問全部 Flash 空間且性能最高,其對應(yīng)的默認(rèn) Dummy Cycle 是 16。

默認(rèn) 16 的 Dummy Cycle 能支持多高的 Flash 工作頻率呢,在下表里可找到答案,前面我們選擇的是 DDR Octal I/O Fast Read 命令,所以對應(yīng)最高工作頻率可達(dá) 171MHz。雖然 Flash 本身可跑 200MHz DDR,但是 i.MXRT1170 FlexSPI 外設(shè)最大支持到 166MHz DDR,這就是在前面保持 Flash 中 address 1 配置寄存器值為默認(rèn) Dummy Cycle 的原因,默認(rèn) Dummy Cycle 配置已經(jīng)夠用了。

3.2 測試啟動頭FDCB

基于上面對 Octal Flash 的認(rèn)識,我們很容易給出如下可用于啟動的 FDCB 頭,這個(gè)頭里使能了 FlexSPI 端的外部 DQS 使用(octalflash_config.memConfig.readSampleClkSrc),開啟了 Flash 端的 Octal DDR 模式(octalflash_config.memConfig.deviceModeArg),LUT 里第一條時(shí)序配置的是 0xFD 讀命令,并且 DUMMY_DDR 子序列等效配置的是 3 個(gè) Dummy Cycle,低于 Flash 里實(shí)際 16 個(gè) Dummy Cycle,一切都符合上文的分析,這個(gè)啟動頭在板子上實(shí)測是可以工作的。

const flexspi_nor_config_t octalflash_config = {
    .memConfig =
        {
            .tag                 = FLEXSPI_CFG_BLK_TAG,
            .version             = FLEXSPI_CFG_BLK_VERSION,
            .readSampleClkSrc    = kFlexSPIReadSampleClk_ExternalInputFromDqsPad,
            .csHoldTime          = 3,
            .csSetupTime         = 3,
            .deviceModeCfgEnable = 1,
            .deviceModeType      = kDeviceConfigCmdType_Spi2Xpi,
            .waitTimeCfgCommands = 1,
            .deviceModeSeq =
                {
                    .seqNum   = 1,
                    .seqId    = 6,
                    .reserved = 0,
                },
            .deviceModeArg = 0xE7, /* Enable octal DDR mode */
            .controllerMiscOption =
                (1u << kFlexSpiMiscOffset_SafeConfigFreqEnable) | (1u << kFlexSpiMiscOffset_DdrModeEnable),
            .deviceType    = kFlexSpiDeviceType_SerialNOR,
            .sflashPadType = kSerialFlash_8Pads,
            .serialClkFreq = kFlexSpiSerialClk_166MHz,
            .sflashA1Size  = 64ul * 1024u * 1024u,
            .busyOffset      = 0u,
            .busyBitPolarity = 0u,
            .lookupTable =
                {
                    /* 4-BYTE DDR OCTAL I/O FAST READ */
                    [0] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_8PAD, 0xFD, RADDR_DDR, FLEXSPI_8PAD, 0x20),
                    // 這里 DUMMY_DDR 里填入的值是 0x6,對應(yīng) 3 個(gè) SCK 周期的 dummy
                    [1] = FLEXSPI_LUT_SEQ(DUMMY_DDR, FLEXSPI_8PAD, 0x6, READ_DDR, FLEXSPI_8PAD, 0x04),

                    /* Read Status */
                    [4 * 1 + 0] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x05, READ_SDR, FLEXSPI_1PAD, 0x04),

                    /* Write Enable */
                    [4 * 3 + 0] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x06, STOP_EXE, FLEXSPI_1PAD, 0x00),

                    /* Enable Octal DDR mode */
                    [4 * 6 + 0] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x81, CMD_SDR, FLEXSPI_1PAD, 0x00),
                    [4 * 6 + 1] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x00, CMD_SDR, FLEXSPI_1PAD, 0x00),
                    [4 * 6 + 2] = FLEXSPI_LUT_SEQ(WRITE_SDR, FLEXSPI_1PAD, 0x01, STOP_EXE, FLEXSPI_1PAD, 0x00),
                },
        },
    .pageSize           = 256u,
    .sectorSize         = 4u * 1024u,
    .serialNorType      = 0x2,
    .blockSize          = 128u * 1024u,
    .isUniformBlockSize = false,
};

現(xiàn)在我們做多一些實(shí)驗(yàn),修改上述啟動頭里的 readSampleClkSrc、serialClkFreq 和 DUMMY_DDR 子序列值,其余配置保持不變,測試結(jié)果如下。這個(gè)結(jié)果基本是符合第二小節(jié)里關(guān)于DQS和Dummy Cycle聯(lián)系關(guān)系的總結(jié)的。

至此,Octal或Hyper Flash上DQS信號與Dummy Cycle聯(lián)系痞子衡便介紹完畢了,掌聲在哪里~~~

聲明:本內(nèi)容為作者獨(dú)立觀點(diǎn),不代表電子星球立場。未經(jīng)允許不得轉(zhuǎn)載。授權(quán)事宜與稿件投訴,請聯(lián)系:editor@netbroad.com
覺得內(nèi)容不錯(cuò)的朋友,別忘了一鍵三連哦!
贊 1
收藏 2
關(guān)注 41
成為作者 賺取收益
全部留言
0/200
成為第一個(gè)和作者交流的人吧
主站蜘蛛池模板: 长春市| 布拖县| 桃江县| 安龙县| 阿勒泰市| 海城市| 海兴县| 临夏市| 敖汉旗| 双峰县| 潞城市| 屏南县| 嘉黎县| 齐齐哈尔市| 济源市| 正蓝旗| 丰顺县| 安龙县| 青州市| 怀宁县| 依安县| 宁河县| 芒康县| 太和县| 新竹市| 饶河县| 洛宁县| 康定县| 高邑县| 霸州市| 治多县| 阿瓦提县| 乌拉特后旗| 包头市| 曲阳县| 灵山县| 辽宁省| 阿城市| 长宁区| 梅州市| 舞钢市|