DMA传输涉及到的概念
关于DMA传输中的burst、transfer、wrap等概念,请参考上一篇:
https://blog.youkuaiyun.com/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传输。