0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

探討i.MX RT下FlexSPI driver實(shí)現(xiàn)Flash編程時(shí)對(duì)于中斷支持問題

恩智浦MCU加油站 ? 來源:恩智浦MCU加油站 ? 2023-02-06 15:09 ? 次閱讀

前段時(shí)間有客戶在官方社區(qū)反映i.MX RT1170下,使用官方SDK里FlexSPI驅(qū)動(dòng)去擦寫Flash時(shí)不能很好地支持全局中斷。 客戶項(xiàng)目里用了兩塊NOR Flash,分別掛在不同的 FlexSPI上,一塊Flash用于存儲(chǔ)XIP代碼(FlexSPI1),另一塊Flash用于存儲(chǔ)項(xiàng)目資源數(shù)據(jù)(FlexSPI2),顯然這樣的設(shè)計(jì)原理上是沒有問題的,那為什么使能了中斷會(huì)出問題呢?今天就來分析下這個(gè)問題:

注: 客戶測(cè)試的SDK版本為 2.12.1,對(duì)應(yīng)的FlexSPI driver版本為2.3.6

一、為什么擦寫Flash時(shí)經(jīng)常需要關(guān)全局中斷?

在具體分析客戶問題之前,我們先來聊聊嵌入式應(yīng)用里應(yīng)對(duì)NOR Flash的擦寫,為何大部分情況下都是要關(guān)閉全局中斷(這里假設(shè)執(zhí)行代碼空間與擦寫操作空間在同一個(gè) Flash上,當(dāng)然是在不同區(qū)域),這其實(shí)跟如下兩個(gè)特性有關(guān):

1.1 RWW特性(Read-While-Write

RWW特性的意思是在Flash執(zhí)行擦寫命令進(jìn)入Busy 狀態(tài)期間(Flash內(nèi)部狀態(tài)寄存器 WIP位變狀態(tài)1)還能否繼續(xù)響應(yīng)非操作區(qū)域的讀訪問。如果SR[WIP] = 1 時(shí)還能夠支持讀訪問,則該Flash 支持RWW,反之則不支持RWW。

d3991ad0-a3ba-11ed-bfe3-dac502259ad0.png

絕大部分Flash都是不支持RWW特性的,這就是為什么Flash擦寫操作代碼本身是需要重定向到RAM里去執(zhí)行(尤其是回讀SR[WIP]狀態(tài)的代碼)。

對(duì)于支持RWW特性的Flash,一般是以Block為單位,F(xiàn)lash擦寫操作代碼放在BlockX 里執(zhí)行,則可以操作BlockX以外的其它Block 區(qū)域,且不需要做代碼重定向。

現(xiàn)在你應(yīng)該知道對(duì)于不支持RWW的Flash為什么擦寫時(shí)需要關(guān)閉全局中斷了,因?yàn)闊o法保證中斷響應(yīng)相關(guān)代碼全都重定向到RAM里了,所以干脆在Flash擦寫期間不響應(yīng)任何中斷。

1.2 SCLK Stop特性

SCLK Stop特性的意思是在Flash執(zhí)行寫入命令接受主設(shè)備傳輸過來的Page數(shù)據(jù)期間,如果總線上SCLK停止(一般情況是FlexSPI這一端的TXFIFO為空或者觸發(fā)空條件),則Flash能否也暫停接受當(dāng)前Page數(shù)據(jù)直到SCLK繼續(xù)輸出從而繼續(xù)處理剩下的Page數(shù)據(jù)。

絕大部分Flash是不支持SCLK Stop特性的,因此在MCU端如果傳輸Page數(shù)據(jù),需要一次性連續(xù)傳輸完成,一旦中途被打斷,則兩次不連續(xù)的Page數(shù)據(jù)傳輸可能無法得到想要的Page寫入結(jié)果。這也是為何Flash寫入期間我們需要關(guān)閉中斷。

二、FlexSPI外設(shè)寫操作設(shè)計(jì)

關(guān)于i.MX RT上的FlexSPI外設(shè)基本情況,以前有兩篇舊文 《FlexSPI支持在Flash XIP原理》、《FlexSPI支持AHB方式寫入Flash》,大家先讀一下有個(gè)初步了解。 這里想重點(diǎn)說一下FlexSPI關(guān)于IPG方式寫操作的設(shè)計(jì),下圖為FlexSPI外設(shè)的模塊框圖,綠色線標(biāo)出了 IPG 方式寫入的通路,這里大家可以看出,其中 IP_TX_FIFO 模塊起了重要的數(shù)據(jù)緩沖作用,驅(qū)動(dòng)里往 FLEXSPI->TFDRx 寄存器寫入的 Page 數(shù)據(jù)會(huì)先被裝載進(jìn) IP_TX_FIFO 里,然后再傳輸出去。

d3c1c2c8-a3ba-11ed-bfe3-dac502259ad0.png

不同i.MX RT型號(hào)中IP_TX_FIFO大小不一樣,目前有三種大小:128、256或1024 Bytes。

對(duì)于QuadSPI/OctalSPI NOR Flash來說,Page 大小一般是256 Bytes;對(duì)于 HyperBus Flash,Page 大小一般是 512 Bytes。所以在 i.MX RT10xx 上 IP_TX_FIFO 是不足以緩沖整個(gè) Page 的,i.MX RT117x 上可以緩沖 QuadSPI/OctalSPI NOR 類型的 Page,i.MX RT118x/5xx/6xx 上則可以緩沖全部 NOR Flash 類型的 Page。

對(duì)于 Page 數(shù)據(jù)不能全部緩沖的情況,則需要一邊傳輸一邊緩沖。

d3f035d6-a3ba-11ed-bfe3-dac502259ad0.png

在具體裝載數(shù)據(jù)進(jìn) IP_TX_FIFO 時(shí),主要涉及如下三個(gè) FLEXSPI 寄存器,IP_TX_FIFO 一次只能被填入watermark level大小的數(shù)據(jù),想要把全部 Page 數(shù)據(jù)填進(jìn) IP_TX_FIFO,需要分多次裝載。只要 FLEXSPI->INTR[IPTXWE] 標(biāo)志為 0, 即代表 IP_TX_FIFO 剩余空間大于等于 watermark level,那么就可以繼續(xù)裝載。

FLEXSPI->IPTXFCR[TXWMRK] -- 設(shè)置一次裝載進(jìn) IP_TX_FIFO 的數(shù)據(jù)長(zhǎng)度(即 watermark level),8 Bytes為單位

FLEXSPI->TFDRx -- 按 watermark level 長(zhǎng)度填入 IP_TX_FIFO 裝載數(shù)據(jù)

FLEXSPI->INTR[IPTXWE] -- 觸發(fā) IP_TX_FIFO 的一次裝載

d443f716-a3ba-11ed-bfe3-dac502259ad0.png

三、客戶問題及FlexSPI driver寫操作流程

前面鋪墊了這么多,終于來到客戶遇到的 FlexSPI 驅(qū)動(dòng)對(duì)于中斷不支持的問題了。因?yàn)榭蛻羰褂昧藘善現(xiàn)lash,所以不存在 RWW 限制問題,那剩下的原因就跟 SCLK Stop 特性有關(guān),即 IP_TX_FIFO 并沒有緩沖全部的 Page,導(dǎo)致 Page 傳輸過程被中斷打斷了,然后 IP_TX_FIFO 因?yàn)榫彌_數(shù)據(jù)全部發(fā)完而使 FlexSPI 模塊進(jìn)入了 SCLK Stop 狀態(tài)。

我們直接打開fsl_flexspi.c驅(qū)動(dòng)文件,找到跟寫操作相關(guān)的 FLEXSPI_TransferBlocking() 函數(shù),在函數(shù)實(shí)現(xiàn)里可以發(fā)現(xiàn),啟動(dòng)寫傳輸時(shí)序的控制位 FLEXSPI->IPCMD[TRG] 是在 IP_TX_FIFO 填充動(dòng)作 FLEXSPI_WriteBlocking() 函數(shù)之前被開啟的,那這樣的實(shí)現(xiàn)確實(shí)是不能夠很好地支持中斷的。

d453eedc-a3ba-11ed-bfe3-dac502259ad0.png

四、如何改進(jìn)FlexSPI driver支持中斷?

知道了原因所在,改起來也很簡(jiǎn)單。如果是QuadSPI/OctalSPI NOR Flash類型(Page=256 Bytes),在 i.MX RT117x 上,其 IP_TX_FIFO 大小為 256 Bytes,能夠緩沖全部的 Page 大小,則可以先調(diào)用 FLEXSPI_WriteBlocking() 裝載全部的 Page 數(shù)據(jù),然后再開啟 FLEXSPI->IPCMD[TRG] 去觸發(fā)寫傳輸時(shí)序,這時(shí)候就不怕被中斷打斷了,如下代碼所示。

當(dāng)然下面代碼只是一個(gè) workaround 式的實(shí)現(xiàn)示例,不是一個(gè)完整的解決方案,畢竟 FlexSPI 驅(qū)動(dòng)要適配全部 i.MX RT 型號(hào)以及全部類型的 NOR Flash,此外還適用 NAND 型 Flash(Page 一般是 2KB),這時(shí)候需要根據(jù)情況拆分調(diào)用多次 FLEXSPI_WriteBlocking() 函數(shù)(不管怎樣要保證啟動(dòng)寫傳輸時(shí)序前,把 IP_TX_FIFO 先裝滿)。

status_t FLEXSPI_TransferBlocking(FLEXSPI_Type *base, flexspi_transfer_t *xfer)
{
    // 代碼略去

    /* Start Transfer. */
    if ((xfer->cmdType == kFLEXSPI_Write) || (xfer->cmdType == kFLEXSPI_Config))
    {
        result = FLEXSPI_WriteBlocking(base, xfer->data, xfer->dataSize);
        base->IPCMD |= FLEXSPI_IPCMD_TRG_MASK;
    }
    else if (xfer->cmdType == kFLEXSPI_Read)
    {
        base->IPCMD |= FLEXSPI_IPCMD_TRG_MASK;
        result = FLEXSPI_ReadBlocking(base, xfer->data, xfer->dataSize);
    }
    else
    {
        base->IPCMD |= FLEXSPI_IPCMD_TRG_MASK;
    }

    // 代碼略去
}

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • FlaSh

    關(guān)注

    10

    文章

    1614

    瀏覽量

    147655
  • 編程
    +關(guān)注

    關(guān)注

    88

    文章

    3565

    瀏覽量

    93536
  • 中斷
    +關(guān)注

    關(guān)注

    5

    文章

    895

    瀏覽量

    41349
  • driver
    +關(guān)注

    關(guān)注

    0

    文章

    526

    瀏覽量

    66556
  • SDK
    SDK
    +關(guān)注

    關(guān)注

    3

    文章

    1020

    瀏覽量

    45697

原文標(biāo)題:探討i.MX RT下FlexSPI driver實(shí)現(xiàn)Flash編程時(shí)對(duì)于中斷支持問題

文章出處:【微信號(hào):NXP_SMART_HARDWARE,微信公眾號(hào):恩智浦MCU加油站】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    i.MX RT1052芯片的核心板,性能和代碼詳細(xì)資料概述

    i.MX RT1052是i.MX RT系列芯片,是由 NXP 半導(dǎo)體公司推出的跨界處理器芯片,該系列又包
    的頭像 發(fā)表于 06-10 10:55 ?2.5w次閱讀

    01:i.MX RT的市場(chǎng)應(yīng)用和參考解決方案

    i.MX RT產(chǎn)品是今年市場(chǎng)上最受歡迎的跨界MCU產(chǎn)品。i.MX RT定位為一款MCU產(chǎn)品,它可以重復(fù)利用傳統(tǒng)的Arm MCU生態(tài)系統(tǒng)。除此之外,本次講座還將簡(jiǎn)要介紹
    的頭像 發(fā)表于 01-21 07:13 ?3305次閱讀
    01:<b class='flag-5'>i.MX</b> <b class='flag-5'>RT</b>的市場(chǎng)應(yīng)用和參考解決方案

    i.MX RT開發(fā)筆記-08 | i.MX RT1062嵌套中斷向量控制器NVIC(按鍵中斷檢測(cè))

    RT開發(fā)筆記-03 | i.MX RT1062地址空間映射i.MX RT開發(fā)筆記-04 | i.MX
    發(fā)表于 12-01 13:51 ?2次下載
    <b class='flag-5'>i.MX</b> <b class='flag-5'>RT</b>開發(fā)筆記-08 | <b class='flag-5'>i.MX</b> <b class='flag-5'>RT</b>1062嵌套<b class='flag-5'>中斷</b>向量控制器NVIC(按鍵<b class='flag-5'>中斷</b>檢測(cè))

    RT-Thread & NXP 發(fā)布 i.MX RT 系列 BSP 新框架

    前言i.MX RT 是 NXP 推出的跨界處理器系列。該系列又包括 i.MX RT1020、i.MX
    發(fā)表于 12-07 13:06 ?2次下載
    <b class='flag-5'>RT</b>-Thread & NXP 發(fā)布 <b class='flag-5'>i.MX</b> <b class='flag-5'>RT</b> 系列 BSP 新框架

    基于i.MX RT單芯片實(shí)現(xiàn)的GUI圖形顯示和語音控制解決方案

    基于優(yōu)秀的性能指標(biāo),i.MX RT可以勝任許多輕量級(jí)的AI應(yīng)用,賦能越來越多的邊緣設(shè)備。今天這場(chǎng)視頻講座中,恩智浦的專家將向大家展示一款基于i.MX RT單芯片
    的頭像 發(fā)表于 12-31 09:48 ?7224次閱讀

    i.MX RT1170上串行NOR Flash雙程序可交替啟動(dòng)設(shè)計(jì)

    i.MX RT10xx一樣,這里要聊的還是在一片掛載在FlexSPI上的串行NOR Flash里做冗余/雙程序設(shè)計(jì),就是下圖中的image L和image H,不涉及LPSPI接口
    的頭像 發(fā)表于 04-28 09:55 ?1198次閱讀

    適用于i.MX RT500和i.MX RT600 MCU的Xtensa音頻框架介紹

    在眾多的恩智浦i.MX RT跨界處理器當(dāng)中,您可能會(huì)發(fā)現(xiàn)有些系列除了Arm內(nèi)核之外還結(jié)合了高性能的DSP,利用集成DSP的技術(shù)優(yōu)勢(shì),可提供高性能音頻數(shù)字信號(hào)處理能力,并包含特定算法操作,可實(shí)現(xiàn)完全
    的頭像 發(fā)表于 11-10 09:39 ?2559次閱讀

    擦寫Flash時(shí)一定不能開啟系統(tǒng)全局中斷嗎?

    大家好,我是痞子衡,是正經(jīng)搞技術(shù)的痞子。今天痞子衡給大家介紹的是i.MXRTFlexSPI driver實(shí)現(xiàn)
    的頭像 發(fā)表于 02-10 14:27 ?3108次閱讀

    基于 NXP i.MX RT1050 的 3D 打印機(jī)方案

    MCU-Healer 是基于 NXP i.MX RT1050 做的 3D 打印機(jī)方案,該方案主控 MCU i.MX RT1050是一顆 Cortex-M7 內(nèi)核的高性能 MCU,主頻達(dá)
    的頭像 發(fā)表于 04-06 15:06 ?1103次閱讀
    基于 NXP <b class='flag-5'>i.MX</b> <b class='flag-5'>RT</b>1050 的 3D 打印機(jī)方案

    i.MX RT的FlexRAM配置問題

    i.MX RT的FlexRAM配置問題
    的頭像 發(fā)表于 10-24 15:46 ?767次閱讀
    <b class='flag-5'>i.MX</b> <b class='flag-5'>RT</b>的FlexRAM配置問題

    i.MX RTFlexSPI外設(shè)不常用的讀選通采樣時(shí)鐘源

    i.MX RTFlexSPI外設(shè)不常用的讀選通采樣時(shí)鐘源
    的頭像 發(fā)表于 10-30 17:44 ?512次閱讀
    <b class='flag-5'>i.MX</b> <b class='flag-5'>RT</b>中<b class='flag-5'>FlexSPI</b>外設(shè)不常用的讀選通采樣時(shí)鐘源

    理解i.MX RTFlexSPI外設(shè)lookupTable里配置訪問行列混合尋址Memory的參數(shù)值

    理解i.MX RTFlexSPI外設(shè)lookupTable里配置訪問行列混合尋址Memory的參數(shù)值
    的頭像 發(fā)表于 10-30 17:23 ?472次閱讀
    理解<b class='flag-5'>i.MX</b> <b class='flag-5'>RT</b>中<b class='flag-5'>FlexSPI</b>外設(shè)lookupTable里配置訪問行列混合尋址Memory的參數(shù)值

    i.MX RT1050上如何實(shí)現(xiàn)雙大容量存儲(chǔ)(MSC)設(shè)備

    i.MX RT1050上如何實(shí)現(xiàn)雙大容量存儲(chǔ)(MSC)設(shè)備
    的頭像 發(fā)表于 10-30 17:08 ?593次閱讀
    在<b class='flag-5'>i.MX</b> <b class='flag-5'>RT</b>1050上如何<b class='flag-5'>實(shí)現(xiàn)</b>雙大容量存儲(chǔ)(MSC)設(shè)備

    i.MX RT500/600系列上串行NOR Flash雙程序可交替啟動(dòng)設(shè)計(jì)

    i.MX RT500/600系列上串行NOR Flash雙程序可交替啟動(dòng)設(shè)計(jì)
    的頭像 發(fā)表于 10-27 09:36 ?445次閱讀
    <b class='flag-5'>i.MX</b> <b class='flag-5'>RT</b>500/600系列上串行NOR <b class='flag-5'>Flash</b>雙程序可交替啟動(dòng)設(shè)計(jì)

    恩智浦i.MX RT1060/1010上串行NOR Flash冗余程序啟動(dòng)設(shè)計(jì)

    恩智浦i.MX RT1060/1010上串行NOR Flash冗余程序啟動(dòng)設(shè)計(jì)
    的頭像 發(fā)表于 09-26 16:53 ?687次閱讀
    恩智浦<b class='flag-5'>i.MX</b> <b class='flag-5'>RT</b>1060/1010上串行NOR <b class='flag-5'>Flash</b>冗余程序啟動(dòng)設(shè)計(jì)