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