QSPI Flash存储控制器(间接读访问控制器)

QSPI Flash存储控制器(间接读访问控制器)

        间接访问控制器包括:间接读访问控制器和间接写访问控制器。

1. 间接读控制器

        间接读操作主要是用于从Flash存储中读取大量的数据。软件通过特殊APB控制配置寄存器来控制和触发间接访问操作。这些寄存器包括:间接读传输控制器(偏移量0x60),间接读传输水位寄存器(偏移量0x64),间接传输起始地址寄存器(偏移量0x68)和间接读传输字节数量寄存器(偏移量0x6C)。间接读控制器和底层SPI协议状态机模块交互,从而完成高效、优化的Flash读突发操作,将数据从Flash存储中传输到内部SRAM,然后等待外部AHB总线主设备(外部DMA)再次将数据从内部SDRAM传输到系统主存中。

        默认情况下,间接读控制器是关闭去能的。在使能该控制器之前,软件必须配置数据起始地址(我认为是Flash存储的地址)和数据长度,参见间接传输起始地址寄存器(偏移量0x68)和间接读传输字节数量寄存器(偏移量0x6C)。每次编程最多同时实现两个间接操作。当第一个间接操作在处理过程中,第二个间接操作可以触发。 这样一来,两个间接操作之间的切换延迟就比较小了。

        间接读操作的数据字节长度不受内部SRAM长度限制。内部SRAM长度仅仅限制了DMA的请求长度。当SRAM充满溢出时,控制器会回压Flash读操作(进行流控),直到SRAM又有空闲空间。Flash读流控首先会完成当前读突发操作,然后一直等待,直到SRAM有空闲空间,再从上次结束地址上触发新的读突发。  

        外部AHB总线主设备,例如DMA或CPU,通过AHB读操作来获取间接读控制器读取Flash存储的数据。AHB读操作的AHB地址必须在[ AHB间接触发器地址, AHB间接触发器地址 + AHB间接触发器地址范围-1] www的范围内。AHB间接触发器地址寄存器(偏移量0x1C),AHB间接触发器地址范围寄存器(偏移量0x80),其中AHB间接触发器地址范围寄存器是以2的幂次来描述的,例如如果该寄存器默认值为4,那么默认范围就是16字节长度。允许比16字节长度更短。另外,这个范围内的数据在Flash存储地址上不一定是连续的。这地址只是SRAM作为间接读数据源的AHB总线地址。每次有效的AHB总线读会自动将SRAM数据弹出(清空),因此设计上是将AHB地址和Flash地址解耦而不是直接映射。注意:AHB间接触发器地址和Flash存储上的地址没有任何关系。间接读操作的Flash地址是来自间接传输起始地址寄存器(偏移量0x68)。

        如果AHB读访问的AHB总线地址不在[ AHB间接触发器地址, AHB间接触发器地址 + AHB间接触发器地址范围-1] 这个范围内,直接访问控制器就会来处理。

          如果AHB读访问的AHB总线地址在[ AHB间接触发器地址, AHB间接触发器地址 + AHB间接触发器地址范围-1] 这个范围内,但是SRAM还没准备好读请求的数据,那么AHB读操作就会一直等,直到数据从Flash传输到SRAM。

        如果AHB读突发访问一开始还在这个地址范围内,但是后面超出这个地址范围,硬件上会先由间接访问控制器来处理,后面部分由直接访问控制器来处理。注意:这很可能是软件驱动配置错误。

        外部AHB总线主设备,例如DMA,在间接传输的最后一个32位之前,只允许32位AHB读操作。主要为了简化SRAM控制逻辑设计。针对最后一次的读,外部主设备可能是发起16位或8位的访问;在这种情况下,最后一次依然可以实现为32位读,间接读控制器会将无效的高位设置为零。

         我们希望在读操作过程中,SRAM总是保持相比比较满足的状态。驱动程序可以通过SRAM填充水平寄存器(0x2C)来获取相关信息。采用DMA方式通过AHB总线从SRAM中读取数据,每次DMA传输的数据是整个间接传输数据的一部分(我的理解是每次DMA传输的数据量不能太大,担心SRAM还没有准备好数据)。

        间接操作可以通过间接读传输控制寄存器的bit[1]位,随时取消。

        软件驱动通过SRAM填充水平寄存器(0x2C)了解SRAM使用情况,然后判断何时从SRAM中读取数据。当不使用外部DMA时,SRAM从Flash存储接收到数据超过阈值(间接读传输水印寄存器(偏移量0x64)定义该阈值),就会触发中断。当阈值大于零时,QSPI控制器对Flash存储的读操作的最后一个字节被放置到SRAM时,(无论SRAM中的数据状况),都会触发中断。注意:当使用DMA时,硬件来控制速率(这个过程也用到了间接读传输水印寄存器);当不使用DMA时,软件来控制速率,参见本段描述。

        间接操作状态有两个中断源:

  1. 当间接操作完成时触发的中断;
  2. 如果驱动软件请求一次间接读操作时,在QSPI控制器的缓存中还有两个间接操作没有完成,最新的请求会触发中断。

        间接读传输控制寄存器的bit[0]表示启动一次间接读操作;间接读传输控制器bit[2]用于检查状态。

2. 间接读传输过程

        间接读传输过程分两种情况:第一种情况是设计中使用DMA;第二种情况是设计中不使用DMA。

2.1设计中使用DMA情况

  1. 设置QSPI配置寄存器(0x00)
  2. 设置间接传输水印寄存器(0x64)
  3. 设置间接读传输起始地址寄存器(0x68)
  4. 设置间接读传输字节数量寄存器(0x6c)
  5. 设置间接AHB地址触发器寄存器(0x1c)
  6. 设置间接触发器地址范围寄存器(0x80)
  7. 设置DMA外设配置寄存器(0x20)-------------配置DMA突发传输类型
  8. 设置间接读传输控制器寄存器的bit[0]-----------这是间接读访问启动,那么DMA什么时候开始传输数据?
  9. 轮询间接读传输控制器bit[5],这是一个写清零位(软件用于确认一次间接读操作)。另外,间接读操作完成也会触发中断。
  10. 间接读传输控制器的bits[7:6]描述了已经完成的、但软件还未确认的间接读操作数量。

2.2设计中不使用DMA情况

  1. 设置QSPI配置寄存器(0x00)
  2. 设置间接读传输起始地址寄存器(0x68)
  3. 设置间接读传输字节数量寄存器(0x6c)
  4. 设置间接AHB地址触发器寄存器(0x1c)
  5. 设置间接触发器地址范围寄存器(0x80)
  6. 如果阈值中断特性被设置,设置间接传输水印寄存器(0x64)
  7. 设置间接读传输控制器寄存器的bit[0]-----------这是间接读访问启动
  8. 如果阈值中断特性被设置,就等中断;如果没有中断,就轮询SRAM填充水平寄存器(0x2C),判断SRAM内接收的数据情况。
  9. 采用PIO方式从SRAM中读数据到系统主存。第8步和第9步交替使用,直到读取数据结束。
  10. 间接读传输控制器寄存器bit[5]表示间接读操作完成情况。
  11. 间接读操作完成后触发中断。

猜你喜欢

转载自blog.csdn.net/lsshao/article/details/119772482