本文根据《TMS320VC5509 Direct Memory Access (DMA) Controller Reference Guide (Rev. A)》——TI官方提供的文档,翻译整理得到。
TMS320VC5509A资料的官方下载路径:
当一条DMA通道正在传输数据时,DMA控制器开始读和写访问起始地址。一次数据传输完成后,这些地址必须被更新,以便数据连续读和写或以索引的方式分配。有两种层级方式设置地址更新。
与端口关联的通道支持数据猝发,能够提高DMA整体性能。当猝发使能时,DMA控制器实现通道每次以4个要素为一次猝发,而不需要每次单个要素的数据传输。
SARAM和DARAM端口支持这种猝发模式。如果要求的地址范围被设置为同步存储器类型,EMIF端口支持数据猝发;如果设置为异步存储器类型,DMA控制器将执行4个单个存取访问。外设端口不支持猝发模式。
一个通道数据传输可以通过DSP外设产生的一个事件或者一个外部中断引脚产生的事件信号来同步。通过使用DMACCR的SYNC位,能够指定同步事件触发通道活动。在DMACCR寄存器中,每条通道有FS位,能够选择两种同步方式。
如果指定了一个同步事件,DMA访问源和目标时,一旦接受请求,它将根据预先定义的位置和通道编程优先级工作。如果没有选择同步通道(SYNC=0000b),通道被使能(DMACCR寄存器的EN=1)后,会送出一个请求给源端口。如果设置DMA去识别同步时间(SYNC是非0000b的其他值),并且同步事件发生在通道使能之前,通道只有使能,同步事件将被服务。如果要在通道使能之前忽略同步事件发生,最好当通道无效时,将SYNC字段设置为0000b。
当DMA通道设置成同步方式时,同步事件同源端口和目标端口的要素读操作、写操作关联起来。有以下3种情况:
每条通道在它的状态寄存器DMACSR中有一个同步标志(SYNC)。当同步事件发生时,DMA控制器设置标志(SYNC=1)。当DMA控制器接收到同步信号后,完成第一次读访问(传输数据到通道FIFO缓冲),并清除同步标记(SYNC=0)。
DMA控制器能送一个中断给CPU来响应操作事件。每条通道在中断控制寄存器DMACICR中有一个中断使能位(IE),同时在状态寄存器DMACSR中有一些响应状态位。如果下表中的操作事件发生,DMA控制器会检查相应的中断位。
操作事件 | 中断使能位 | 状态位 | 相关中断 |
数据块传输完成 | BLOCKIE | BIOCK | 通道中断 |
最后一帧传输开始 | LASTIE | LAST | 通道中断 |
帧传输完成 | FRAMEIE | FRAME | 通道中断 |
当前帧一半已经传输 | HALFIE | HALF | 通道中断 |
同步事件丢弃 | DROPIE | DROP | 通道中断 |
时间溢出错误发生 | TIMEOUTIE | TIMEOUT | 总线错误中断 |
如果IE为0,没有中断发出,状态位不受影响。
在6条通道中,每条都有自己的中断,如下图所示。通道中断是除了溢出事件外所有使能操作事件逻辑或运算。通过读状态寄存器DMACSR的相应位,能够判断是哪一个事件引起了中断。DMACSR中的位不能自动清除,对DMACSR进行读操作后可以清除所有位。所以,应当在每次中断发生后读DMACSR寄存器,清除即将发生的状态位。
假定正在对通道1进行监控,设置DMACICR寄存器如下所示:
BLOCKIE=0
LASTIE=0
FRAMEIE=1
HALFIE=0
DROPIE=1
当数据帧正在传输或同步事件被丢弃时,通道1中断请求送给CPU。没有其他事件产生通道1中断。为了判断是否是一个或两个事件触发中断,通过读DMACSR状态寄存器中的FRAME和DROP位来完成。
通道1中断使能设置相应的CPU中的中断标志寄存器标志位,CPU可以响应该中断,或忽视该中断。
当一个存储器访问已经被拖延太多周期,就会发生时间溢出错误。DMA的4个标准端口硬件上都支持时间溢出错误检测。
关于DMA控制寄存器的分类和各自位的功能,本文最顶上的链接处的文档中有很详细的说明,自行查阅。