1 概述
DMA控制器可以无需CPU介入而在内部存储器、外部存储器及片上外设之间传送数据,HPI接口也使用DMA辅助端口传送数据。DMA具有如下的特点:
DMA可以独立于CPU工作;
有4个标准端口(port)与DARAM、SARAM、外部存储器和外设相连;
一个辅助端口用于HPI和存储器之间的数据传送;
具有6个通道;
可以设置每个通道的优先级;
每个通道的传输可以由选定事件触发;
当操作完成之后,DMA控制器可向CPU发出中断。
HPI和存储器接口之间的数据传输不使用DMA通道,如果将数据从HPI传给外设接口,必须将存储器当作暂时缓存器使用。在C5509中,HPI和USB模块共用该辅助接口。 2 通道和端口
如前所述,DMA控制器有6个通道,用于4个标准端口之间的数据传送,每个通道可以从某个端口读取数据,也可以将数据写入某个端口。每个通道有一个FIFO缓冲区。如图所示,使数据的传输包括两个阶段:端口读取和端口写入。DMA先从源端口读取数据,并将其放到通道的FIFO缓冲区里,然后再从FIFO缓冲区取出写入目的端口。
DMA控制器的寄存器有两套:一套是配置寄存器,供CPU写入所需的配置值;另一套是工作寄存器,供DMA工作时使用。所以,DMA通道正在进行数据传输时,CPU可以写入下次传输的配置参数,而不影响正在进行的传输。但是,寄存器DMACSDP,DMACCR,DMACICR,DMACSR,DMAGCR,DMAGSCR,和DMAGTCR不能使用这种方式配置。
传输数据时,配置寄存器的内容复制到工作寄存器,DMA控制器则使用工作寄存器的值来控制通道的工作。只要使能DMACCR的en = 1,就进行上述复制。如果使用自动初始化模式DMACCR里的AUTOINIT = 1,则该复制在块传输之间发生。
3 HPI的配置
如下图所示,HPI和DMA通道的关系由DMAGCR寄存器中的EHPIEXCL位确定。
(1)当EHPIEXCL=0,HPI和DMA通道共享DARAM、SARAM和EMIF。
(2)当EHPIEXCL=1,HPI独占DARAM和SARAM,DMA通道只能访问EMIF和外设。
应当注意HPI不能访问外设端口。
4 服务链
每个标准口都可以对6个DMA通道以及HPI同时发来的请求进行仲裁,每个都标准口都有独立的功能服务链,即有软件和硬件来控制的,为访问请求提供服务的方案。虽然4个服务链功能上是独立的,但他们共享一个通用的配置。
1 DMA通道和HPI具有可编程的优先级。通过寄存器DMACCR中的PRIO位可以设置每个通道的优先级,通过寄存器DMAGCR中的EHPIPRIO位可以设置HPI的优先级。
2 不管优先级如何设定,端口对通道和HPI的检测按照固定的顺序循环:0,1,2,3,4,5,HPI,0,1,2,3,4,5,HPI……
3 通道可以通过软件,单个地和服务链连接和断开。
4 DMAGCR库的EHPIEXCL位为1,可以使HPI单独访问DARAM和SARAM口。
5 一个通道与一个同步事件相联系,就不会产生DMA请求。
4 DMA传输配置
1.数据传输单位
DMA通道传输的数据单位有4种:(1)字节(Byte):一个字节是DMA通道最小的数据传输单位;
(2)单元(Element):若干个字节构成的数据传输单位称为一个单元,一个单元可以是8位、16位或32位的。一个单元的传输是不能被中断的。
(3)帧(Frame):若干个单元构成的数据传输单位称为一帧。在一帧的传输过程中不能被中断。
(4)块(Block):若干个帧构成的数据传输单位称为一个块,每个通道一次或多次传输一个块。在块的传输过程中可以被中断。 对于DMA的每个通道,可以定义一块中包括帧的个数,一帧中单元的个数,一个单元中字节的个数。
2.数据打包
DMA控制器具有数据打包功能,比如选择8比特的数据传输而目的端口是32位的数据总线,可以将4个8比特的数据片打包成一个32比特的数据包进行传输,这样会提高DMA的传输速率。DMA控制器的数据打包功能通过参数寄存器DMACSDP中的DST(SRC)PACK字段设定。当DST(SRC)PACK=0时,不打包;
当DST(SRC)PACK=1时,对数据打包后再传输。
3.端口
DMA通道传输的目的端口和源端口由参数寄存器DMACSDP中的DST(SRC)字段来确定。
当DST(SRC)= xx00时,目的(源)端口为SARAM;
当DST(SRC)= xx01时,目的(源)端口为DARAM;
当DST(SRC)= xx10时,目的(源)端口为EMIF;
当DST(SRC)= xx11时,目的(源)端口为Peripheral。
4.数据源和目的地址
DMA控制器采用字节地址,一个DMA通道的数据源起始地址由源起始地址寄存器DMACSSAL和DMACSSAU指定,其中DMACSSAL存放低16位地址,DMACSSAU存放高位地址;目的起始地址由目的起始地址寄存器DMACDSAL和DMACDSAU指定,其中DMACDSAL存放低16位地址,DMACDSAU存放高位地址。
DMA通道在数据传输过程中的地址修改方式由DMACCR寄存器中的DST(SRC) AMODE字段确定。
当DST(SRC)AMODE=00时,目的(源)地址为固定地址,用于单元的传输;
当DST(SRC)AMODE=01时,目的(源)地址在每个单元传输完后自动增加。根据数据的位数是8位、16位还是32位,地址分别增加1、2或4。
当DST(SRC)AMODE=10时,目的(源)地址在每个单元传输完后自动增加一个索引值,索引值由单元索引寄存器DMACEI/DMACSEI确定。
当DST(SRC)AMODE=11时,目的(源)地址在每个单元传输完后按单元索引和帧索引自动增加,索引值由单元索引寄存器DMACEI/DMACSEI和帧索引寄存器DMACFI/DMACSFI确定,又称为双索引。
5 DMA控制器的寄存器
表中列出了DMA控制器的寄存器,其中有三个全局控制寄存器DMAGCR、DMAGSCR和DMAGTCR对所有的通道进行控制,此外还有通道配置寄存器用于对每个通道进行控制。
寄存器名 | 说 明 | 数 量 | DMAGCR | 全局控制寄存器,用于配置HPI | 1 | DMAGSCR* | 全局软件兼容寄存器,用于控制DMA获得目的单元、目的帧索引的方式 | 1 | DMAGTCR* | 全局超时控制寄存器,用于使能或禁止SARAM和DARAM端口的超时计数器 | 1 | DMACCR | 通道控制寄存器,用于配置优先级等 | 每个通道一个 | DMACICR | 通道中断寄存器,用于中断使能 | 每个通道一个 | DMACSR | 状态寄存器 | 每个通道一个 | DMACSDP | 源和目的参数寄存器,用于配置数据块参数 | 每个通道一个 | DMACSSAL | 源起始地址寄存器(低地址) | 每个通道一个 | DMACSSAU | 源起始地址寄存器(高地址) | 每个通道一个 | DMACDSAL | 目的起始地址寄存器(低地址) | 每个通道一个 | DMACDSAU | 目的起始地址寄存器(高地址) | 每个通道一个 |
DMACEN | 单元数量寄存器 | 每个通道一个 | DMACFN | 帧数量寄存器 | 每个通道一个 | DMACEI/DMACSEI | 单元索引寄存器 | 每个通道一个 | DMACFI/DMACSFI | 帧索引寄存器 | 每个通道一个 | DMACDEI* | 目的单元索引寄存器 | 每个通道一个 | DMACDFI* | 目的帧索引寄存器 | 每个通道一个 | DMACSAC* | 源地址计数寄存器 | 每个通道一个 | DMACDAC* | 目的地址计数寄存器 | 每个通道一个 |
*标注的寄存器只在TMS320VC5509a和TMS320VC5510中应用。
1.DMA全局控制寄存器
位 | 字段 | 数值 | 说明 | 15~4 | Reserved |
| 保留位 | 3 | Reserved | 1 | 保留位(通常写入1) | 2 | FREE |
0
1
| 遇到断点时的处理
停止DMA传输
继续DMA传输
| 1 | EHPIEXCL |
0
1
| HPI的配置
与通道共享
独占内部RAM
| 0 | EHPIPRIO |
0
1
| HPI优先级
低优先级
高优先级
|
2.DMA通道控制寄存器
位 | 字段 | 数值 | 说明 | 15~14 | DSTAMODE | 00~11 | 目的地址修改模式 | 13~12 | SRCAMODE | 00~11 | 源地址修改模式 | 11 | ENDPROG |
0
1
| 编程结束 | 10 | Reserved | 0 | 保留位 |
9 | REPEAT |
0
1
| 多次传输配置时的重复条件
在本次传输结束后,只有当ENDPROG=1,才装入新的配置值,开始下次传输
在本次传输结束后,立即装入新的配置值,开始下次传输
|
8 | AUTOINIT |
0
1
| 多次传输配置时的自动初始
自动初始禁止
自动初始使能
| 7 | EN |
0
1
| 通道使能
禁止
使能
| 6 | PRIO |
0
1
| 通道优先级
低优先级
高优先级
| 5 | FS |
0
1
| 帧/单元同步
单元同步
帧同步
| 4-0 | SYNC | | 同步事件 |
3.源和目的参数寄存器
位 | 字段 | 数值 | 说明 | 15~14 | DSTBEN |
00、01
10
11
| 目的端口突发使能
目的端口突发禁止
目的端口突发使能
保留
| 13 | DSTPACK |
0
1
| 目的端口打包使能
禁止
使能
| 12~9 | DST |
xx00
xx01
xx10
xx11
| 目的端口类型
目的端口为SARAM
目的端口为SARAM
目的端口为EMIF
目的端口为Peripherals
| 8~7 | SRCBEN |
00、01
10
11
| 源端口突发使能
禁止
使能
保留
|
6 | SRCPACK |
0
1
| 源端口打包使能
禁止
使能
| 5~2 | SRC | | 源端口类型(同DST) | 1~0 | DATATYPE |
00
01
10
11
| 数据传输单位
8位
16位
32位
保留
|
4.起始地址寄存器
寄存器名 | 位 | 字段 | 说明 | DMACSSAL | 15~0 | SSAL | 源起始地址低16位 | DMACSSAU | SSAU | 源起始地址高位 | DMACDSAL | DSAL | 目的起始地址低16位 | DMACDSAU | DSAU | 目的起始地址高位 |
5.单元数量和帧数量寄存器
寄存器名 | 位 | 字段 | 说明 | DMACEN | 15~0 | ELEMENTNUM | 每帧包含的单元数量 | DMACFN | FRAMENUM | 每块包含的帧数量 |
5.单元索引寄存器和帧索引寄存器
寄存器名 | 位 | 字段 | 说明 | DMACEI/DMACSEI | 15~0 | ELEMENTNDX | 单元索引值 | DMACFI/DMACSFI | FRAMENDX | 帧索引值 | DMACDEI | ELEMENTNDX | 目的单元索引值 | DMACDFI | FRAMENTDX | 目的帧索引值 |
6 使用方法及实例
调用DMA库函数首先要在头文件中包含csl_dma.h文件,接下来介绍DMA配置结构。DMA配置结构名为DMA_Config,DMA_Config包含如下成员:
Uint16 dmacsdp ;DMA 通道控制寄存器
Uint16 dmaccr ;DMA 通道中断寄存器
Uint16 dmacicr ;DMA 通道状态寄存器
(DMA_AdrPtr) dmacssal ;DMA通道源起始地址(低字段)
Uint16 dmacssau ;DMA通道源起始地址(高字段)
(DMA_AdrPtr) dmacdsal ;DMA通道目的地址(低字段)
Uint16 dmacdsau ;通道目的地址(高字段)
Uint16 dmacen ;DMA 通道数据单元数量寄存器
Uint16 dmacfn ;DMA 通道帧数寄存器
对于 CHIP_5509, CHIP_5510PG1_x(x=0, 2)
Int16 dmacfi ;DMA 通道帧索引寄存器
Int16 dmacei ;DMA 通道单元索引寄存器
对于 CHIP_5510PG2_x(x=0, 1, 2), 5509A, 5502
Int16 dmacsfi ;DMA 通道源帧索引寄存器
Int16 dmacsei ;DMA 通道源单元索引寄存器
Int16 dmacdfi ;DMA 通道目的帧索引寄存器
Int16 dmacdei DMA 通道目的单元索引寄存器
DMA_Config myconfig = {
…… }
声明配置结构之后,需要调用DMA_open函数,初始化DMA句柄:
DMA_Handle myhDma;
myhDma = DMA_open(DMA_CHA0, 0);/*打开 DMA通道 0 */
接下来调用DMA_config函数对DMA进行配置:
myconfig.dmacssal =
(DMA_AdrPtr)(((Uint16)(myconfig.dmacssal)<<1)&0xFFFF);
myconfig.dmacdsal =
(DMA_AdrPtr)(((Uint16)(myconfig.dmacdsal)<<1)&0xFFFF);
myconfig.dmacssau - (((Uint32) &src) >> 15) & 0xFFFF;
myconfig.dmacdsau - (((Uint32) &dst) >> 15) & 0xFFFF;
DMA_config(myhDma, &myConfig); /* 配置通道 */
配置完成之后,调用DMA_start()函数开始DMA传送:
DMA_start(myhDma); /*开始传送 */
等待DMA状态寄存器的帧状态位指示传输结束:
while (!DMA_FGETH(myhDma, DMACSR, FRAME))
{
}
之后关闭句柄:
DMA_close(myhDma); /*关闭通道 */
|