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.

TMS320 C66xx TCP3D中断不能触发



使用PDK的example代码 在EVM板上跑,发现中断不能触发,但是从OUTHD上看解码应该是完成的。

论坛上有人说和SIMULATOR_SUPPORT 有关

但是不知道下面的代码是定义还是不定义该宏

static Int32 enable_tcp3d (void)
{
 
#ifndef SIMULATOR_SUPPORT
    /* TCP3D power domain is turned OFF by default.
     * It needs to be turned on before doing any TCP3D device register access.
     * This is not required for the simulator. */
 
    /* Set TCP3D Power domain to ON */         
    CSL_PSC_enablePowerDomain (CSL_PSC_PD_TCP3D_A);
    CSL_PSC_enablePowerDomain (CSL_PSC_PD_TCP3D_B);
    /* Enable the clocks too for TCP3D */
    CSL_PSC_setModuleNextState (CSL_PSC_LPSC_TCP3D_A, PSC_MODSTATE_ENABLE);
    CSL_PSC_setModuleNextState (CSL_PSC_LPSC_TCP3D_B, PSC_MODSTATE_ENABLE);
    /* Start the state transition */
    CSL_PSC_startStateTransition (CSL_PSC_PD_TCP3D_A);
    CSL_PSC_startStateTransition (CSL_PSC_PD_TCP3D_B);
    /* Wait until the state transition process is completed. */
    while (!CSL_PSC_isStateTransitionDone (CSL_PSC_PD_TCP3D_A));
 
    /* Return TCP3D_A PSC status */
    if ((CSL_PSC_getPowerDomainState(CSL_PSC_PD_TCP3D_A) != PSC_PDSTATE_ON) ||
        (CSL_PSC_getModuleState (CSL_PSC_LPSC_TCP3D_A) != PSC_MODSTATE_ENABLE))
    {
        /* TCP3D Power on failed. Return error */
        return -1;
    }
 
    while (!CSL_PSC_isStateTransitionDone (CSL_PSC_PD_TCP3D_B));
    /* Return TCP3D_B PSC status */
    if ((CSL_PSC_getPowerDomainState(CSL_PSC_PD_TCP3D_B) != PSC_PDSTATE_ON) ||
        (CSL_PSC_getModuleState (CSL_PSC_LPSC_TCP3D_B) != PSC_MODSTATE_ENABLE))
    {
        /* TCP3D Power on failed. Return error */
        return -1;
    }
    return 0;
#else
        /* PSC is not supported on simulator. Return success always */
        return 0;
#endif
}

我在demo板上尝试了一下,不定义该宏,解码能成功,但是中断不能触发

                                                  定义该宏后,解码不能成功,inparam都没有搬移到tcp3d上去

清问有知道的吗

  • 调试跟踪了一下代码,知道这种现象的原因在哪儿了

    先回答上面的问题,如果是在EVM板上就不要定义SIMULATOR_SUPPORT

    至于后面为什么不能触发中断,我的理解上是这样的,有可能不正确 需要TI的FAE确认一下并解答一下吧

    EDMA3_DRV_Handle edma3init (unsigned int edma3Id, EDMA3_DRV_Result *errorCode, 
                                unsigned int dspCoreID, unsigned int tpccRegionUsed) 

            instanceConfig = &sampleInstInitConfig[edma3Id][tpccRegionUsed]; 
     
            initCfg.isMaster = TRUE;         ------------------------------- 
            /* Choose shadow region according to the DSP# */ 
            initCfg.regionId = (EDMA3_RM_RegionId)tpccRegionUsed; 
            /* Driver instance specific config NULL */ 
            initCfg.drvInstInitConfig = instanceConfig; 
     
            initCfg.gblerrCb = NULL; 
            initCfg.gblerrData = NULL; 
     
            /* Open the Driver Instance */ 
            hEdma = EDMA3_DRV_open (edma3Id, (void *) &initCfg, &edma3Result); 
     

    在edma3init的过程中需要对initCfg.isMaster赋值,提供给EDMA3_open使用 
    在下面的结构体中有注释说明 只有与主instance连接的region才能接受EDMA3的中断。 
    因为在我的环境中已经有edma3init过了,但是和TCP3D中的edma3init使用的不是同一个edma3Id和tpccRegionUsed 
     
    所以我的疑问就是 
    1 注释中的instance 与cc 对应还是与region对应? 
      如果我的环境下是3个cc,每个cc有8个region,那我如何使用才能产生各自的中断? 
      比如TCP3D使用(cc2,region3)。VCP使用(cc2,region4) 
    2 还有一个问题就是如果我在多个dsp使用的时候,使用一个cc的不同region,如何去定义? 
     
    3 我从文档上没有看到必须是master才能接收中断,按道理,每个region都出一个中断经过CIC编程后分发给不同dsp接收 
      不知道为啥要有个master?   
    typedef struct 

        /** Region Identification */ 
        EDMA3_RM_RegionId       regionId; 
     
        /** 
         * It tells whether the EDMA3 DRV instance is Master or not. Only the shadow 
         * region associated with this master instance will receive the EDMA3 
         * interrupts (if enabled). 
         */ 
        uint32_t            isMaster; 
    .. 
    } EDMA3_DRV_InitConfig; 

  • 这里说的master是与实现方式有关,先回答你的疑问:

    1. instance是EDMC CC标号,与region无关;

    2. TCP, VCP都是通过EDMA传输完成来产生中断,所以具体的中断是跟EDMA有关,而EDMA中每个region对应一个中断事件输出,对于同处同一region的channel可以通过查询IPR bit来区分中断类型;

    基于你目前的问题,建议在处理完成后查看EDMA中相关的IPR bit是否置位,如果置位说明中断事件以产生,然后确认相关的CIC中断路由及服务函数挂接等配置没有问题。

     

  • andy 谢谢你的回复

    我现在使用的是sdk example里

    EDMA3_DRV_Handle edma3init (unsigned int edma3Id, EDMA3_DRV_Result *errorCode,
    unsigned int dspCoreID, unsigned int tpccRegionUsed) 来分别初始化EDMA TCP VCP的

    但是EDMA TCP VCP 分别选择不同的tpccRegionUsed,同一个edma3Id

    应用中发现只有initCfg.isMaster = TRUE的 加速器才会产生中断,如果都置为TURE  最后一个会响应中断

    中断服务函数应该是正确的,因为无论是edma vcp tcp只要谁置为master 就能跑到对应的中断处理函数里

  • 对应这种软件的问题,最好的办法就是单步跟进代码看看代码中根据这个参数所做的特殊配置。

  • 我跟进到edma的库代码Edma3resmgr.c (z:\ti\edma3_lld_02_11_05_02\packages\ti\sdo\edma3\rm\src)
    中有下面的描述,我不明白为什么只有设置为master的region才能收到中断?没有从文档上看到硬件上面的限制呢?

    在EDMA3_RM_Handle EDMA3_RM_open (uint32_t phyCtrllerInstId,
    const EDMA3_RM_Param *initParam,
    EDMA3_RM_Result *errorCode)
    {
    ...
    /*
    * If the EDMA RM instance is MASTER (ie. initParam->isMaster
    * is TRUE), save the region ID.
    * Only this shadow region will receive the
    * EDMA3 interrupts, if enabled.
    */
    if (TRUE == initParam->isMaster)
    {
    /* Store the region id to use it in the ISRs */
    edma3RegionId = rmInstance->initParam.regionId;
    masterExists[phyCtrllerInstId] = TRUE;
    }
    }

  • 这是软件实现的方式,与硬件无关,硬件没有这种所谓的限制。

  • 这几个api都是pdk 提供的,如何才能规避这个软件限制?