大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是在FDCB里使能串行NOR Flash的Continuous read模式

  前面关于串行Flash传输时序的文章 《Fast Read Quad I/O SDR模式》《Fast Read Quad I/O DTR模式》, 痞子衡介绍的其实都属于经典SPI工作模式大类下的Non-Continuous read传输模式,即任何独立的Fast Read Quad I/O读数据时序(一次CS低有效期间),都必须由Command子序列(命令码0xEB/0xEC/0xED/0xEE)先行,且不管是SDR还是DTR模式,命令码都是要在8个SCK周期内由IO0信号进行传输(别小看这8个SCLK周期,对于小数据块读取时序,它在总传输时间里占比是不可忽视的)。

  我们知道在XIP情况下CPU从Flash里取指令数据往往是非常随机且零碎无序的,这时候虽然有L1 Cache和和FlexSPI Prefetch Buffer加速,但如果还想再进一步提升访问性能,就只能从Flash底层传输序列里想办法了。Flash读时序里有五大子序列CMD + ADDR + MODE + DUMMY + READ,其中除了CMD和DUMMY子序列是固定的,其他子序列参数值都可能会变,会变的就不能被优化,所以只能想办法在CMD和DUMMY子序列里做文章。今天痞子衡要介绍的Continuous read模式就是拿CMD子序列开刀:

一、什么是Continuous read模式?

  Continuous read顾名思义就是连续读。在串行Flash世界里,连续读的意思是读传输时序里除了第一次CS有效期必须传输Command子序列,其后的读传输时序里均省去Command子序列。下面痞子衡结合i.MXRT的FlexSPI外设来对比介绍Non-Continuous read与Continuous read模式的区别:

1.1 FlexSPI的XIP Enhanced Mode

  我们知道NOR Flash因为支持主设备随机读取其任意地址处的数据,因此从原理上可以用作XIP设备。但因为是串行接口,所以不能直接XIP(没有独立并行地址线,CPU无法直接寻址),需要FlexSPI外设在底层完成AHB总线读访问的实时响应工作,这个实时响应工作就是FlexSPI的XIP特性。

  FlexSPI的XIP特性可以支持任意串行NOR Flash,对Flash厂商设计没要求。为了提升XIP代码执行效率,FlexSPI中也集成了XIP Enhanced Mode特性(其实就是Continuous read模式),见下图,CS1是包含CMD子序列的读时序(即第一次CS),CS2/3(包括后续所有CS)相比CS1少了CMD子序列,这就是Continuous read访问时序。

  FlexSPI的XIP Enhanced Mode特性并不能够用于任意串行NOR Flash,这对Flash厂商设计有要求,必须Flash本身支持Continuous read模式才行。

1.2 Fast Read Quad I/O Continuous read时序

  了解了XIP Enhanced Mode,我们再来看LUT里Quad I/O Read SDR Continuous read传输序列,它由CMD_SDR + RADDR_SDR + MODE8_SDR + DUMMY_SDR + READ_SDR + JMP_ON_CS + STOP七个子序列组成,如下表所示。

  这个Continuous read传输序列相比Non-Continuous read传输时序主要有两处区别:

1. 原MODE8_SDR子序列里参数值不同:这个参数值用于通知Flash器件当前传输类型(Non-Continuous read/Continuous read),具体数值由Flash厂商定义。下图是以Cypress S25FS-S系列Flash为例的,0xA0表明Flash需进入/保持Continuous read模式。
2. 新增了JMP_ON_CS子序列:该子序列是FlexSPI外设实现Continuous read的核心,第一次CS有效传输时序里CMD_SDR子序列命令码会被自动存在该子序列参数值里,这样后续传输FlexSPI就不用再发命令码了。

  LUT中Quad I/O Read DDR Continuous read传输序列如下,差异与前面SDR下的分析一致,这里不予赘述。

二、不同Flash厂商关于Continuous read特性设计

  现在跟着痞子衡去看几家主流Flash厂商关于Continuous read特性的设计(如果你想快速确认某一款型号Flash是否支持这个特性,找到其数据手册搜索"Continuous read"看有没有如下时序图):

2.1 赛普拉斯S25FS-S系列

  MODE子序列里参数值M[7:4]通过包含/不包含Command子序列来控制下一次读传输时序的长度,M[7:4] = 0xA则进入/保持Continuous Read模式,否则不进入/退出。

2.2 Adesto AT25SL系列

  MODE子序列里参数值M[7:4] = 0xA则进入/保持Continuous Read模式,否则不进入/退出。

2.3 芯成IS25WP系列

  MODE子序列里参数值M[7:4] = 0xA则进入/保持AX Read模式(就是Continuous Read),否则不进入/退出。

2.4 华邦W25QxxJV-DTR系列

  MODE子序列里参数值M[5:4] = 2'b10则进入/保持Continuous Read模式,否则不进入/退出。 如果要退出Continuous Read模式,Flash数据手册里特别推荐下一次时序里命令码临时设为0xFF,以保证M4=1使得Flash彻底回到Non-Continuous Read模式。

2.5 兆易创新GD25Q系列

  MODE子序列里参数值M[5:4] = 2'b10则进入/保持Continuous Read模式,否则不进入/退出。

三、在i.MXRT1170-EVK上实战(IS25WP128)

  了解了上面关于Continuous read模式知识后,我们在恩智浦i.MXRT1170-EVK板子上实践一下。默认连接的Flash是IS25WP128,这款Flash是支持Continuous read模式的,我们随便在SDK包里找一个XIP例程,修改工程里 evkmimxrt1170_flexspi_nor_config.c 文件里的 FDCB 启动头如下(主要就是改LUT表),改完下载程序进Flash运行,代码执行效率应该会有所提升(等下一篇QPI模式文章写完,痞子衡会设计一个用例一起来实测下性能)。

const flexspi_nor_config_t qspiflash_config_100mhz_sdr_cont = {
.memConfig =
{
.tag = FLEXSPI_CFG_BLK_TAG,
.version = FLEXSPI_CFG_BLK_VERSION,
.readSampleClkSrc = kFlexSPIReadSampleClk_LoopbackFromDqsPad,
.csHoldTime = 3u,
.csSetupTime = 3u,
// Enable Safe configuration
.controllerMiscOption = 0x10,
.deviceType = kFlexSpiDeviceType_SerialNOR,
.sflashPadType = kSerialFlash_4Pads,
.serialClkFreq = kFlexSpiSerialClk_100MHz,
.sflashA1Size = 16u * 1024u * 1024u,
.lookupTable =
{
// Fast Read Quad I/O LUTs
[4*CMD_LUT_SEQ_IDX_READ + 0] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xEB, RADDR_SDR, FLEXSPI_4PAD, 0x18),
// MODE8_SDR里参数值填入0xA0
[4*CMD_LUT_SEQ_IDX_READ + 1] = FLEXSPI_LUT_SEQ(MODE8_SDR, FLEXSPI_4PAD, 0xA0, DUMMY_SDR, FLEXSPI_4PAD, 0x04),
// 增加JMP_ON_CS子序列
[4*CMD_LUT_SEQ_IDX_READ + 2] = FLEXSPI_LUT_SEQ(READ_SDR, FLEXSPI_4PAD, 0x04, JMP_ON_CS, FLEXSPI_1PAD, 0x01),
[4*CMD_LUT_SEQ_IDX_READ + 3] = FLEXSPI_LUT_SEQ(STOP, FLEXSPI_1PAD, 0x00, 0, 0, 0),
},
},
.pageSize = 256u,
.sectorSize = 4u * 1024u,
.blockSize = 256u * 1024u,
.isUniformBlockSize = false,
};

  至此,在FDCB里使能串行NOR Flash的Continuous read模式痞子衡便介绍完毕了,掌声在哪里~~~

欢迎订阅

文章会同时发布到我的 博客园主页CSDN主页知乎主页微信公众号 平台上。

微信搜索"痞子衡嵌入式"或者扫描下面二维码,就可以在手机上第一时间看了哦。

痞子衡嵌入式:在i.MXRT启动头FDCB里使能串行NOR Flash的Continuous read模式的更多相关文章

  1. 痞子衡嵌入式:在i.MXRT启动头FDCB里使能串行NOR Flash的QPI/OPI模式

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是在FDCB里使能串行NOR Flash的QPI/OPI模式. 我们知道 Flash 读时序里有五大子序列 CMD + ADDR + MO ...

  2. 痞子衡嵌入式:在i.MXRT启动头FDCB里使能串行NOR Flash的DTR模式

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是在FDCB里使能串行NOR Flash的DTR模式. 前两篇文章 <IS25WP系列Dummy Cycle设置> 与 < ...

  3. 痞子衡嵌入式:串行NOR Flash的Continuous read模式下软复位后i.MXRT无法启动问题解决方案之RESET#

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT上使能NOR Flash的Continuous read模式在软复位后无法正常启动问题的解决经验. 前一篇文章 <在i ...

  4. 痞子衡嵌入式:从头开始认识i.MXRT启动头FDCB里的lookupTable

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT启动头FDCB里的lookupTable. 一个MCU内部通常有很多外设模块,这些外设模块是各MCU厂商做差异化产品的本质, ...

  5. 痞子衡嵌入式:在i.MXRT启动头FDCB里调整Flash工作频率也需同步设Dummy Cycle

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是Flash工作频率与Dummy Cycle的联系. 上一篇文章 <从头开始认识i.MXRT启动头FDCB里的lookupTable ...

  6. 痞子衡嵌入式:在串口波特率识别实例里逐步展示i.MXRT上提升代码执行性能的十八般武艺

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是在串口波特率识别实例里逐步展示i.MXRT上提升代码执行性能的十八般武艺. 恩智浦 MCU SE 团队近期一直在加班加点赶 SBL 项目 ...

  7. 痞子衡嵌入式:i.MXRT连接特殊Octal Flash时(OPI DTR模式下反转字节序)下载与启动注意事项(以MX25UM51245为例)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是OPI DTR模式下反转字节序的Octal Flash在i.MXRT下载与启动注意事项. 在恩智浦官方参考设计板 MIMXRT595-E ...

  8. 痞子衡嵌入式:i.MXRT中FlexSPI外设对AHB Burst Read特性的支持

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是FlexSPI外设对AHB Burst Read特性的支持. 痞子衡之前写过一篇关于FlexSPI LUT的文章 <从头开始认识i ...

  9. 痞子衡嵌入式:i.MXRT中FlexSPI外设不常用的读选通采样时钟源 - loopbackFromSckPad

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是i.MXRT中FlexSPI外设不常用的读选通采样时钟源 - loopbackFromSckPad. 最近碰到一个客户,他们在 i.MX ...

随机推荐

  1. wrf模拟的domain图绘制

    wrf模拟的区域绘制,domain图,利用python的cartopy库绘制模拟区域 参考Liang Chen的draw_wrf_domian.py这个代码, 出处python画wrf模式的模拟区域 ...

  2. java面试-垃圾回收器谈谈你的理解

    一.垃圾回收算法: 引用计数 复制算法 标记-清除 标记-整理 二.垃圾回收的方式: 串行(Serial).并行(Parallel).并发(CMS).G1 1.串行垃圾回收器(Serial) 它为单线 ...

  3. docker命令快速入门

    docker快速入门系列 Docker hello world hello world $ docker run ubuntu:15.10 /bin/echo "Hello world&qu ...

  4. B1029/A1048 旧键盘损坏了,在输入一段文字时坏了的键不可以正常使用,现给出应输入的一段文字,和实际输出的文字,找出坏掉的键。

    #include<cstdio> #include<cstring> const int maxn = 1000; bool HashTable[maxn] = { false ...

  5. Spring学习笔记(五):JDBCTemplate+事务管理

    1 概述 Spring为开发者提供了JDBCTemplate,可以简化很多数据库操作相关的代码,本文主要介绍JDBCTemplate的使用以及事务管理功能. 2 JDBC Template 2.1 配 ...

  6. fiddler 手机抓包(含https) 完整流程

    第一部分:下载并安装fiddler 一.使用任一浏览器搜索[fiddler下载安装],并下载fiddler 安装包. 二.fiddler安装包下载成功后,将下载的fiddler压缩包解压到自定义文件夹 ...

  7. Flutter 状态管理- 使用 MobX

    文 / Paul Halliday, developer.school 创始人 众所周知,状态管理是每个软件项目都需要持续迭代更新的方向.它并不是一个「一次性」的工作, 而需要不断确保你遵循的最佳实践 ...

  8. Django 模板(Template)

    1. 模板简介 2. 模板语言 DTL 3. 模板继承 4. HTML 转义 5. CSRF 1. 模板简介 作为 Web 开发框架,Django 提供了模板,可以很便利的动态生成 HTML.模版系统 ...

  9. k8s deployment

    案例01 apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment spec: selector: matchLabe ...

  10. 2. robot framework 关键字,变量,循环

    1 关键字的使用 RF的能力是由关键字提供的,所以,我们必须对RF的常用关键字有个了解,这样才能把RF用好. 最常用的关键字就在RF的标准库中 http://robotframework.org 其中 ...