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模式一致。

 

dma测试时发现的几个问题:

1、S G模式下,S2MM_AXIS_TLAST有效时,DMA会停止工作,然后给ARM发送一个中断,由ARM重新配置DMA描述符,然后控制相关寄存器,重新启动DMA


2、SG循环模式下,S2MM_AXIS_TLAST有效时,DMA不会停止工作,但是会自动切换到下一个描述符的首地址,接受到新的数据后,写在此地址之后。可能导致写地址不连续。

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值