DSP的DMA流程详解(状态图)

DMA传输涉及到的概念

关于DMA传输中的burst、transfer、wrap等概念,请参考上一篇:

https://blog.csdn.net/booksyhay/article/details/87790497

DMA流程总览

这里截取DSP器件的技术参考手册中的状态图。高清原图请参考手册的pdf文档。

 传输的开始和结束

先来看一看整个流程图的开始位置和结束位置。

连续模式

在结束位置的右边,涉及到的是“连续”模式 。

 如果禁用连续模式(NO分支),则单次DMA传输结束,RUNSTS置为零。

如果启动连续模式(YES分支),则又跳回到开始位置,等待事件触发DMA传输。

DMA中断

当中断模式CHINTMODE为0时,表示在DMA传输开始产生中断:

 当中断模式CHINTMODE为1时,表示在DMA传输结束时产生中断:

 

BURST传输

burst传输是内环,是单次触发后最小的传输单元(但不是最小的传输数据单元,因为它还可以一次传输多个字)。传输循环由BURST_COUNT控制。

burst传输环在这里:

 图中:

BURST_COUNT为计数器。

burst开始时,BURST_COUNT = BURST_SIZE; 

BURST状态标志BURST_STS = 1。

数据传送的过程:

*DST_ADDR_ACTIVE = *SRC_ADDR_ACTIVE

每完成一个字的数据传送,计数器减一,源地址和目的地址增加步长:

BURST_COUNT --
SRC_ADDR_ACTIVE += SRC_BURST_STEP
DST_ADDR_ACTIVE += DST_BURST_STEP

当BURST_COUNT = 0时,表示burst传输完成,BURST_STS清零。进入transfer循环。

transfer传输

transfer传输是外环。传输循环是由TRANSFER_COUNT控制的。

在tranfer传输的开始,TRANSFER_COUNT = TRANSFER_SIZE;

每完成一次burst传输,TRANSFER_COUNT--;

如果TRANSFER_COUNT大于0,则在判断完地址WRAP后,返回到前面继续下一个burst传输。

 

 

当TRANSFER_COUNT等于0时,transfer结束,状态标志清零:TRANSFERSTS = 0

 

地址WRAP

在transfer传输开始时,加载WRAP_COUNT:


每一次burst完成后,判断WRAP_COUNT。源地址和目的地址分别判断。当WRAP_COUNT大于0时,则自减。当减到0时,发生WRAP事件。

此时更新活动起始地址和活动地址,同时,将WRAP_SIZE加载到WRAP_COUNT。

SRC_WRAP_COUNT = SRC_WRAP_SIZE
SRC_BEG_ADDR_ACTIVE += SRC_WRAP_STEP
SRC_ADDR_ACTIVE = SRC_BEG_ADDR_ACTIVE
DST_WRAP_COUNT = DST_WRAP_SIZE
DST_BEG_ADDR_ACTIVE += DST_WRAP_STEP
DST_ADDR_ACTIVE = DST_BEG_ADDR_ACTIVE

需要重点注意的是:burst传输完成后,先进行transfer步长的处理,再判断地址wrap。当发生地址wrap时,活动地址会再次更新。也就是说,地址wrap会覆盖transfer步长的效果,此时tranfer步长无效。

ONESHOT模式

最后一点是关于ONESHOT模式。

如果ONESHOT=1,在一次burst传输完成后,就不需要等待DMA触发事件,即可立即启动下一个burst传输。

如果ONESHOT=0,则还需要新的触发事件,才能启动下一个burst传输。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值