DSP

TMS320C6474学习总结(十一)----EDMA3使用说明

2019-07-13 12:20发布

1. 什么是EDMA3控制器?        EDMA3(Enhanced Direct Memory Access 3):增强型直接存储器访问的控制器。它是DSP中一个高效数据传输引擎,其结构适合数据的高速传输。直接存储器访问是一种重要的数据访问方式,可以在没有CPU参与的情况下,由控制器完成存储空间的数据转移,适用于软件触发的页面传输(片外存储空间与片内存储空间间进行传输)、适用于事件触发的外设(串口及接口UTOPIA)。利用EDMA3控制器对多变的数据结构进行子帧的提取及排列,减轻CPU在数据传输方面的负担。 2. EDMA3的特征        ①提供三个维度完全正交的传输方式(三个维度之间不存在相互干扰);               EDMA3支持一维传输(A同步传输:一次触发只搬移ACNT个字节的数据)和二维传输(A-B同步传输:一次触发只搬运ACNT*BCNT个字节数据)这两种方式,不支持三维传输(A-B-C同步传输),但可以通过配置EDMA3为周期性事件触发模式,同时配置好CCNT的值,就可以实现A-B-C的三维传输。        ②可变的独立源地址和目的地址;               EDMA3在初始化时会设定源地址和目的地址,在EDMA3的传输过程中,其源地址和目的地址会不断往后偏移,来实现数据从源地址+偏移位置往目的地址+偏移位置端转移。        ③支持事件同步传输、手动同步传输以及链接同步传输方式;               事件同步传输:外设、系统或者外部产生的事件触发产生发送请求               手动同步传输:CPU通过在对应的寄存器位(ESR/ESRH)上写1来人为触发产生发送请求               链接同步传输:一个发送的完成来触发另一次的发送(要终止发送,可以将OPT中的LINK设为NULL)        ④EDMA3具有64个DMA通道,8个QDMA通道,256个PaRAM参数集,每一个通道都可以与给定的事件队列和PaRAM相关联。        ⑤EDMA3主要包括EDMA3CC(通道控制器)和EDMA3TC(传输控制器),EDMA3CC是用户控制EDMA控制器的接口,是EDMA3中用户编程的一部分。EDMA3CC包括PaRAM参数、通道控制寄存器以及中断控制寄存器。传输控制器EDMA3TC负责数据的搬移并分别向源地址和目的地址发出读写命令,源地址和目的地址是在EDMA3CC中设定的。 3. EDMA3CC主要以下几个模块        1. PaRAM:PaRAM参数设置了数据传输的一些信息,例如源地址、目的地址、传输的数据大小,以及传输方式等信息。        2. EDMA3事件和中断处理寄存器:实现事件和参数设置的映射,事件使能/去使能,中断使能/去使能/清除中断等。        3. 事件队列:事件队列处于事件探测逻辑和发送请求提交逻辑之间。        4. 内存保护寄存器:内存保护寄存器定义了DMA通道阴影区域和PaRAM区域的入口。        5. 区域寄存器:区域寄存器允许DMA源(DMA通道和中断)被分配到独特的区域。        6. 调试寄存器:调试寄存器允许访问可视的寄存器来读取队列状态、控制器状态和事件状态。 4. PaRAM参数集       EDMA3共有256个PaRAM参数集,DMA和QDMA的通道传输内容(源/目的地址、数量、索引值等)都是在PaRAM中设置的。用户可以将256个PaRAM映射到任意DMA通道或QDMA通道上,来控制传输控制器进行一定数据量的搬运。 PaRAM各字段含义 字段 含义 OPT 传输配置选项 SRC 数据来源端的字节地址 ACNT 一个array中的连续字节数 BCNT 一帧中的array数 DST 数据目的端的字节地址 SRCBIDX 源BCNT索引值,用于指示传输帧中, 数据源的阵列array的间隔 DSTBIDX 目的BCNT索引值,用于指示传输帧中, 数据目的端的阵列array的间隔 LINK 当前PaRAM耗尽时,用于LINK的PaRAM的地址 BCNTRLD A同步传输时,BCNT耗尽时的重载值 SRCCIDX 源CCNT索引值,用于指示传输帧中, 数据源的帧间的间隔 DSTCIDX 目的CCNT索引值,用于指示传输帧中, 数据目的端的帧间的间隔 CCNT 一个传输块中的帧数 5. DMAQDMA的区别        DMA和QDMA通道的不同之处在于使用的触发条件不同。DMA的触发方式有三种:主动触发、事件触发以及链接触发。而QDMA的触发方式是自动触发和链接触发模式,自动触发是指只要配置了PaRAM参数就会自动触发,链接触发与DMA比较类似。QDMA只能发送一维Array的数据格式,而DMA可以发送一维、二维和三维的数据格式。 4. 配置EDMA3发送的主要步骤        1. DMA通道的初始化:               a. 通道选择,包括通道类型选择以及通道号选择,特别是事件触发时,不同的事件绑定了不同的通道号(在主动触发方式下,可以任意选择通道号,但如果是事件触发模式,必须使用触发事件对应的通道号)。                 #define g_Edma3ChanNUM     20                  #define g_PaRAMNum         30 /*EDMA364DMA通道,8QDMA通道,可任意选择通道号,但主要不要冲突*/ /*PaRAM共有256个参数集,可任意映射至DMA通道和QDMA通道,注意不要冲突*/               b. 通道映射,配置DCHMAP寄存器,指定PaRAM参数地址映射到使用的通道号       *(Edma3_DCHMAP0 + 4 * g_Edma3ChanNUM) = g_PaRAMNum << 5;  /*PaRAM 30 映射到DMA通道20 */ 此处寄存器中显示可以配置0-511PaRAM,但实际上只有256PaRAM               c. EDMA通道分区设置,EDMA3通道控制器寄存器分为全局寄存器、全局区域寄存器和阴影区域寄存器,如果将某个通道设置为阴影区域,那么后续操作必须使用阴影区域的寄存器(一般不用阴影区域,可以不用配置)。               d. 阴影区域通道使能,打开相应的DMA通道中断使能; /*如果使用的通道为阴影区域,则需要置位对应阴影通道的使能寄存器*/               e. 将选择的EDMA通道设置到需要的队列上,每个队列的优先级是不同的。                                *Edma3_DMAQNUM0 = 0x44444444;  /*将选择的通道设置到队列4上,EDMA3CC共有8个队列,每个队列深度是16个事件,也就是说一个队列可以配置16个通道的队列号*/        2. PaRAM参数配置               根据搬移的数据类型,参照PaRAM各字段含义,将PaRAM的参数写入与使用通道绑定的PaRAM中。                                   *t_PARAM_ADDR ++ = 0x0010000C;       //写入OPT                                   *t_PARAM_ADDR++ = (UINT)0x00801000;        //写入SRC                                   *t_PARAM_ADDR++ = (16<<16) + 16;        //写入BCNT ACNT                                  *t_PARAM_ADDR++ = (UINT)0x00802000;      //写入DST                                 *t_PARAM_ADDR++ = (16<<16) + 16;        //写入STBIDX   SRCBIDX                                 *t_PARAM_ADDR++ = 0x0001FFFF;     //写入BCNTRLD   LINK                                 *t_PARAM_ADDR++ = 0x0000000;        //写入DSTCIDX   SRCCIDX                                 *t_PARAM_ADDR++ = 0x00000001;           //写入Rsvd   CCNT          3. 中断配置               PaRAM中的OPT字段中应该使能相应的中断,另外需要通过设置IESR/IESRH使能中断相应。        4. 触发传输               a. 事件触发,通道如果触发源是事件,即当外部事件发生时,EDMA3自动传输一次数据。               b. 手动传输,通过CPU手动配置ESR寄存器触发                          *Edma3_ESR = 0x1<//触发传输               c. 链接触发,当上一个通道的传输完成码等于下一DMA通道时,上一通道传输完成将触发下一通道传输数据。        5. 等待完成               a. 在中断复位函数中等待,如果按照3中的设置,那么当传输完成后,EDMA3会给CPU产生中断,中断函数中必须将IPR/IPRH清零,方便下次实用性相同的标志位。               b. 轮询寄存器,如果未使能中断相应,那么可以等待相应的IPR/IPRH位置1,表示传输完成,IPR/IPRH必须清零,方便下次使用相同的标志位。       附表:EDMA3通道同步事件对照表 EDMA3 Channel Synchronization Events Channel Event 30 TCP2_A Receive Event 0 HPI/PCI-to-DSP Event 31 TCP2_A Transmit Event 1 Timer 0 Lower Counter Event 32 UTOPIA Receive Event 2 Timer 0 Higher Counter Event 33 TCP2_B Receive Event 3-8 None 34 TCP2_B Transmit Event 9 Embedded Trace Buffer (ETB) is Half Full 35-39 None 10 Embedded Trace Buffer (ETB) is Full 40 UTOPIA Transmit Event 11 Embedded Trace Buffer (ETB) Acquisition is Complete 41-43 None 12 MCBSP0 Transmit Event 44 I2C Receive Event 13 MCBSP0 Receive Event 45 I2C Transmit Event 14 MCBSP1 Transmit Event 46-47 None 15 MCBSP1 Receive Event 48 GPIO Event 0 16 Timer1 Lower Counter Event 49 GPIO Event 1 17 Timer1 Higher Counter Event 50 GPIO Event 2 18 None 51 GPIO Event 3 19 RapidIO Interrupt 0 52 GPIO Event 4 20 RapidIO Interrupt 1 53 GPIO Event 5 21 RapidIO Interrupt 2 54 GPIO Event 6 22 RapidIO Interrupt 3 55 GPIO Event 7 23 RapidIO Interrupt 4 56 GPIO Event 8 24 RapidIO Interrupt 5 57 GPIO Event 9 25 RapidIO Interrupt 6 58 GPIO Event 10 26-27 None 59 GPIO Event 11 28 VCP2 Receive Event 60 GPIO Event 12 29 VCP2 Transmit Event 61 GPIO Event 13 30 TCP2_A Receive Event 62 GPIO Event 14 31 TCP2_A Transmit Event 63 GPIO Event 15