AXI DMA IP核操作流程

  • 直接寄存器模式

访问DMACR,SA,DA,length寄存器初始化DMA传输,当传输完成,相关通道的DMASR.IOC_Irq有效(前提是使能该中断,DMACR.IOC_IrqEn使能)。

MM2S 通道启动流程:

  1. MM2S_DMACR.RS=1,运行DMA
  2. 使能MM2S_DMACR.IOC_IrqEn 和MM2S_DMACR.Err_IrqEn
  3. 配置有效的MM2S_SA和MM2S_SA_MSB寄存器
  4. 写非零的数值到MM2S_LENGTH寄存器,启动读DDR发送至AXIS端口。该数值为读取内存的字节数量

S2MM通道启动流程:

  1. S2MM_DMACR.RS=1,运行DMA
  2. 使能S2MM_DMACR.IOC_IrqEn 和S2MM_DMACR.Err_IrqEn
  3. 配置有效的S2MM_DA和S2MM_SA_MSB寄存器
  4. 写非零的数值到S2MM_LENGTH寄存器,启动AXIS端口数据写入DDR。此数值需要大于等于一包数据的字节数。

在直接寄存器模式下,上述启动流程需要循环使用,每读写一次,均需要重新配置以上寄存器。

每个流程的结束,会产生中断告知CPU数据操作完成,需要CPU清除IOC_Irq寄存器中断标志。

  • SG模式

配置控制寄存器和描述符之后,SG模式启动。可以极大的提高DMA性能。

MM2S通道启动流程:

  1. 配置MM2S_CURDESC和MM2S_CURDESC_MSB寄存器,写入开始操作符的地址。
  2. 配置MM2S_DMACR.RS=1,运行DMA
  3. 寄存器MM2S_DMACR.IOC_IrqEn 和MM2S_DMACR.Err_IrqEn使能
  4. 配置MM2S_TAILDESC和MM2S_TAILDESC_MSB,此时DMA启动读取内存中的描述符
  5. DMA自动处理操作符并读取内存数据通过AXIS端口输出

S2MM通道启动流程:

  1. 配置S2MM_CURDESC和S2MM_CURDESC_MSB寄存器,写入开始操作符的地址。
  2. 配置S2MM_DMACR.RS=1,运行DMA
  3. 寄存器S2MM_DMACR.IOC_IrqEn 和S2MM_DMACR.Err_IrqEn使能
  4. 配置S2MM_TAILDESC和S2MM_TAILDESC_MSB,此时DMA启动读取内存中的描述符
  5. DMA自动处理操作符并接收AXIS端口数据写入内存中

每个流程结束(DMA接收到带有EOF的操作符),DMA产生中断至CPU,需要CPU清除IOC_Irq寄存器中断标志,重新操作上述流程。

  • 循环DMA模式

此模式下,DMA可以处理相同的缓冲描述符,并不产生中断。此模式下DMA持续工作,除非出现异常停止或者复位。

此模式的关键是,tail描述符指向first描述符。设置Cyclic BD Enable为1(需要在DMA运行之前配置)。

其余流程与SG模式一致。

版权声明:本文为CSDN博主「yindq1220」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yindq1220/article/details/122448292

生成海报
点赞 0

yindq1220

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

AXI DMA IP核操作流程

直接寄存器模式 访问DMACR,SA,DA,length寄存器初始化DMA传输,当传输完成,相关通道的DMASR.IOC_Irq有效(前提是使能该中断&#xf

MDK 分散加载文件剖析(一)

1、何为分散加载? 1.1 简介 分散加载就是我们开发者能指定你的 代码 或者 数据变量 到指定的内存空间中运行。通知链接器把程序的某一部分连接在存储器的某个地址空间,我们可以通过编写一个分散加载文件来指定 ARM

Arduino接收串口发送的数据

一、我们可以通过Arduino发送数据给电脑通过串口监视器进行观察 二、可以通过调用函数Serial.available()来判断有没有数据发送过来,从而接收数据。 三、函数Serial.read()可以读取串口