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 PSC配置与power down

如题,使用C6678过程中由于功耗太大,想通过配置PSC来降低功耗,但遇到一个问题,能通过PSC配置开启模块但不能关闭。

我使用的是TMDSEVM6678LE开发板,默认上电后PCIE是开启的,SRIO和HYPERLINK是关闭的,我想通过软件将这三部分都关闭,但是不行,于是我测试了一下开启,我发现SRIO和HYPERLINK可以开启,但开启后无法关闭。也许是我的程序有问题,希望能有人解答。以下是我的程序。

开启:

/*开启外设*/
void enableperipherals()
{
    /* Set SRIO Power domain to ON */
    CSL_PSC_enablePowerDomain (CSL_PSC_PD_SRIO);

    /* Enable the clocks too for SRIO */
    CSL_PSC_setModuleNextState (CSL_PSC_LPSC_SRIO, PSC_MODSTATE_ENABLE);

    /* Start the state transition */
    CSL_PSC_startStateTransition (CSL_PSC_PD_SRIO);

    /* Wait until the state transition process is completed. */
    while (!CSL_PSC_isStateTransitionDone (CSL_PSC_PD_SRIO));

    /* Return SRIO PSC status */
    if ((CSL_PSC_getPowerDomainState(CSL_PSC_PD_SRIO) == PSC_PDSTATE_ON) &&
        (CSL_PSC_getModuleState (CSL_PSC_LPSC_SRIO) == PSC_MODSTATE_ENABLE))
        printf("SRIO is enabled!\n");

    /* Set SRIO Power domain to ON */
    CSL_PSC_enablePowerDomain (CSL_PSC_PD_HYPERBRIDGE);

    /* Enable the clocks too for SRIO */
    CSL_PSC_setModuleNextState (CSL_PSC_LPSC_HYPERBRIDGE, PSC_MODSTATE_ENABLE);

    /* Start the state transition */
    CSL_PSC_startStateTransition (CSL_PSC_PD_HYPERBRIDGE);

    /* Wait until the state transition process is completed. */
    while (!CSL_PSC_isStateTransitionDone (CSL_PSC_PD_HYPERBRIDGE));

    /* Return SRIO PSC status */
    if ((CSL_PSC_getPowerDomainState(CSL_PSC_PD_HYPERBRIDGE) == PSC_PDSTATE_ON) &&
        (CSL_PSC_getModuleState (CSL_PSC_LPSC_HYPERBRIDGE) == PSC_MODSTATE_ENABLE))
        printf("HYPERLInK is enabled!\n");
}

关闭:

/*关闭外设*/
void disableperipherals()
{
    /* Wait until the state transition process is completed. */
    while(!CSL_PSC_isStateTransitionDone (CSL_PSC_PD_PCIEX));//pcie

    /* Disable the clocks too for PCIE */
    /* Module is in Reset state. Clock is off. */
    CSL_PSC_setModuleNextState (CSL_PSC_LPSC_PCIEX, PSC_MODSTATE_SWRSTDISABLE);

    /* Set PCIE Power domain to OFF */
    CSL_PSC_disablePowerDomain (CSL_PSC_PD_PCIEX);

    /* Wait until the state transition process is completed. */
    while(!CSL_PSC_isStateTransitionDone (CSL_PSC_PD_PCIEX));
    if(CSL_PSC_getPowerDomainState (CSL_PSC_PD_PCIEX) == PSC_PDSTATE_OFF)
        printf("PCIE POWER DOMAIN is disabled!\n");
    if(CSL_PSC_getModuleState (CSL_PSC_LPSC_PCIEX) == PSC_MODSTATE_SWRSTDISABLE)
    /*if((CSL_PSC_getPowerDomainState (CSL_PSC_PD_PCIEX) == PSC_PDSTATE_OFF) &&
            (CSL_PSC_getModuleState (CSL_PSC_LPSC_PCIEX) == PSC_MODSTATE_SWRSTDISABLE))*/
        printf("PCIE module is disabled!\n");
    /**************************************************************************************/

    /* Wait until the state transition process is completed. */
    while(!CSL_PSC_isStateTransitionDone (CSL_PSC_PD_SRIO));//SRIO

    /* Disable the clocks too for SRIO */
    /* Module is in Reset state. Clock is off. */
    CSL_PSC_setModuleNextState (CSL_PSC_LPSC_SRIO, PSC_MODSTATE_SWRSTDISABLE);

    /* Set PCIE Power domain to OFF */
    CSL_PSC_disablePowerDomain (CSL_PSC_PD_SRIO);

    /* Wait until the state transition process is completed. */
    while(!CSL_PSC_isStateTransitionDone (CSL_PSC_PD_SRIO));
    if((CSL_PSC_getPowerDomainState (CSL_PSC_PD_SRIO) == PSC_PDSTATE_OFF) &&
            (CSL_PSC_getModuleState (CSL_PSC_LPSC_SRIO) == PSC_MODSTATE_SWRSTDISABLE))
        printf("SRIO module is disabled!\n");

    /**************************************************************************************/

    /* Wait until the state transition process is completed. */
    while(!CSL_PSC_isStateTransitionDone (CSL_PSC_PD_HYPERBRIDGE));//HYPERLINK

    /* Disable the clocks too for HYPERLINK */
    /* Module is in Reset state. Clock is off. */
    CSL_PSC_setModuleNextState (CSL_PSC_LPSC_HYPERBRIDGE, PSC_MODSTATE_SWRSTDISABLE);

    /* Set PCIE Power domain to OFF */
    CSL_PSC_disablePowerDomain (CSL_PSC_PD_HYPERBRIDGE);

    /* Wait until the state transition process is completed. */
    while(!CSL_PSC_isStateTransitionDone (CSL_PSC_PD_HYPERBRIDGE));
    if((CSL_PSC_getPowerDomainState (CSL_PSC_PD_HYPERBRIDGE) == PSC_PDSTATE_OFF) &&
            (CSL_PSC_getModuleState (CSL_PSC_LPSC_HYPERBRIDGE) == PSC_MODSTATE_SWRSTDISABLE))
        printf("HYPERLINK module is disabled!\n");
    /**************************************************************************************/
}

x 出现错误。请重试或与管理员联系。