C6678学习-EDMA

文章详细介绍了EDMA3的组成,包括通道控制器EDMA3CC和传输控制器EDMA3TC,以及它们在数据传输中的作用。EDMA3支持事件触发、手动触发和链接触发等不同方式,并详细阐述了传输数据块的定义,如ACNT、BCNT和CCNT参数。此外,还讨论了通道映射、参数PaRAM和OPT参数配置,以及不同类型的传输模式。
摘要由CSDN通过智能技术生成

1、简介
1. EDMA3概述

基于C66x的内核处理器主要具有两种DMA传输:IDMA、EDMA3。

IDMA:只提供核内部(L1P、L1D、L2、CFG)的数据移动服务。C6678处理器中,IDMA具有两个通道。

EDMA3:服务外部内存(比如DDR)、服务芯片内的内存(比如:L2 SRAM)、服务外设,比如:串口

2、EDMA3的组成

EDMA3控制器主要由两部分构成:EDMA3通道控制器(EDMA3CC)和EDMA3传输控制器(EDMA3TC)

EDMA3通道控制器(EDMA3CC),充当EDMA3控制器的用户接口,EDMA3CC包括:参数RAM(PaRAM)通道控制寄存器、中断控制寄存器。EDMA3CC负责软件请求或外设事件的优先级管理,向传输控制器发布传输请求(TRs)。

EDMA3传输控制器(EDMA3TC),依附于EDMA3通道控制器,负责数据传输,EDMA3TC向编程传输的源和目的地址发布读写请求。

EDMA3TC的大多数寄存器是只读的,用户一般不会对这些寄存器进行编程。EDMA3CC有高度的可编程性,用户可以设置各种传输方式。

EDMA具有三个通道控制器(CC0、CC1、CC2)和10个传输控制器(CC0TC0、CC0TC1,CC1TC0、CC1TC1、CC1TC2、CC1TC3,CC2TC0、CC2TC1、CC2TC2、CC2TC3)。

CC0有16个DMA通道,8个QDMA通道,16个中断通道,2个事件队列,队列深度为16,2个传输控制TC,一个事件队列对应一个TC;CC1有64个DMA通道,8个QDMA通道,64个中断通道,4个事件队列,队列深度为16,4个传输控制TC,一个事件队列对应一个TC;CC2有64个DMA通道,8个QDMA通道,64个中断通道,4个事件队列,队列深度为16,4个传输控制TC,一个事件队列对应一个TC。如下图所示

在这里插入图片描述

3、EDMA3的工作流程

在这里插入图片描述

首先编程者先配置DMA/QDMA通道逻辑参数,然后参数传送给事件队列,事件队列获取PaRAM参数,探后提交传输请求到传输控制器。传输控制器来完成传输。传输完成后通道控制器的传输完成检测会收到传输控制器的请求,通道控制器向CPU提交传输完成中断。

4、EDMA3通道控制器(EDMA3CC)

在这里插入图片描述

EDMA3有3中触发方式,事件触发、手动触发、链接触发,它们由寄存器配置。事件触发后会通过优先级编码器仲裁,将高优先级送往队列,经过队列后,通道映射根据事件所对应的通道来选择参数集(在此之前通道和参数集已经做了映射了),然后提交传输请求。传输完成后通道控制器的传输完成检测会收到传输控制器的请求,通道控制器向CPU提交传输完成中断。

5、触发方式

1、DMA通道有3种触发方式:

事件触发:当一个触发事件锁存到ER寄存器就会启动相应通道的EDMA3(CPU必须先通过EER使能该事件)

手动触发:CPU可以通过写ESR启动一个EDMA3通道
链接触发:由一个EDMA3通道的结束来触发,启动另一个EDMA3

2、QDMA通道有触发方式:

自动触发:PaRAM里设置为触发字的域被写入值后,触发传输(通过QCHMAPn寄存器设置PaRAM的哪个域作为触发域)。
QDMA与DAM的主要的不同就是触发方式的不同

2、EDMA3的传输
1、传输数据块的定义

在这里插入图片描述

每一个EDMA3传输数据都是可以看做一个三维的数据,这个数据的大小
由ACNT,BCNT,CCNT来描述。

第1维或阵列(A):一个传输的第1维是由ACNT个连续字节。

第2维或帧(B):一个传输的第2维是由BCNT个ACNT字节的阵列。第2维里的每个阵列传输通过一个索引彼此分开,这个索引使用SRCBIDX和DSTBIDX来配置。

第3维或块(C):一个传输的第3维是由CCNT个帧,每个帧由BCNT个阵列,而每个阵列有ACNT个连续字节。第2维里的每个传输由以一个索引同前一个分开,这个索引使用SRCCIDX或DSTCIDX来配置。

2、传输类型

A传输类型:每次传输一个阵列,也就是ACNT个字节。传输一个ACNT x BCNT x CCNT的数据块总共需要传输BCNT x CCNT次。

如果EDMA3搬运的是一片连续的内存,则SRCBIDX=DSTBIDX=ACNT,SRCCIDX=DSTCIDX=ACNT。

AB传输类型:每次传输一帧,也就是ACNTxBCNT个字节。传输一个ACNT x BCNT x CCNT的数据块总共需要传输 CCNT次。

如果EDMA3搬运的是一片连续的内存,则SRCBIDX=DSTBIDX=ACNT,SRCCIDX=ACNTxBCNT。

3、参数PaRAM

在这里插入图片描述

参数RAM存放每个EDMA3通道需要的传输控制参数。每个EDMA3事件对应一个参数组,每组包括8个字(32字节),在C6678中总共有512个参数组。

OPT 传输配置选项

SRC 数据来源端的字节地址

ACNT 一个array中的连续字节数

BCNT 一帧中的array数

DST 数据目的端的字节地址

SRCBIDX 源BCNT索引值,用于指示传输帧中,数据源的阵列array的间隔

DSTBIDX 目的BCNT索引值,用于指示传输帧中,数据目的端的阵列array的间隔

LINK 用于链式传输,一个通道的DMA3传输完成后,下一个EDMA3传输的PaRAM参数的地址

BCNTRLD A同步传输时,BCNT减到0时的重载值

SRCCIDX 源CCNT索引值,用于指示传输帧中,数据源的帧间的间隔

DSTCIDX 目的CCNT索引值,用于指示传输帧中,数据目的端的帧间的间隔

CCNT 一个传输块中的帧数

4、通道

EDMA通道编号:控制器0是16个DMA通道加8个QDMA通道,编号顺序是0-23; 控制器1/2是64个DMA通道加8个QDMA通道,编号顺序是0-71;QDMA的通道编号在最后8个。

通道需要和参数集做映射,这样传输通道才可以根据通道映射来选择参数集。

/*函数名称: int edma3Transfer(const tEdmaTransCfg *cfg);中的部分代码*/
/* 打开指定的QDMA 通道*/ 
    chParam.regionNum = regionNum;
    chParam.chaNum = cfg->chanNo;
    hChannel = CSL_edma3ChannelOpen(&chObj0, cfg->edmaNo, &chParam, &edmaStat);

    /* 将QDMA 通道 映射到指定的参数入口*/
    chSetup.paramNum = chParam.chaNum;
    CSL_edma3HwChannelSetupParam(hChannel, chSetup.paramNum);

    /* 获取指定的参数入口句柄 */
    paramHandle = CSL_edma3GetParamHandle(hChannel, chSetup.paramNum, &edmaStat);
         
    /* 使用paramSetup信息来配置参数入口 */
    CSL_edma3ParamSetup(paramHandle, &paramSetup);

    /* 使能指定通道 */
    CSL_edma3HwChannelControl(hChannel, CSL_EDMA3_CMD_CHANNEL_ENABLE, NULL);
5、OPT参数

在这里插入图片描述

FWID:FIFO 宽度,应用于SAM 或者DAM 至少有一个设置成固定地址模式

DAM:目的地址模式。

置0:递增(INCR)模式。目的地址在一个数列里是递增的。目的不是一个FIFO。

置1:固定地址(CONST)模式。目的地址在一个FIFO 中循环。

SAM:源地址模式。

置0:递增(INCR)模式。源地址在一个数列里是递增的。源不是一个FIFO。

置1:固定地址(CONST)模式。源地址在一个FIFO 中循环。

SYNCDIM:同步传输模式。

置0:A-同步传输。每个触发事件传输一个数列(ACNT 字节)。

置1:AB-同步传输。每个触发事件传输BCNT个数列(ACNT x BCNT字节)。

STATIC:静态PaRAM集。
置0:RAM 参数集非静态:TR 被提交后RAM 参数集将更新或链接。0 值用于DMA 通道或QDMA 传输连接列表中的非最终的传输。

置1:RAM 参数集为静态:TR 被提交后RAM 参数集不发生更新或链接。1 值用于单独的QDMA 传输或者QDMA传输连接列表中的最终的传输。

如果数据块可以一次性传输玩,则不需要更新,如果数据块需要多次传输才能传输完,则需要更新。例如:一个数据块的大小如果只有一个阵列,那么A同步传输一次就传输完了,那么RAM就不需要更新了,但是如果是一个帧,那么用A传输模式就需要传输BCNT次,并且每次传输完成后,下一次传输的源地址和目的地址都会相应的改变,并且BCNT会减1,所以RAM中的参数需要更新。

TCC:传输完成编码,这6 位用于设置链接使能寄存器的相应位(CER[TCC])用于链接或者中断挂起寄存器相应位(IPR[TCC])用于中断.

TCCMOD:传输完成编码模式。:

置0:正常完成模式。在数据完全被传输后,才算一个传输完成

置1:提前完成模式。当EDMA3CC 提交一个传输请求给EDMA3TC 时就算一个传输完成.触发中断或者链接时传输请求可能仍然在传输数据。

ITCINTEN:内部传输完成中断使能,当使能,每当完成PaRAM集里的一个TR(PaRAM集里最后一个TR除外),就会产生一次传输完成中断。

置0:禁止内部传输完成中断

置1:使能内部传输完成中断

TCINTEN:传输完成中断使能。当使能,当完成PaRAM集里最后一个TR才产生一次
完成中断。

置0:禁止传输完成中断

置1:使能传输完成中断

ITCCHEN:内部传输完成链接使能。当使能,每当完成PaRAM集里的一个TR(PaRAM集
里最后一个TR除外),就会产生一次链接。

置0:禁止内存传输完成链接

置 1:使能内部传输完成链接

TCCHEN:传输完成链接使能。当使能,当完成PaRAM集里最后一个TR才产生一次
链接。

禁止传输完成级联

使能传输完成级联

链接(Link)传输的配置:STATIC必须为0;LINK地址设置;TCCHEN置1(一般不会用到ITCCHEN置1);

Chain链接模式和Link连接模式是完全不同的模式,Chain模式中没有PaRAM set 的参数的更新,而是一个通道的传输完成直接触发了另一个通道,实现连续的数据的搬运的效果,但是Link模式就是同一个通道上的参数的不断的更新,从而达到连续的数据搬运的效果。

/***EDMA传输中配置项结构体****/
typedef struct T_EDMA_TRANS_CFG
{
    /**@brief 数据传输的源地址模式 INCR/CONST */
    unsigned short srcAddrMode;
    /**@brief  数据传输的目的地址模式 INCR/CONST */
    unsigned short dstAddrMode;
    /**@brief  FIFO宽度,仅在CONST地址模式下有效*/
    unsigned short fifoWidth;
    /**@brief 数据的超时等待时间,ms为单位 */
    unsigned short timeOut;
    /**@brief EDMA控制器编号,0-2 */
    unsigned short edmaNo;
    /**@brief EDMA通道编号*/
    unsigned short chanNo;
    /**@brief  EDMA传输的源地址 */
    unsigned int srcAdrs;
    /**@brief  EDMA传输的目的地址 */
    unsigned int dstAdrs;
    /**@brief  EDMA传输的一维数据长度参数 */
    unsigned short aCnt;
    /**@brief  EDMA传输的二维ARRAY数量参数 */
    unsigned short bCnt;
    /**@brief  EDMA传输的二维FRAME数量参数 */
    unsigned short cCnt;
    /**@brief  二维EDMA传输的源地址的修改参量 */
    short srcBIndex;
    /**@brief  二维EDMA传输的端地址的修改参量 */
    short dstBIndex;
    /**@brief  三维EDMA传输的源地址的修改参量 */
    short srcCIndex;
    /**@brief  三维EDMA传输的端地址的修改参量 */
    short dstCIndex;
    /**@brief 1:阻塞模式,0:中断模式,非阻塞 */
    unsigned char isBlocking;
}tEdmaTransCfg;
3、补充
1、EDMA3通道控制器区域

EDMA3CC 内存映射寄存器可以被分为三个主要类型:

  1. 全局寄存器
  2. 全局区域通道寄存器
  3. 影子区域通道寄存器

全局寄存器的地址是唯一固定的,这些寄存器控制着EDMA3的资源映射。

通道寄存器是通道控制相关的寄存器,可以通过全局通道区域访问,也可以通过影子通道访问。影子通道寄存器就是全局通道区域寄存器的备份,配置影子通道寄存器的数据,最终还是会被写入到全局区域寄存器中。

EDMA3 通道控制器(EDMA3CC)将地址空间分为多个影子区域(region)。在多核设备中可以减少资源冲突

DRAEm:寄存器的每一个位对应一个DMA通道。

QRAEm:寄存器的每一个位对应一个QDMA通道。

参考:http://www.digoboy.com/video/id_4438.html

https://blog.csdn.net/u012384044/article/details/51939829

  • 2
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用\[1\]中的代码片段展示了在DSP6678上使用EDMA进行数据传输的部分代码。在这段代码中,首先打开指定的QDMA通道,并将其映射到指定的参数入口。然后获取参数入口句柄,并使用paramSetup信息配置参数入口。最后,使能指定的通道进行数据传输。 引用\[2\]中提到了Parameter RAM(PaRAM),它用于维护通道和重载参数集的参数设置条目。需要将PaRAM写入所需通道和链接参数集的传输上下文。 引用\[3\]中提到了在使用EDMA进行数据传输时可能遇到的缓存一致性问题。由于EDMA是独立于CPU的功能模块,CPU并不知道EDMA在搬运数据。因此,可能会出现缓存中的数据与DDR中的数据不一致的情况。为了解决这个问题,可以使用Cache_Invalid函数将DDR对应的Cache置为无效,或者使用Cache回写函数将Cache中的数据回写到DDR中,以保持DDR和Cache的一致性。 综上所述,DSP6678上的EDMA是一种用于数据传输的功能模块。通过配置参数和映射通道,可以实现高效的数据传输。在使用EDMA时,需要注意缓存一致性问题,以确保数据的正确性。 #### 引用[.reference_title] - *1* [C6678学习-EDMA](https://blog.csdn.net/g360250466/article/details/130473874)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [DSP篇--C6678功能调试系列之EDMA3调试](https://blog.csdn.net/nanke_yh/article/details/128156123)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [TMS320C6678 EDMA传输配置](https://blog.csdn.net/HSU0911/article/details/117984837)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值