DSP

TI DSP DMA配置

2019-07-13 09:57发布

1 概述 DMA控制器可以无需CPU介入而在内部存储器、外部存储器及片上外设之间传送数据,HPI接口也使用DMA辅助端口传送数据。DMA具有如下的特点: DMA可以独立于CPU工作; 4个标准端口(port)与DARAMSARAM、外部存储器和外设相连; 一个辅助端口用于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的配置 如下图所示,HPIDMA通道的关系由DMAGCR寄存器中的EHPIEXCL位确定。 1)当EHPIEXCL=0HPIDMA通道共享DARAMSARAMEMIF 2)当EHPIEXCL=1HPI独占DARAMSARAMDMA通道只能访问EMIF和外设。 应当注意HPI不能访问外设端口。 4 服务链 每个标准口都可以对6个DMA通道以及HPI同时发来的请求进行仲裁,每个都标准口都有独立的功能服务链,即有软件和硬件来控制的,为访问请求提供服务的方案。虽然4个服务链功能上是独立的,但他们共享一个通用的配置。 DMA通道和HPI具有可编程的优先级。通过寄存器DMACCR中的PRIO位可以设置每个通道的优先级,通过寄存器DMAGCR中的EHPIPRIO位可以设置HPI的优先级。 2 不管优先级如何设定,端口对通道和HPI的检测按照固定的顺序循环:012345HPI012345HPI…… 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位的数据总线,可以将48比特的数据片打包成一个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控制器的寄存器,其中有三个全局控制寄存器DMAGCRDMAGSCRDMAGTCR对所有的通道进行控制,此外还有通道配置寄存器用于对每个通道进行控制。     DMAGCR 全局控制寄存器,用于配置HPI 1 DMAGSCR* 全局软件兼容寄存器,用于控制DMA获得目的单元、目的帧索引的方式 1 DMAGTCR* 全局超时控制寄存器,用于使能或禁止SARAMDARAM端口的超时计数器 1 DMACCR 通道控制寄存器,用于配置优先级等 每个通道一个 DMACICR 通道中断寄存器,用于中断使能 每个通道一个 DMACSR 状态寄存器 每个通道一个 DMACSDP 源和目的参数寄存器,用于配置数据块参数 每个通道一个 DMACSSAL 源起始地址寄存器(低地址) 每个通道一个 DMACSSAU 源起始地址寄存器(高地址) 每个通道一个 DMACDSAL 目的起始地址寄存器(低地址) 每个通道一个 DMACDSAU 目的起始地址寄存器(高地址) 每个通道一个 DMACEN 单元数量寄存器 每个通道一个 DMACFN 帧数量寄存器 每个通道一个 DMACEI/DMACSEI 单元索引寄存器 每个通道一个 DMACFI/DMACSFI 帧索引寄存器 每个通道一个 DMACDEI* 目的单元索引寄存器 每个通道一个 DMACDFI* 目的帧索引寄存器 每个通道一个 DMACSAC* 源地址计数寄存器 每个通道一个 DMACDAC* 目的地址计数寄存器 每个通道一个 *标注的寄存器只在TMS320VC5509aTMS320VC5510中应用。 1DMA全局控制寄存器       154 Reserved 保留位 3 Reserved 1 保留位(通常写入1 2 FREE 0 1 遇到断点时的处理 停止DMA传输 继续DMA传输 1 EHPIEXCL 0 1 HPI的配置 与通道共享 独占内部RAM 0 EHPIPRIO 0 1 HPI优先级 低优先级 高优先级 2DMA通道控制寄存器       1514 DSTAMODE 0011 目的地址修改模式 1312 SRCAMODE 0011 源地址修改模式 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.源和目的参数寄存器       1514 DSTBEN 0001 10 11 目的端口突发使能 目的端口突发禁止 目的端口突发使能 保留 13 DSTPACK 0 1 目的端口打包使能 禁止 使能 129 DST xx00 xx01 xx10 xx11 目的端口类型 目的端口为SARAM 目的端口为SARAM 目的端口为EMIF 目的端口为Peripherals 87 SRCBEN 0001 10 11 源端口突发使能 禁止 使能 保留 6 SRCPACK 0 1 源端口打包使能 禁止 使能 52 SRC 源端口类型(同DST 10 DATATYPE 00 01 10 11 数据传输单位 8 16 32 保留 4.起始地址寄存器 寄存器名     DMACSSAL 150 SSAL 源起始地址低16 DMACSSAU SSAU 源起始地址高位 DMACDSAL DSAL 目的起始地址低16 DMACDSAU DSAU 目的起始地址高位 5.单元数量和帧数量寄存器 寄存器名     DMACEN 150 ELEMENTNUM 每帧包含的单元数量 DMACFN FRAMENUM 每块包含的帧数量 5.单元索引寄存器和帧索引寄存器 寄存器名     DMACEI/DMACSEI 150 ELEMENTNDX 单元索引值 DMACFI/DMACSFI FRAMENDX 帧索引值 DMACDEI ELEMENTNDX 目的单元索引值 DMACDFI FRAMENTDX 目的帧索引值 6 使用方法及实例 调用DMA库函数首先要在头文件中包含csl_dma.h文件,接下来介DMA配置结构。DMA配置结构名为DMA_ConfigDMA_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_xx=0, 2 Int16 dmacfi ;DMA 通道帧索引寄存器 Int16 dmacei ;DMA 通道单元索引寄存器 对于 CHIP_5510PG2_xx=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_openDMA_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_configmyhDma, &myConfig; /* 配置通道 */ 配置完成之后,调用DMA_start()函数开始DMA传送: DMA_startmyhDma; /*开始传送 */ 等待DMA状态寄存器的帧状态位指示传输结束: while !DMA_FGETHmyhDma, DMACSR, FRAME)) { } 之后关闭句柄: DMA_closemyhDma; /*关闭通道 */