This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

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标志,而数据

却传输不成功呢?

  • xuwei xu,

    您好!

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

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

  • 您好!

    我按照你的想法,在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功能

  • 您好,

    我稍微看了一下您的代码,感觉应该只能传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例程。谢谢!

  • Andy Yin:

    您好,

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

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

  • 您好,

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

    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。

  • Andy Yin:

    您好,

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

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

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

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

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

  • 您好,

    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. 如果方便可以将您的测试工程上传参考,谢谢。

  • 在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的数据拷贝,在数据流向上具体有什么不同呢?

  • Andy Yin:

    您好!

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

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

    谢谢!

  • 您好,

    就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

  • Andy Yin:

    您好!

    由于我的机器不好将测试工程导出,我就写了两个文件(见附件),和测试工程内容一致。我采用C6678 simulator测试,工程加入了ti.cls.ae66和ti.csl.intc.ae66两个库文件。

    麻烦你能抽时间帮我测试一下。等你的解答。

    谢谢!

    test.rar
  • 麻烦Andy Yin能抽时间测试一下,等待你的解答,谢谢!

  • 您好,

    使用你的代码在CC5.1版本下建立工程进行了测试,发现关于数据段的存放指定没有生效,即需要将如下定义:

    #pragma DATASECTION(srcbuf,".EXRAM")

    #pragma DATASECTION(dstbuf,".MSRAM")

    修改为:

    #pragma DATA_SECTION(srcbuf,".EXRAM")

    #pragma DATA_SECTION(dstbuf,".MSRAM")

    此时目的地址在Share Memory,测试结果截图如下,能够传输64B数据,没有问题。请参考。

  • Andy Yin:

    您好!

    请问你是在simulation下测试的吗?我CCS5.0版本,我测试了怎么就不可以呢?和配置simulation有关系吗?

    能否将你的测试工程上传给我看看啊?我直接用你的工程测试看看结果。

    谢谢!

  • 您好,

    在CCS5.1.09 Simulator上测试的,测试工程见附件。

    test_deyisupport.7z
  • Andy Yin:

    您好!

    我从TI网站下载了CCS_5.0.3.00028,安装后测试你的工程,但是发现却没有pdk c6678,能提供一份pdk的安装文件吗,没有ti.csl.ae66和ti.csl.intc.ae66两个库文件不好测试。谢谢!

  • Andy Yin:

    您好!

    我已经下载好bios_mcsdk_02_00_05_17了,等测试过后我们再交流。

  • Andy Yin:

    您好!

    我在CCS5.0 Simulator上测试过了,运行在CORE0,第一次执行是可以的,但是我复位CORE0后再次执行结果就不对了。还有我想请问,我对CORE0复位后,为什么在Debug窗口中CORE0的状态不是初始状态呢,就是和CORE1-CORE7的状态不一致呢?感觉复位不起作用

  • Andy Yin:

    您好!

    麻烦你再测试一下,谢谢!

  • 您好!

    在CCS 5.1 , function simulator 下 用你的 代码 测试 没有你所述 问题。

    a.CPU reset 后 core0 与其他核一样

    Right-click here to download pictures. To help protect your privacy, Outlook prevented automatic download of this picture from the Internet.

    请 贴图说明

    b.CPU reset 后再次 执行 结果一样

  • 您好!

    1、CC55.0 Device Cycle simulator 下,未加载程序时的状态:

    2、加载程序后的状态:

     

    3、对CORO复位后还是和加载程序后的状态一致,和CORE1-CORE7的初始状态不一致。

  • 您好!

    请确认 你点的是 CPU reset , CPU reset 右边 按键 是CPU restart,

    CPU restart 功能 与你所述一样

  • 您好!

    我点的就是CPU reset ,是不是在创建TargetConfiguration文件的时候要有什么配置的啊?还是我这个5.0版本的simulation就有这个问题啊?

  • 您好!

    1.你用 function simulator 再 试下

    2. 你是 新建工程 重新 编译 源文件 还是直接 导入 工程的?  

  • 您好!

     1、我用function simulator 测试了,复位后CORE0和其余核的状态一致了,每次复位执行后结果都是对的。但在cycle simulator下为什么不可以就不知道了。

    2、还有个现象请帮忙解答下,我在main函数里加入了两个打印语句printf("srcbuf[0] = %d\n",srcbuf[0]);
     printf("dstbuf[0] = %d\n",dstbuf[0]);后,运行结果就不对了,弄不清楚是为什么

    main.c见附件

     

  • 您好!

    麻烦能抽空帮我测试下上述问题,谢谢!

  • 您好,

    我们正在复现测试,可能需要点时间,你可以先在function simulator及EVM板上继续测试,同时不建议在程序中加printf。谢谢

  • 您好!

    期待你们的解答,谢谢!

  • 您好!

    我想先确认,我在main函数里加入了两个打印语句printf("srcbuf[0] = %d\n",srcbuf[0]);printf("dstbuf[0] = %d\n",dstbuf[0]);后,运行结果就不对了,这个现象你们测试的时候存在吗?

  • 你好,

    我们这边也可以复现这种现象,你可以先去掉这句话往下继续,同时建议可以试试pdk_install_path\packages\ti\csl\example\edma下的EDMA例程看看是否存在同样的问题,谢谢

  • 您好!

    我测试后反馈结果。