痞子衡嵌入式:在i.MXRT启动头FDCB里使能串行NOR Flash的Continuous read模式
大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是在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模式的更多相关文章
- 痞子衡嵌入式:在i.MXRT启动头FDCB里使能串行NOR Flash的QPI/OPI模式
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是在FDCB里使能串行NOR Flash的QPI/OPI模式. 我们知道 Flash 读时序里有五大子序列 CMD + ADDR + MO ...
- 痞子衡嵌入式:在i.MXRT启动头FDCB里使能串行NOR Flash的DTR模式
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是在FDCB里使能串行NOR Flash的DTR模式. 前两篇文章 <IS25WP系列Dummy Cycle设置> 与 < ...
- 痞子衡嵌入式:串行NOR Flash的Continuous read模式下软复位后i.MXRT无法启动问题解决方案之RESET#
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT上使能NOR Flash的Continuous read模式在软复位后无法正常启动问题的解决经验. 前一篇文章 <在i ...
- 痞子衡嵌入式:从头开始认识i.MXRT启动头FDCB里的lookupTable
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT启动头FDCB里的lookupTable. 一个MCU内部通常有很多外设模块,这些外设模块是各MCU厂商做差异化产品的本质, ...
- 痞子衡嵌入式:在i.MXRT启动头FDCB里调整Flash工作频率也需同步设Dummy Cycle
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是Flash工作频率与Dummy Cycle的联系. 上一篇文章 <从头开始认识i.MXRT启动头FDCB里的lookupTable ...
- 痞子衡嵌入式:在串口波特率识别实例里逐步展示i.MXRT上提升代码执行性能的十八般武艺
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是在串口波特率识别实例里逐步展示i.MXRT上提升代码执行性能的十八般武艺. 恩智浦 MCU SE 团队近期一直在加班加点赶 SBL 项目 ...
- 痞子衡嵌入式:i.MXRT连接特殊Octal Flash时(OPI DTR模式下反转字节序)下载与启动注意事项(以MX25UM51245为例)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是OPI DTR模式下反转字节序的Octal Flash在i.MXRT下载与启动注意事项. 在恩智浦官方参考设计板 MIMXRT595-E ...
- 痞子衡嵌入式:i.MXRT中FlexSPI外设对AHB Burst Read特性的支持
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是FlexSPI外设对AHB Burst Read特性的支持. 痞子衡之前写过一篇关于FlexSPI LUT的文章 <从头开始认识i ...
- 痞子衡嵌入式:i.MXRT中FlexSPI外设不常用的读选通采样时钟源 - loopbackFromSckPad
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是i.MXRT中FlexSPI外设不常用的读选通采样时钟源 - loopbackFromSckPad. 最近碰到一个客户,他们在 i.MX ...
随机推荐
- 【linux】驱动-7-平台设备驱动
目录 前言 7. 平台设备驱动 7.1 平台总线 7.1.1 平台总线注册和匹配方式 7.1.2 源码分析 7.2 平台设备 7.2.1 platform_device 7.2.2 设备信息 7.2. ...
- 每天自学两小时Python,整理了最详细的学习路线和规
上次这篇文章每天自学两小时Python,三个月学通月入20K主要是给大家整理了学习资料视频和PDF书籍,很多需要的都关注私信领取了. 很多朋友领取之后都问我教程有了那么应该从哪去开始学习呢,私信太多我 ...
- Python3 使用requests请求,解码时出错:'utf8' codec can't decode byte 0x83 in position 1: invalid start byte
requests请求的响应内容能够通过几个属性获得: response.text 为解码之后的内容,解码会根据响应的HTTP Header中的Content-Type选择字符集.例如 1 " ...
- Elasticsearch集群升级指引
目录 背景 第一部分 版本升级指引 第二部分 升级方法和具体步骤 总结 参考文献及资料 背景 Elasticsearch集群的版本升级是一项重要的集群维护工作.本篇文章参考官方文档,将详细介绍相关细节 ...
- 通过Dapr实现一个简单的基于.net的微服务电商系统(四)——一步一步教你如何撸Dapr之订阅发布
之前的章节我们介绍了如何通过dapr发起一个服务调用,相信看过前几章的小伙伴已经对dapr有一个基本的了解了,今天我们来聊一聊dapr的另外一个功能--订阅发布 目录:一.通过Dapr实现一个简单的基 ...
- Spring Boot自动配置原理
使用Spring Boot之后,一个整合了SpringMVC的WEB工程开发,变的无比简单,那些繁杂的配置都消失不见了,这 是如何做到的? 一切魔力的开始,都是从我们的main函数来的,所以我们再次来 ...
- NOI2020游记
我今年高一,这是我第一年作为正选参加NOI. 去年NOI没写游记,结果前两天想要复盘NOI2019的时候发现只能回想起一些模糊的记忆了.为了防止明年再遇到这种情况(其实我更希望没有明年),就有了这篇游 ...
- Oracle-DG最大保护模式下,dg备库出现问题对主库有什么影响?
一.需求 疑问?Oracle最大保护模式下,dg备库出现问题,影响主库吗? 我们都知道Oracle最大保护模式的意思是oracle不允许数据丢失,1条记录都不行! 那么备库有问题? oracle主库还 ...
- JDBC_15_悲观锁和乐观锁
悲观锁和乐观锁 并发控制 当程序中可能出现并发操作的情况时,就需要保证在并发操作的情况下数据的准确性,以此确保当前用户和其他用户一起操作时,所得到的结果和某个用户单独操作时的结果是一样的.这种手段就叫 ...
- C - The Suspects POJ - 1611(并查集)
Severe acute respiratory syndrome (SARS), an atypical pneumonia of unknown aetiology, was recognized ...