FlexSPI外设对AHB Burst Read特性的支持
痞子衡嵌入式 2022-09-28
今天给大家介绍的是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特性的支持痞子衡便介绍完毕了,掌声在哪里~~~


本文源自微信公众号:痞子衡嵌入式,不代表用户或本站观点,如有侵权,请联系nick.zong@aspencore.com 删除!

声明: 本文转载自其它媒体或授权刊载,目的在于信息传递,并不代表本站赞同其观点和对其真实性负责,如有新闻稿件和图片作品的内容、版权以及其它问题的,请联系我们及时删除。(联系我们,邮箱:evan.li@aspencore.com )
0
评论
  • 相关技术文库
  • 单片机
  • 嵌入式
  • MCU
  • STM
  • ARMSYS开发板上建立uClinux内核移植

      1.简述  针对“如何在以S3C44B0X为核心的ARMSYS开发板上建立uClinux内核移植”的一个总结,其内容包括对Bootloader的功能分析和u

    12-02
  • 80C51单片机的startup.a51程序模块的作用

    80C51在电源重置后(PowerOnReset)所执行的第一个程序模块并不是使用者的主程序main(),而是一个隐藏在KEIL-C51标准链接库中称为star

    12-01
  • 如何使用AVR单片机写入TEA5767数据

    #include#include#defineucharunsignedchar#defineuintunsignedint#defineulongunsign

    12-01
  • STM32单片机的代码是怎么升级的?

    bootloader设置:staticvoidcheck_boot_mode(void){uint32_tJumpAddress;void(*Jump_To_A

    12-01
  • AVR单片的外部中断应用设计

    #include#include#includeinterrupt.h》voidport_init(void){DDRB=0xff;PORTB=0xff;DDR

    12-01
  • 单片机程序控制指令解析

    表程序控制指令操作码操作数条件转移地址说明AJMPaddr11无条件(PC)←(PC)+2(PC)0-10←addr11短转移,只改变PC的低11位,转移范围2

    12-01
  • 详解51单片机内部结构及功能

    学习单片机的内部结构之前,我们先了解下我们现在正在使用的计算机的几大组成部份:计算机的五个组成部份:运算器:用于实现算术和逻辑运算。计算机的运算和处理都在这里进

    12-01
  • 51单片机NVIC中断控制设计

    对于NVIC的任务,可以概括为三个:1.配置中断向量表--如果不配置,则不能进入中断SCB-》VTOR2.配置系统中断分组--决定了第一和第二优先级各占用的位数

    12-01
  • 51单片机怎么进行加减法计算?

    开发工具:keil仿真工具:proteus代码如下:头文件:inc_all.h1#ifndefINC_ALL_H_2#defineINC_ALL_H_34vol

    12-01
  • 介绍MSP430单片机的端口

      一、端口的定义  端口号是标识主机内唯一的一个进程,IP+端口号就可以标识网络中的唯一进程。在我们通常用的Socket编程中,IP+端口号就是套接字  端口

    12-01
  • PIC单片机开发的几个问题

      PIC单片机在国内日益流行,本文介绍MicrochipPIC系列单片机开发过程中软、硬件设计的一些经验、技巧。  由美国Microchip公司生产的PIC系

    12-01
  • C8051Fxxx程序丢失问题的分析

      1C8051Fxxx单片机简单介绍和Flash结构  C8051Fxxx系列器件是SiliconLabs推出的一个高速单片机系列。这款单片机是完全集成的混合

    12-01
下载排行榜
更多
广告