- Forums
- Resources
- About
- Groups
Close
今天我们终于可以进入DMA的实际操作过程,设计到DMA传输的所有细节,包括数据配置,寄存器配置等。
1、DMA数据结构设置
因为我们之前说过DMA传输当中MOVE、TRANSFER和TRANSACTION的区别。所以我们现在直接来说这三种数据结构怎么设置。
MOVE是最基础的传输单元,一个MOVE的数据宽度由位域CHCFGRz.CHDW来定义,其配置表如图表一所示
表一:MOVE数据宽度配置
TRANSFER是由多个MOVE组成的,其中MOVE的个数由位域CHCFGRz.BLKM来配置和计数的,其配置表如表二所示:
表二、TRANSFER中MOVE个数配置表
TRANSACTION我们之前介绍过是由多个TRANSFER组成的,其个数由位域MExCHSR.TCOUNT进行计数控制的。改位域的值通过位域CHCFGRz.TREL写入和更新的。其配置表如表三所示:
表三、TRANSACTION中TRANSFER个数配置表
我们可以看到该位域包含14个数据位,可配置为1到16383个TRANSFER。
图1:MOVE和TRANSFER计数过程
图1展示了MOVE和TRANSFER计数的时序图。
2、DMA地址偏移设置
我们知道,每个DMA move都对应一个源地址或者目标地址。那么在一个DMA transfer传输当中,我们不可能每次都定义一次地址值,这样效率太低下了。因此在DMA控制当中,提供了一种地址自动偏移的机制。可以按照一定的方向以一定的偏移量进行地址偏移。
地址偏移与三个量有关,分别是数据宽度CHCFGRz.CHDW、偏移量MExADICR. SMF、以及偏移方向MExADICR.INCS。表四是对地址偏移的说明:
表四、地址偏移表
下面再给出一个地址偏移的示例
图2、地址偏移示例
如图2所示,数据宽度设置为16bit(也就是说每个地址的数据前16位有效),查表可得源地址偏移为地址递增,偏移量为8个,也就是说地址每增加8就读取一次该地址的数据。而目标地址设置为地址递减,偏移量为4个,也就是说地址每减少4就将数据传输到该地址。
3、DMA传输控制流程
在之前的帖子当中,我们说到DMA结构图里有两个DMA子模块,主要是做请求处理的。它包含传输控制和move引擎控制,是DMA传输过程的主要控制单元。其结构如图3所示:
图3、DMA传输结构图
如图3所示,首先是DMA通道将请求传输到DMA通道仲裁。我们上一帖说明的DMA请求控制就是由软硬件请求到通道仲裁这一阶段的过程。我们说了有软硬件请求的控制,包括使能,启停、标志位、故障中断等等内容。在上上贴我们说明了提到了DMARAM的配置,所有的传输控制设置都会储存到DMARAM当中。我们现在来详细说明一下有哪些控制设置:
3.1控制寄存器配置
(1)标志位寄存器MExCHSR,里面包含TRANSFER计数标志TCOUNT以及中断、DMA异常状态等的标志位。
(2)控制寄存器MExCHCR,里面包含数据宽度、MOVE数目,transfer数目,以及软硬件请求控制当中的一些设置。
(3)地址偏移和中断控制寄存器MExADICR
(4)地址覆盖寄存器MExSHADR
(5)目标地址寄存器MExDADR
(6)目标地址和源地址校验寄存器MExSDCRC
(7)数据读取校验寄存器MExRDCRC
以上地寄存器有些事直接写入的,例如地址寄存器,有些是只读的,需要通过其它寄存器来写入,那么我们来总结一下,我们需要写入的寄存器:
(1)DMA_CHCFGRz (z = 000-063),通道配置寄存器,包含数据宽度、transfer数目配置,以及通道请求的一些设置如下表所示
(2)DMA_ADICRz (z = 000-063) 中断控制和地址偏移寄存器
剩下的就是源地址和目标地址的设置,这些地址在地址map里面可以找到,一般都在地址片段15当中。基本为各个外设使用,也可以自己人为的定义,从一个数组传输到另一个数组也是可以的。(这里面涉及到内存管理的问题,我们有机会再说明)
3.2通道仲裁
DMA控制引擎总是优先仲裁通过优先级高的通道。即使是正在进行的某通道DMA传输,如果有优先级更高的通道传输请求,那么当前的传输停止,传输信息记录到RAM当中,然后将优先级更高的通道传输信息覆盖到当前的DMA传输当中。
好了,以上便是DMA传输过程的说明,到现在为止就说完了DMA的工作原理。下一贴我们来说一个简单的DMA配置如何做。
只有注册用户才能在此添加评论。 如果您已经注册,请登录。 如果您还没有注册,请注册并登录。