0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

探讨i.MX RT下FlexSPI driver实现Flash编程时对于中断支持问题

恩智浦MCU加油站 来源:恩智浦MCU加油站 2023-02-06 15:09 次阅读

前段时间有客户在官方社区反映i.MX RT1170下,使用官方SDK里FlexSPI驱动去擦写Flash时不能很好地支持全局中断。 客户项目里用了两块NOR Flash,分别挂在不同的 FlexSPI上,一块Flash用于存储XIP代码(FlexSPI1),另一块Flash用于存储项目资源数据(FlexSPI2),显然这样的设计原理上是没有问题的,那为什么使能了中断会出问题呢?今天就来分析下这个问题:

注: 客户测试的SDK版本为 2.12.1,对应的FlexSPI driver版本为2.3.6

一、为什么擦写Flash时经常需要关全局中断?

在具体分析客户问题之前,我们先来聊聊嵌入式应用里应对NOR Flash的擦写,为何大部分情况下都是要关闭全局中断(这里假设执行代码空间与擦写操作空间在同一个 Flash上,当然是在不同区域),这其实跟如下两个特性有关:

1.1 RWW特性(Read-While-Write

RWW特性的意思是在Flash执行擦写命令进入Busy 状态期间(Flash内部状态寄存器 WIP位变状态1)还能否继续响应非操作区域的读访问。如果SR[WIP] = 1 时还能够支持读访问,则该Flash 支持RWW,反之则不支持RWW。

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

绝大部分Flash都是不支持RWW特性的,这就是为什么Flash擦写操作代码本身是需要重定向到RAM里去执行(尤其是回读SR[WIP]状态的代码)。

对于支持RWW特性的Flash,一般是以Block为单位,Flash擦写操作代码放在BlockX 里执行,则可以操作BlockX以外的其它Block 区域,且不需要做代码重定向。

现在你应该知道对于不支持RWW的Flash为什么擦写时需要关闭全局中断了,因为无法保证中断响应相关代码全都重定向到RAM里了,所以干脆在Flash擦写期间不响应任何中断。

1.2 SCLK Stop特性

SCLK Stop特性的意思是在Flash执行写入命令接受主设备传输过来的Page数据期间,如果总线上SCLK停止(一般情况是FlexSPI这一端的TXFIFO为空或者触发空条件),则Flash能否也暂停接受当前Page数据直到SCLK继续输出从而继续处理剩下的Page数据。

绝大部分Flash是不支持SCLK Stop特性的,因此在MCU端如果传输Page数据,需要一次性连续传输完成,一旦中途被打断,则两次不连续的Page数据传输可能无法得到想要的Page写入结果。这也是为何Flash写入期间我们需要关闭中断。

二、FlexSPI外设写操作设计

关于i.MX RT上的FlexSPI外设基本情况,以前有两篇旧文 《FlexSPI支持在Flash XIP原理》、《FlexSPI支持AHB方式写入Flash》,大家先读一下有个初步了解。 这里想重点说一下FlexSPI关于IPG方式写操作的设计,下图为FlexSPI外设的模块框图,绿色线标出了 IPG 方式写入的通路,这里大家可以看出,其中 IP_TX_FIFO 模块起了重要的数据缓冲作用,驱动里往 FLEXSPI->TFDRx 寄存器写入的 Page 数据会先被装载进 IP_TX_FIFO 里,然后再传输出去。

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

不同i.MX RT型号中IP_TX_FIFO大小不一样,目前有三种大小:128、256或1024 Bytes。

对于QuadSPI/OctalSPI NOR Flash来说,Page 大小一般是256 Bytes;对于 HyperBus Flash,Page 大小一般是 512 Bytes。所以在 i.MX RT10xx 上 IP_TX_FIFO 是不足以缓冲整个 Page 的,i.MX RT117x 上可以缓冲 QuadSPI/OctalSPI NOR 类型的 Page,i.MX RT118x/5xx/6xx 上则可以缓冲全部 NOR Flash 类型的 Page。

对于 Page 数据不能全部缓冲的情况,则需要一边传输一边缓冲。

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

在具体装载数据进 IP_TX_FIFO 时,主要涉及如下三个 FLEXSPI 寄存器,IP_TX_FIFO 一次只能被填入watermark level大小的数据,想要把全部 Page 数据填进 IP_TX_FIFO,需要分多次装载。只要 FLEXSPI->INTR[IPTXWE] 标志为 0, 即代表 IP_TX_FIFO 剩余空间大于等于 watermark level,那么就可以继续装载。

FLEXSPI->IPTXFCR[TXWMRK] -- 设置一次装载进 IP_TX_FIFO 的数据长度(即 watermark level),8 Bytes为单位

FLEXSPI->TFDRx -- 按 watermark level 长度填入 IP_TX_FIFO 装载数据

FLEXSPI->INTR[IPTXWE] -- 触发 IP_TX_FIFO 的一次装载

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

三、客户问题及FlexSPI driver写操作流程

前面铺垫了这么多,终于来到客户遇到的 FlexSPI 驱动对于中断不支持的问题了。因为客户使用了两片Flash,所以不存在 RWW 限制问题,那剩下的原因就跟 SCLK Stop 特性有关,即 IP_TX_FIFO 并没有缓冲全部的 Page,导致 Page 传输过程被中断打断了,然后 IP_TX_FIFO 因为缓冲数据全部发完而使 FlexSPI 模块进入了 SCLK Stop 状态。

我们直接打开fsl_flexspi.c驱动文件,找到跟写操作相关的 FLEXSPI_TransferBlocking() 函数,在函数实现里可以发现,启动写传输时序的控制位 FLEXSPI->IPCMD[TRG] 是在 IP_TX_FIFO 填充动作 FLEXSPI_WriteBlocking() 函数之前被开启的,那这样的实现确实是不能够很好地支持中断的。

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

四、如何改进FlexSPI driver支持中断?

知道了原因所在,改起来也很简单。如果是QuadSPI/OctalSPI NOR Flash类型(Page=256 Bytes),在 i.MX RT117x 上,其 IP_TX_FIFO 大小为 256 Bytes,能够缓冲全部的 Page 大小,则可以先调用 FLEXSPI_WriteBlocking() 装载全部的 Page 数据,然后再开启 FLEXSPI->IPCMD[TRG] 去触发写传输时序,这时候就不怕被中断打断了,如下代码所示。

当然下面代码只是一个 workaround 式的实现示例,不是一个完整的解决方案,毕竟 FlexSPI 驱动要适配全部 i.MX RT 型号以及全部类型的 NOR Flash,此外还适用 NAND 型 Flash(Page 一般是 2KB),这时候需要根据情况拆分调用多次 FLEXSPI_WriteBlocking() 函数(不管怎样要保证启动写传输时序前,把 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;
    }

    // 代码略去
}

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FlaSh
    +关注

    关注

    10

    文章

    1551

    浏览量

    146652
  • 编程
    +关注

    关注

    88

    文章

    3441

    浏览量

    92405
  • 中断
    +关注

    关注

    5

    文章

    884

    浏览量

    41026
  • driver
    +关注

    关注

    0

    文章

    526

    浏览量

    66330
  • SDK
    SDK
    +关注

    关注

    3

    文章

    966

    浏览量

    44709

原文标题:探讨i.MX RT下FlexSPI driver实现Flash编程时对于中断支持问题

文章出处:【微信号:NXP_SMART_HARDWARE,微信公众号:恩智浦MCU加油站】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    i.Mx RT平台内存建议

    哪些超总线存储器被推荐用于NXP的I.MX RT平台。CyPress的超闪存/HyrRAM MCP设备与NXP的I.MX RT系列兼容吗?应用笔记和用户体验将不胜感激。 以上来自于百
    发表于 09-05 14:33

    i.MX RT处理器系列

    大量的RAM和FLASH内存,因此这似乎非常合适。到目前为止,RT1064是RT系列中的高端处理器。让我感兴趣的是它有4MB的片上FLASH存储器(其他的型号都是无闪存的)。
    发表于 07-22 07:53

    i.MX RT1050平台的相关资料推荐

    SylixOS 正式支持 i.MX RT1050平台发布于2018年06月22日什么是 i.MXRT1050?i.MX
    发表于 11-29 07:19

    i.MX RT1020到i.MX RT1010的迁移手册

    i.MX RT1020到i.MX RT1010的迁移指南
    发表于 12-12 06:25

    使用i.MX RT的FlexRAM的教程

    使用i.MX RT的FlexRAM
    发表于 12-12 07:36

    开发基于i.MX RT的UVC设备

    基于i.MX RT开发一个简单的UVC设备
    发表于 12-12 06:03

    i.MX RT1060到i.MX RT1064的迁移手册

    i.MX RT1060到i.MX RT1064的迁移指南
    发表于 12-12 07:21

    NOR闪存连接到i.MX RT1062上的FlexSPI2数据偏移了怎么处理?

    我有一个有趣的问题,我确定是配置问题。这是我第一次使用 QSPI 闪存设备和 i.MX 系列部件。我通常在 M4 或更小的机器上跑得慢很多。我有 2 个 NOR 闪存设备连接到 RT
    发表于 03-24 07:52

    I.MX RT1166 Flashdriver问题如何解决?

    我正在尝试为 I.MX RT1166 编写自定义闪存驱动程序应用程序。我一直在使用 iMXRT117x_FlexSPI_SFDP 项目,该项目可以在 Mcuxpresso 安装的 ide
    发表于 03-31 07:18

    i.MX RT开发笔记-08 | i.MX RT1062嵌套中断向量控制器NVIC(按键中断检测)

    RT开发笔记-03 | i.MX RT1062地址空间映射i.MX RT开发笔记-04 | i.MX
    发表于 12-01 13:51 2次下载
    <b class='flag-5'>i.MX</b> <b class='flag-5'>RT</b>开发笔记-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>检测)

    i.MX RT1170上串行NOR Flash双程序可交替启动设计

    i.MX RT10xx一样,这里要聊的还是在一片挂载在FlexSPI上的串行NOR Flash里做冗余/双程序设计,就是下图中的image L和image H,不涉及LPSPI接口
    的头像 发表于 04-28 09:55 977次阅读

    擦写Flash时一定不能开启系统全局中断吗?

    大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是i.MXRT下FlexSPI driver实现Flash编程
    的头像 发表于 02-10 14:27 1932次阅读

    i.MX RT的FlexRAM配置问题

    i.MX RT的FlexRAM配置问题
    的头像 发表于 10-24 15:46 287次阅读
    <b class='flag-5'>i.MX</b> <b class='flag-5'>RT</b>的FlexRAM配置问题

    i.MX RTFlexSPI外设不常用的读选通采样时钟源

    i.MX RTFlexSPI外设不常用的读选通采样时钟源
    的头像 发表于 10-30 17:44 265次阅读
    <b class='flag-5'>i.MX</b> <b class='flag-5'>RT</b>中<b class='flag-5'>FlexSPI</b>外设不常用的读选通采样时钟源

    理解i.MX RTFlexSPI外设lookupTable里配置访问行列混合寻址Memory的参数值

    理解i.MX RTFlexSPI外设lookupTable里配置访问行列混合寻址Memory的参数值
    的头像 发表于 10-30 17:23 284次阅读
    理解<b class='flag-5'>i.MX</b> <b class='flag-5'>RT</b>中<b class='flag-5'>FlexSPI</b>外设lookupTable里配置访问行列混合寻址Memory的参数值