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.

[参考译文] TMS320C6672:EDMA3问题

Guru**** 2554970 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/608339/tms320c6672-edma3-questions

器件型号:TMS320C6672

你好。
我想将 EDMA3用于我的定制6672板。
我参考了处理器 SDK (v03.03)提供的 EDMA_TEST.c 代码。

我的目标是将256字数组从 DDR 复制到 FPGA (EMIF-16)

1.我认为这是可能的、但我不确定原因 EMIF-16是16位访问、如您所知。

2、现在、我将通过从一个缓冲区复制到另一个缓冲区来进行测试。
我不确定如何设置第二个参数。(过程?)

在参数设置和手动触发后、我应该怎么做?

我附上了我的代码、 结果表明第二个触发器不起作用。 谢谢。

e2e.ti.com/.../5428.Main.c

[C66xx_0]错误测试#2:I = 1

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!
    如果您看一下器件方框图、您会发现 EMEA3外设存在于 DSP 内核之外、它们通过 TeraNet 连接。 这意味着 EDMA3位于全局地址空间中。 同时、除非您采取预防措施(您不采取预防措施)、否则在内核上运行的程序将在其本地地址空间内运行。 因此、首先要尝试将 EDMA3参数配置为全局源地址和目标地址。 您可以在 PDK 示例或 pdk_your device\packages/ti\platform\yth_evm_l\platform_lib\src\platform.c 中找到名为 Convert_CoreLocal2GlobalAddr ()或 convert_coreLocalToAddr ()的函数 它会将高位添加到地址、以便 EDMA 外设知道数据的物理位置。
    希望这对您有所帮助。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我应该使用 conver_corelocal2GlobalAddr ()函数将核心本地地址空间更改为全局地址空间。
    您能不能帮助我转换后应该怎么做?
    谢谢
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您必须像那样为 src/dst 分配全局地址

    myParamSetup.srcAddr = Convert_CoreLocal2GlobalAddr ((UINT32)srcBuff1 );
    myParamSetup.dstAddr = Convert_CoreLocal2GlobalAddr ((UINT32)dstBuff1 ); 

    好了、好了。 您手动触发转接、然后轮询完成、因为它已写入代码中。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    执行上述操作可确保传输设置正确、并可在 DSP 存储器中的存储器缓冲区上按预期运行。 当您要与 FPGA 通信时、只需将适当的地址放置到 src/dst 即可。 EMIF16数据空间地址是全局地址、但平台库中的函数会关注该地址、并且不会破坏它们。 另一个好消息是、EDMA3在面向 L2SRAM 时确保了缓存一致性。 因此、如果您的源缓冲区或目标缓冲区驻留在 L2SRAM 中、而其他方驻留在 FPGA 中、则无需考虑高速缓存、这将为您完成。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我的大部分问题似乎都得到了回答。 但我有一个问题"Param Set"。
    我想使用手动触发、似乎应该使用链接自动重新加载。 对吗?
    我不知道这一点。。。 手动触发之后,EDMA3如何查找正确的参数集?
    (通道似乎映射到参数集,每个通道都有队列,但当我触发 EDMA3时,EDMA3如何找到正确的通道?)
    谢谢。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在传输过程中、参数被修改、所以您是对的、对于下一个传输、您必须再次设置参数。 为了加深您对外设的理解并熟悉外设、您可以从每次运行时的参数配置开始。 您可以为 Param 配置创建一个结构、然后只需重新应用该结构即可完成每次传输、我在我的应用程序中正以这种方式执行此操作。 实际上,我正在为每次传输执行 CSL_edma3ParamSetup(),然后是 CSL_edma3HwChannelControl( Handle,CSL_EDMA3_CMD_CHANGE_SET,NULL )。
    我已经阅读了有关 SEP-LINK 重新加载的内容、但没有亲自尝试过。 如果您比我更深入、请分享您的调查结果。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢你的答复。 真的很有帮助
    如果我继续工作、我会分享...
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    这是自自动重新加载的代码。

    定义2个参数句柄、只映射一个参数。(hParamPing)通过链接自 PSET、我可以执行自自动重新加载。

    (我附上了原始代码)

    我发现当代码位于 L2上但它不在 MSMC 上时、它可以正常工作。 问题是高速缓存的 maybe..because。

     您是否知道全局区域和阴影区域之间的区别是什么? (如果您知道、请告诉我。)

    /*获取参数集2的句柄*/
    hParamPing = CSL_edma3GetParamHandle (hChannel、2、状态);
    if (hParamPing ==空)
    {
    printf ("错误:2.\n"EDMA 获取参数输入失败);
    返回-1;
    }
    /*获取参数集2的句柄*/
    hParamPong = CSL_edma3GetParamHandle (hChannel、1、状态);
    if (hParamPong ==空)
    {
    printf ("错误:255的 EDMA 获取参数输入失败。\n"\};
    返回-1;
    }
    
    /*设置参数输入参数(Ping 缓冲区)*/
    myParamSetup.option = CSL_EDMA3_OPT_make (CSL_EDMA3_ITCCH_DIS、\
    CSL_EDMA3_TCCH_DIS、\
    CSL_EDMA3_ITCINT_DIS、\
    CSL_EDMA3_TCINT_EN、\
    0、CSL_EDMA3_TCC_NORMAL、\
    CSL_EDMA3_FIFOWIDTH_NONE、\
    CSL_EDMA3_STATIC_DIS、\
    CSL_EDMA3_SYNC_A、\
    CSL_EDMA3_ADDRMODE_INCR、\
    CSL_EDMA3_ADDRMODE_INCR );
    myParamSetup.srcAddr = Convert_CoreLocal2GlobalAddr ((UINT32) srcBuff1);
    myParamSetup.aCntbCnt = CSL_EDMA3_CNT_make (test_size* sizeof (uint16)、1);
    myParamSetup.dstAddr = Convert_CoreLocal2GlobalAddr ((UINT32) dstBuff1);
    myParamSetup.srcDstBidx = CSL_EDMA3_BIDX_make (0、0);
    myParamSetup.linkBcntrld= CSL_EDMA3_LINKBCNTRLD_make (hParamPong、1); 
    myParamSetup.srcDstCidx = CSL_EDMA3_CIDX_make (0、0);
    myParamSetup.ccnt = 1;
    
    /* Ping 设置*/
    if (CSL_edma3ParametSetup (hParamPing、&myParamSetup)!= CSL_Sok)
    {
    printf ("错误:EDMA 参数条目设置失败\n");
    返回-1;
    }
    
    /* Pong 设置*/
    if (CSL_edma3ParamSetup (hParamPong、&myParamSetup)!= CSL_Sok)
    {
    printf ("错误:EDMA 参数条目设置失败\n");
    返回-1;
    } 

    Thanks.e2e.ti.com/.../mcMain.c

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    关于全球区域和影子区域、请查看:
    e2e.ti.com/.../259337
    processors.wiki.ti.com/.../EDMA3
    processors.wiki.ti.com/.../II_devices

    "当代码在 L2上但在 MSMC"===上时,我发现它可以正常工作 >您是指 L2与 MSMC 中的代码放置、还是 L2与 MSMC 中的数据缓冲器? 在任一种情况下、您是否能够看到 IPR 位设置指示传输完成? 这意味着不能正常工作?

    此致、Eric
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我指的是代码放置。
    我运行了多个传输(触发)、发现第一个传输正常、但其他传输不起作用。 (它只工作一次。)
    谢谢你。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    我觉得输入 MSMC 或 LL2的代码不应该起任何作用。 您只使用1个 DSP 内核、对吧? 数据源和目标缓冲器在哪里? 您的意思是什么不起作用:代码卡住? EDMA IPR 未设置? 目标缓冲区没有获取数据?

    此致、Eric
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    代码在 L2存储器上运行、我只使用一个内核。 我刚才将 srcbuff1和 dstbuff1声明为全局变量。 (我认为它们是在 L2存储器中分配的)。

    如您所见、我测试了从 srcbuff1到 dstbuff1的256个字的传输、并多次检查256个字。

    当我在 MSMC 上运行代码时、256个字似乎只传输了一次。 感谢您的关注。 这将提高我的技能。

    
    

    对于(j=2;;j++)
    {
    memset (dstBuff1、0x0、test_size* sizeof (uint16));
    
    //全局区域中断的中断使能(位0-1)*/
    regionIntr.region = CSL_EDMA3;
    regionIntr.intr = 0x3;
    regionIntr.intrh = 0x0000;
    CSL_edma3TRN;
    
    
    
    
    
    regionIntr.intr chtrigger_trigger_t\n
    
    
    
    
    ch3;regionIntr.intrh = CCTRL_TR3;cht_chtrigger_t_chintran3
    while (!(regionIntr.intr & 0x1));
    
    //清除暂挂位*/CSL_edma3HwControl
    (hModule、CSL_EDMA3_CMD_INTRPEND_CLEAR、&regionIntr);
    
    /*为
    (i=0;i<test_size;i++)
    {
    if (srcBuff1[i]!= dstBuff1[i])
    {
    printf ("错误测试#%d:i =%d\n"、j、i);
    break;
    }
    if (i = test_size-1)}("printf:\n"、测试#")检查256个字
    
    
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    您的代码不显示源缓冲区的初始化方式、对于无限循环、似乎源缓冲区没有更改、但只需使用 memset 将 dstBuf 清零即可。 您是否启用了 L2缓存? 如果是,是否可以在 memset()之后尝试使用写回使缓存无效以确保清除 dstBuf? 或者、您是否可以禁用 L2缓存以排除任何缓存问题?

    此致、Eric
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好。

    很抱歉我迟到了。

    我对此问题进行了一些测试。 让我分享一下结果。

    软件位置 高速缓存设置* 结果
    MSMC L1、L2高速缓存使能 不好
    L2 L1、L2高速缓存使能 好的
    MSMC L1、L2缓存禁用 好的
    MSMC L1高速缓存禁用、L2高速缓存启用 好的

    *我使用"Edit platform"窗口设置高速缓存。 (在调试视图中,Project > RTSC Tools > platform >...)

    我还想知道...

    如果我将 L1、L2设置为高速缓存(最大大小的高速缓存集)并将软件放在 L2上、会发生什么情况。 ?

    谢谢。