如题,使用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");
/**************************************************************************************/
}