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

C6678的EDMA3传输

cmd文件如下:

MEMORY
{
 L1D:  o=00f00000h  l=00007fffh
 L1P:  o=00e00000h  l=00007fffh
 L2:   o=00800000h  l=0007ffffh
 MSMC: o=0c000000h  l=001fffffh
 DDR3: o=80000000h  l=20000000h
}

SECTIONS
{
 .csl_vect > MSMC
 .text     > MSMC
 .stack    > MSMC
 .cinit    > MSMC
 .cio      > MSMC
 .const    > MSMC
 .data     > MSMC
 .switch   > MSMC
 .system   > MSMC
 .far      > MSMC
 .testMem  > MSMC
 .isram    > L2
 .mram     > MSMC
 .ddr      > DDR3
}

程序如下:

#Pargam DAT_SECTION(srcBuff1,".mram")
#Pargam DAT_SECTION(srcBuff2,".mram")
#Pargam DAT_SECTION(dstBuff1,".mram")
#Pargam DAT_SECTION(dstBuff2,".mram")

unsigned char srcBuff1[512];
unsigned char srcBuff2[512];
unsigned char dstBuff1[512];
unsigned char dstBuff2[512];

CSL_Edma3ParamHandle hParamPing;
CSL_Edma3ParamSetup myParamSetup;
CSL_Edma3ChannelHandle hChannel;
CSL_Edma3Handle  hMoudle;

void Edma3TxExample()
{
 CSL_Edma3Obj edmaObj;
 CSL_Edma3ChannelObj chObj;
 CSL_Edma3CmdIntr regionIntr;
 CSL_Edma3Context context;
 CSL_Edma3ChannelAttr chAttr;
 CSL_Status  status;

 unsigned char channelNum = 0;
 usnigned char instNum = 1;

 CSL_edma3Init(&context);

 hMoudle = 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_edma3DMAChannelToParamBlock(hMoudle,channelNum,&status);

 hParamPing = CSL_edma3GetParamHandle(hChannel,0,&status);

 regionIntr.region = CSL_EDMA3_REGION_GLOBAL;
 regionIntr.intr = 0x1;
 regionIntr.intrh = 0x0;
 CSL_edma3HwControl(hMoudle,CSL_EDMA3_CMD_INTR,ENABLE,&regionIntr);

 myParamSetup.option = 0x00100008;
 myParamSetup.srcAddr = (Uint32)srcBuff1;
 myParamSetup.aCntbCnt = 0x00010040;
 myParamSetup.dstAddr = (Uint32)dstBuff1;
 myParamSetup.srcDstBidx = 0x0;
 myParamSetup.linkBcntrld = 0x0000ffff;
 myParamSetup.srcDstCidx = 0x0;
 myParamSetup.cCnt = 0x00000001;
 CSL_edma3ParamSetup(hParamPing,&myParamSetup);

 CSL_edmaHwChannelControl(hChannel,CSL_EDMA3_CMD_CHANNEL_SET,NULL);

 regionIntr.region = CSL_EDMA3_REGION_GLOBAL;
 regionIntr.intr = 0x0;
 regionIntr.intrh = 0x0;
 do{
  CSL_edma3GetHwStatus(hMoudle,CSL_EDMA3_QUERY_INTRPEND,&regionIntr);
 }while(!(regionIntr.intr&0x1));

 CSL_edma3HwControl(hMoudle,CSL_EDMA3_CMD_INTRPEND_CLEAR,&regionIntr);
}

void main()
{
 int i;

 for(i=0;i<512;i++)
 {
  srcBuff1[i] = 0x22;
  srcBuff2[i] = 0x33;
  dstBuff1[i] = 0x00;
  dstBuff2[i] = 0x00;
 }
 Edma3TxExample();
}

问题描述:

1、如果将srcBuff1和dstBuff1的空间分配在.mram段,即共享内存,则数据可以传输,但从dstBuff1缓

冲中发现前32Byte为0,后32字节为正确传输的数据。从EDMA的参数配置中是应该将srcBuff1的64Byte传

输到dstBuff1;另外,在第一次传输后,如果将EDMA的参数配置的源地址和目的地址改为srcBuff2和

dstBuff2,再次触发,发现dstBuff2缓冲中的数据都为0,一个正确数据都没有传输成功。请高手帮忙解

释下?
2、如果将srcBuff1和dstBuff1的空间分配在.isram或者.ddr段,则dstBuff1缓冲中的前64Byte数据都为

0,即srcBuff1缓冲中的前64Byte都没有正确传输到dstBuff1,但为什么依然能判断到IPR标志,而数据

却传输不成功呢?

Yu Liu:

xuwei xu,

您好!

从link cmd文件看,使用了L1P/D和LL2的局部地址。而EMAC需要使用全局地址。可以考虑使用Core0 L2 SRAM起始地址为0x10800000试试。

另外,还需要注意cache导致的一致性问题。

user1931146:

回复 Yu Liu:

您好!

我按照你的想法,在CMD文件中将L2 SRAM起始地址改为了0x10800000,但测试发现还是存在问题:

1、srcBuff1、srcBuff2定义在isram ,dstBuff1、dstBuff2定义在ddr时,数据可以正确传输

2、srcBuff1、srcBuff2定义在ddr ,dstBuff1、dstBuff2无论定义在isram 、mram还是ddr,数据都不能正确传输,并且当dstBuff1、dstBuff2无论定义在ddr时,从源地址到目的地址传送的数据都是乱数据。

考虑到你说的注意cache一致性问题,我在main函数里进行了如下操作

for(i=0;i<256;i++)

  CACHE_disableCaching(i);

禁止了cache功能

Andy Yin:

回复 user1931146:

您好,

我稍微看了一下您的代码,感觉应该只能传1个字节就不会再传了,并且不应该产生中断的。EDMA的配置建议按如下进行修改,然后再测试反馈一下。谢谢

myParamSetup.option = 0x00100004;  //使能完成中断,AB-SYNC

myParamSetup.srcAddr = (Uint32)srcBuff1;

myParamSetup.aCntbCnt = 0x00010040;

myParamSetup.dstAddr = (Uint32)dstBuff1;

myParamSetup.srcDstBidx = 0x1; //

myParamSetup.linkBcntrld = 0x0000ffff;

myParamSetup.srcDstCidx = 0x0;

myParamSetup.cCnt = 0x00000001;

另外建议可以参考一下PDK安装目录packages\ti\csl\example\edma下的EDMA例程。谢谢!

user1931146:

回复 Andy Yin:

Andy Yin:

您好,

EDMA的配置参数应该没有什么问题,下午我又进行了测试,只有源地址和目的地址都分配在isram时,才可以稳定传输。当分配在共享内存或者DDR时都不能正常传输。我想会不会是EDMA在使用共享内存和DDR上有什么特殊设置?DDR是否需要进行初始配置?

还有我想请教下,您说的EDMA需要使用全局地址是什么意思啊?

Andy Yin:

回复 user1931146:

您好,

说明两点,请测试并反馈,谢谢。

1. 从上面的代码来看我觉得你的配置很奇怪,不是推荐的配置,所以请根据上述修改进行测试看看;

2. 请问你在simulator上测试过没有,结果如何?

3. 在EVM板上测试的时候,需要再新建target configuration文件时,选择相应的gel文件,连接EVM板时会自动运行该文件,完成PLL及DDR等的初始化工作。

4. 关于L2访问时可以使用local address及global address,启始地址分别对应0x00800000, 及0x10800000,0x11800000等,每个core在访问自己的L2时可以访问local地址,其他任何master在访问L2时必须用global地址。具体请参考datamanual。

user1931146:

回复 Andy Yin:

Andy Yin:

您好,

我查看了target configuration文件,发现没有加入gel文件,加入gel文件并保存后进行测试:

1、我将csl_vect 等段都从共享内存改成分配到了L2

2、将EDMA的源地址和目的地址分别选择为L2、共享内存、DDR,测试发现,如果目的地址为共享内存,则传输不成功,其余各种地址分配方式都能传输成功,是不是EDMA对共享内存写需要什么特殊设置?因为源地址分配在共享内存时是可以传输成功的,也就是对EDMA对共享内存进行读操作是没有问题的。

3、关于EDMA的配置参数问题,我换成你的配置参数后,传输不成功,传输到目的地址的数据是乱数。我测试的是从DDR->DDR的传输

4、我想问下,系统默认方式下Cache是使能还是禁止的啊?

Andy Yin:

回复 user1931146:

您好,

1. EDMA对SL2没有什么特殊配置;

2. 请问在simulator上测试效果怎么样?

3. 在gel文件中将L1配置为cache,L2配置为RAM;默认情况下SL2配置为cacheable,而DDR配置为cache disable,具体参考c66x corepac 4.4.5关于MAR register的说明;

4. 请问您的代码中除了EDMA对SL2操作外,还有没其他地方对目的地址SL2操作呢?还有就是目的地址在SL2上时,数据错误现象具体是怎么样?

5. 如果方便可以将您的测试工程上传参考,谢谢。

user1931146:

回复 Andy Yin:

在KeyStone Architecture Multicore Shared Memory Controller (MSMC)文档中提到MSMC的两个特征:

1、Level 2 or Level 3 shared MSMC SRAM that is accessible by all the C66xCorePacs and the mastering peripherals

2、Memory protection for accesses to MSMC SRAM and DDR3 memory from system masters

特征1中的mastering peripherals怎么理解?特征2中的对DDR3 和MSMC SRAM 的Memory protection 怎么理解?

 

MSMC的框图中的Master Port和Slave Port在使用上有什么差别?

特别是MSMC EMIF Master Port端口和我测试用例中的利用EDMA进行DDR3到SL2的传输不成功是不是有联系?此端口只能作为主端口而不能作为从端口?

但是我测试中发现:才用memcpy函数从DDR3到SL2的数据拷贝是可以成功的。那么采用memcpy和EDMA从DDR3到SL2的数据拷贝,在数据流向上具体有什么不同呢?

user1931146:

回复 user1931146:

Andy Yin:

您好!

我在simulator上测试效果也是一样的,就是采用EDMA从DDR到MSM的传输不成功,还有我上面提到的MSMC的几个问题能够帮忙解答下啊?

另外关于QDMA,我也想问一下:在提供的EDMA测试用例中,利用库函数设置QDMA的TRWORD为7,但为什么CSL_edma3ParamWriteWord(hparam,7,1)中却要写1呢?这个之间是怎么对应的?

谢谢!

Andy Yin:

回复 user1931146:

您好,

就MSMC的问题答复如下:1

1. master peripherals指的是其他除Corepac外可以访问memeory的设备,如EDMA3,Navigator,SRIO,EMAC等;

2. 如你所贴图可知在MSMC中存在两个MPAX,MPAX中最重要属性之一就是提供了对memeory的protection属性定义,可以限定特定的master及具有特定权限的master去访问,从而达到内存保护的属性,具体可以详细参考MSMC及CorePac手册中相关说明;

3. Master port及slaveport的区别在与参考对象不一样,corepac及相关peripherals作为master发起memeory access时,相对发起端而言,MSMC为slave port,而此时相对目的端的memory MSMC为master port;从客户使用上来看不需要关注;

4. DDR3与SL2之间肯定是可以进行数据的互传的。方便的话将工程作为附件上传我可以抽时间测测。

关于QDMA的问题,你上次已经提了相应的问题,我也做了详细的解释,请参考。

www.deyisupport.com/…/5087.aspx

赞(0)
未经允许不得转载:TI中文支持网 » C6678的EDMA3传输
分享到: 更多 (0)