痞子衡嵌入式:i.MXRT中FlexSPI外设对AHB Burst Read特性的支持
大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是FlexSPI外设对AHB Burst Read特性的支持。
痞子衡之前写过一篇关于FlexSPI LUT的文章 《从头开始认识i.MXRT启动头FDCB里的lookupTable》,这个LUT机制是i.MXRT上能够实现对串行NOR Flash进行AHB读访问的原因(也是程序能够XiP原地执行的基础)。那篇文章的最后留了一个小伏笔,即FlexSPI的Prefetch不使能,SEQ_CTL工作一次获取的数据由AHB Burst Read策略决定,那么这个Burst Read策略到底是什么?今天痞子衡来跟大家好好聊一聊:
一、什么是Burst Read?
说起Burst Read概念,其实也没啥玄机,中文直译就叫突发读取(其实有个更接地气的翻译:连续读取),这个概念要跟Single Read(或者Random Read)对比来看。
对于一个NOR Flash器件而言,主设备(这里指i.MXRT)如果要读取它的内容,必须按照手册规定的读时序,这个读时序中肯定有我们要提供地址信息,这样Flash器件才能知道该把哪个地方的数据送出来。在一次读时序中(一个CS拉低期间,发送一次地址信息),Single Read就是读取固定大小的数据(比如4bytes),而Burst Read可以灵活调整读取数据的长度(一般来说用于一次读取更长的数据)。
二、AMBA AHB支持哪些Burst Type?
前面讲了,Burst Read可以灵活调整读取数据的长度,即当前读时序内,地址信息发送完后,主设备想读多少byte数据相应输出所需的SCK时钟数即可(地址根据上次访问按序自增),那么主设备是不是可以任意输出SCK时钟呢?一般情况下是的,这种就是典型的线性递增类型(简称INCR)。
除了INCR类型外,还有另一种环绕类型(简称WRAP),这种类型下,主设备输出SCK时钟并不总是得到线性地址递增的数据,而是在一个指定长度数据块里不断循环,这种类型应用场景更多在RAM型器件(比如用于栈)。
下表是ARM官方 AMBA Specification 第 3.6 Burst operation 小节里关于Burst Type全部定义与解释。我们主要关注INCR类:INCR4/8/16一次访问长度是4/8/16 * data block (具体data block大小由HSIZE[2:0]决定),INCR即不定长度。
在 AMBA Specification 里找到关于HSIZE[2:0]定义如下,这个HSIZE是由AHB master根据访问自动设置的。
下图是典型的INCR型不定长Burst访问时序图,图中共有两次INCR型Burst:第一次INCR Burst共读取4bytes,Burst开始于HADDR = 0x20处,共发起了HSIZE = Halfword的两次传输;第二次INCR Burst共读取12bytes,Burst开始于HADDR = 0x5c处,共发起了HSIZE = Word的三次传输。
Note: HTRANS共有四种传输类型:IDLE、BUSY、NONSEQ、SEQ,前两种顾名思义,NONSEQ代表一次Burst的首次传输,SEQ代表一次Burst的后续传输。
三、FlexSPI对AHB Burst Read的支持
现在我们回到FlexSPI的LUT机制,在它的指令集关于读写序列的解释里,特别提到了当访问类型是AHB的时候,一次访问的数据长度取决于Burst Size和Burst Type。
Burst type一共有如下8种(其实对应了AMBA AHB Burst Type),Burst size也有8/16/32/64bits四种(即data block,未完全实现HSIZE[2:0]里定义的所有值),FlexSPI模块会自动响应AHB master访问请求来调度Burst type和Burst size去完成对应Flash的访问。
下表具体解释了FlexSPI模块对于AHB读访问的响应,表中 hbeat_start_address 就是上一小节里Burst访问时序里的HADDR[31:0]值,即AHB master当前节拍下(beat)要读的地址;hburst_start_address 是当前Burst类型下访问总长度区域的首地址,hburst_end_address 就是当前Burst类型下访问总长度区域的末地址加1。表中特别强调了当Prefetch被关掉后,INCR型Burst下每个节拍访问均会被当做SINGLE Burst来处理。
现在我们终于理解,FlexSPI的SEQ_CTL工作一次获取的数据其实是受AHB master控制的。当Prefetch不使能的时候,FlexSPI就是个身不由己的数据传送器,AHB master怎么要求,FlexSPI就怎么做。只有开了Prefetch功能,FlexSPI才会有灵魂,它会利用自己1KB大小的AHB RX Buffer干一些取巧的事。
至此,FlexSPI外设对AHB Burst Read特性的支持痞子衡便介绍完毕了,掌声在哪里~~~
欢迎订阅
文章会同时发布到我的 博客园主页、CSDN主页、知乎主页、微信公众号 平台上。
微信搜索"痞子衡嵌入式"或者扫描下面二维码,就可以在手机上第一时间看了哦。

痞子衡嵌入式:i.MXRT中FlexSPI外设对AHB Burst Read特性的支持的更多相关文章
- 痞子衡嵌入式:实抓Flash信号波形来看i.MXRT的FlexSPI外设下AHB读访问情形(无缓存)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是实抓Flash信号波形来看i.MXRT的FlexSPI外设下AHB读访问情形. 上一篇文章 <i.MXRT中FlexSPI外设对A ...
- 痞子衡嵌入式:关于i.MXRT中FlexSPI外设lookupTable里配置Normal read的一个小误区
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT中FlexSPI外设lookupTable里配置Normal read的一个小误区. 关于串行四线NOR Flash,当其作 ...
- 痞子衡嵌入式:理解i.MXRT中FlexSPI外设lookupTable里配置访问行列混合寻址Memory的参数值
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT中FlexSPI外设lookupTable里配置访问行列混合寻址Memory的参数值. 关于 FlexSPI 外设的 loo ...
- 痞子衡嵌入式:i.MXRT中FlexSPI外设不常用的读选通采样时钟源 - loopbackFromSckPad
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是i.MXRT中FlexSPI外设不常用的读选通采样时钟源 - loopbackFromSckPad. 最近碰到一个客户,他们在 i.MX ...
- 痞子衡嵌入式:其实i.MXRT下改造FlexSPI driver同样支持AHB方式去写入NOR Flash
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT下改造FlexSPI driver以AHB方式去写入NOR Flash. 痞子衡前段时间写过一篇 <串行NAND Fl ...
- 痞子衡嵌入式:在i.MXRT启动头FDCB里使能串行NOR Flash的DTR模式
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是在FDCB里使能串行NOR Flash的DTR模式. 前两篇文章 <IS25WP系列Dummy Cycle设置> 与 < ...
- 痞子衡嵌入式:在i.MXRT启动头FDCB里使能串行NOR Flash的Continuous read模式
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是在FDCB里使能串行NOR Flash的Continuous read模式. 前面关于串行Flash传输时序的文章 <Fast R ...
- 痞子衡嵌入式:在串口波特率识别实例里逐步展示i.MXRT上提升代码执行性能的十八般武艺
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是在串口波特率识别实例里逐步展示i.MXRT上提升代码执行性能的十八般武艺. 恩智浦 MCU SE 团队近期一直在加班加点赶 SBL 项目 ...
- 痞子衡嵌入式:i.MXRT全系列下FlexSPI外设AHB Master ID定义与AHB RX Buffer指定的异同
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT全系列下FlexSPI外设AHB Master ID定义与AHB RX Buffer指定的异同. 因为 i.MXRT 全系列 ...
随机推荐
- RxHttp - 轻量级、可扩展、易使用、完美兼容MVVM、MVC架构的网络封装类库
前言 RxHttp是基于RxJava2+Retrofit 2.9.0+OkHttp 4.9.0实现的轻量级,完美兼容MVVM架构的网络请求封装类库,小巧精致,简单易用,轻轻松松搞定网络请求. GitH ...
- TERSUS无代码开发(笔记06)-简单实例手机端页面设计
手机端的设计 1.页面说明 2.默认页面===>提交请假单(上面页面双击进入,页面主要编辑区) 2.1默认页面===>提交请假单===>头部区(页面部份主要编辑区01) 2.1.1默 ...
- RabbitMQ之死信队列
1:何为死信队列 死信队列也是一个正常的队列,可以被消费. 但是,死信队列的消息来源于其他队列的转发. 2:如何触发死信队列 1:消息超时 2:队列长度达到极限 3:消息被拒绝消费,并不再重进队列,且 ...
- MYSQL 悲观锁和乐观锁简单介绍及实现
1:悲观锁 1.1 特点: 每次查询都会进行锁行,怕"其他人"进行数据的修改. 1.2 实现步骤: 步骤1:开启事务test1,并对id=2的记录进行查询,并加锁,如: 步骤2 ...
- 用 Hugo 快速搭建博客
用 Hugo 搭建博客 Hugo 是一个用 Go 编写的静态站点生成器,生成速度很快 下面是具体操作: 1.安装 Hugo Windows 用户 使用 Chocolatey 或者 Scoop 快速安装 ...
- 看完我的笔记不懂也会懂----MarkDown使用指南
目录 语法 [TOC] 自动生成目录 1. 标题 2. 文本强调 3. 列表 4. 图片 5. 超链接 6. 文本引用 7. 分割线 8. 代码 9. 任务列表 (MPE专属) 10. 表格 11. ...
- 一篇文章彻底弄懂Android-MVVM
转: 一篇文章彻底弄懂Android-MVVM 在学习一个技术之前,我们首先要搞清为什么要用它.用它以后会有什么好处,这样我们才能有兴趣的学习下去. 一.为什么要用MVVM? 我为什么要用这个什么MV ...
- Mark一个代码量统计工具-Statistic
安装方式 IDEA.Goland系列插件市场搜索Statistic 简单说明 统计纬度比较丰富 基本覆盖常见纬度,如代码行数,文件大小等,各指标取最大最小及平均值. 统计目录为当前项目目录 只有在当前 ...
- C# 基础 - Environment 类
1. 程序根目录: (D:\\...\\WpfApp1\\WpfApp1\\bin\\Debug") string exePath = Environment.CurrentDirector ...
- C语言编程 菜鸟练习100题(21-30)
[练习21]计算自然数的和 0. 题目: 计算自然数的和 1. 分析: 练习使用 for 循环结构.for 循环允许一个执行指定次数的循环控制结构. 2. 程序: #include <stdio ...