TI中文支持网
TI专业的中文技术问题搜集分享网站

从EMIF用DMA搬移数据等待时间太长

有个问题想请教一下各位专家,主要是关于C66xx的DMA数据搬移时等待数据传输完成耗时太长的问题,希望大家帮忙指点一下。

是从网上下载了一个例程跑了一下,程序如下:

#include "DMA.h"

#pragma DATA_SECTION(srcBuff,".MySRC");
#pragma DATA_SECTION(dstBuff,".MyDST");

void main()
{

DMA_Init(0,1);
DMA_transport(1,srcBuff,0,dstBuff,2,2,1024);
waitDMAover(1);
DMA_Close(1);
}

#include <ti/csl/csl_edma3.h>
#include <ti/csl/csl_edma3Aux.h>
#include <ti/csl/csl_cacheAux.h>

CSL_Edma3Handle hModule;
CSL_Edma3Obj edmaObj;
CSL_Edma3ParamHandle hParamPing;
CSL_Edma3ChannelObj chObj;
CSL_Edma3CmdIntr regionIntr;
CSL_Edma3CmdDrae regionAccess;
CSL_Edma3ChannelHandle hChannel;
CSL_Edma3ParamSetup myParamSetup;
CSL_Edma3Context context;
CSL_Edma3ChannelAttr chAttr;
CSL_Edma3CmdQrae qraeSetup;
CSL_Status status;

void DMA_Init(int TPCC_num,int ChannelNum)
{
int instNum = TPCC_num;
int ParamNum = ChannelNum;
CSL_edma3Init(&context);
hModule = CSL_edma3Open(&edmaObj,instNum,NULL,&status);
chAttr.regionNum = CSL_EDMA3_REGION_GLOBAL;
chAttr.chaNum = ChannelNum;
hChannel = CSL_edma3ChannelOpen(&chObj, instNum, &chAttr, &status);

CSL_edma3HwChannelSetupQue(hChannel,CSL_EDMA3_QUE_0);

CSL_edma3MapDMAChannelToParamBlock(hModule, ChannelNum, ParamNum);
hParamPing = CSL_edma3GetParamHandle(hChannel, ParamNum, &status);
}

void DMA_transport(int ChannelNum,float *srcBuff,int srcIncrement,float * dstBuff,int dstIncrement,int Acnt,int Bcnt)
{
myParamSetup.option = CSL_EDMA3_OPT_MAKE(CSL_EDMA3_ITCCH_DIS, \
CSL_EDMA3_TCCH_DIS, \
CSL_EDMA3_ITCINT_DIS, \
CSL_EDMA3_TCINT_EN, \
ChannelNum, CSL_EDMA3_TCC_NORMAL,\
CSL_EDMA3_FIFOWIDTH_NONE, \
CSL_EDMA3_STATIC_DIS, \
CSL_EDMA3_SYNC_AB, \
CSL_EDMA3_ADDRMODE_INCR, \
CSL_EDMA3_ADDRMODE_INCR );
//AB传输模式,传输完成码(TCC)设为 ChannelNum

myParamSetup.srcAddr = (Uint32)srcBuff;
myParamSetup.aCntbCnt = CSL_EDMA3_CNT_MAKE(Acnt,Bcnt);
myParamSetup.dstAddr = (Uint32)dstBuff;
myParamSetup.srcDstBidx = CSL_EDMA3_BIDX_MAKE(srcIncrement,dstIncrement);//src 和 dst 地址增量
myParamSetup.srcDstCidx = CSL_EDMA3_CIDX_MAKE(0,0); //因为为 2 维传输,所以此项为 0
myParamSetup.cCnt = 1;
myParamSetup.linkBcntrld= CSL_EDMA3_LINKBCNTRLD_MAKE(CSL_EDMA3_LINK_NULL,0);//用于链接到另一个Param,重装 Bcnt
CSL_edma3ParamSetup(hParamPing,&myParamSetup);

/* Trigger channel */
CSL_edma3HwChannelControl(hChannel,CSL_EDMA3_CMD_CHANNEL_SET,NULL);
}

void waitDMAover(int ChannelNum)
{

int queryl = 0;
int queryh = 0;
if(ChannelNum > 31)
{
queryh = ChannelNum – 32;
queryl = 0;
queryh = 0x01 << queryh;
}
else
{
queryl = 0x01 << ChannelNum;
queryh = 0;
}
regionIntr.region = CSL_EDMA3_REGION_GLOBAL;
regionIntr.intr = 0;
regionIntr.intrh = 0;

//查询寄存器 IPR ,等待传输完成
do {
CSL_edma3GetHwStatus(hModule,CSL_EDMA3_QUERY_INTRPEND,&regionIntr);
} while (!((regionIntr.intr & queryl)||(regionIntr.intrh & queryh)));

/* Clear the pending bit */
CSL_edma3HwControl(hModule,CSL_EDMA3_CMD_INTRPEND_CLEAR, &regionIntr);
}

void DMA_Close(int ChannelNum)
{
CSL_edma3ChannelClose(hChannel);
CSL_edma3Close(hModule);
}

现在碰到的问题就是,运行后通过调试发现,程序在等待传输完成的地方(红色标注)时间太久,不知是不是跟我设置的源地址有关系。

我的源地址.mySRC 是通过EMIF设置的FIFO,地址为0x70000000,即CE0。

源地址保持不变,一直从FIFO里面读数,EMIF的读数时序我已经设置为最小了,

(*0x20C00010)A1CR = 0x04122091;//W_STORBE、W_HOLD、R_SETUP、R_STROBE、R_HOLD 、A_SIZE均置为1,其他为0

请各位专家帮忙看看,如何才能降低搬移数据的耗时。谢谢!

Shine:

请问您的EMIF接的是异步FIFO?异步memory的速度本身就慢,EDMA要等EMIF口数据准备好才能传输,所以速度比较慢。

M Yu:

回复 Shine:

感谢您的解答。确实是异步FIFO,我是等FIFO存储到一定数据量(比如2000)之后给我发标志,然后我再启动DMA搬移这2000个数据,所以不存在等待准备的问题,就是搬移等待的时间就很久

Shine:

回复 M Yu:

您可以量一下在搬移时EMIF读时序是否时连续的。

M Yu:

回复 Shine:

好的,谢谢,具体该怎么测量呢?

Shine:

回复 M Yu:

用示波器量EMIF管脚,可以参考数据手册上的时序图。

赞(0)
未经允许不得转载:TI中文支持网 » 从EMIF用DMA搬移数据等待时间太长
分享到: 更多 (0)