我想使用IWR1443的PMIC_CLKOUT输出时钟信号。
但是我发现IWR1443没有直接调用的api。然后我在英文论坛进行了搜索参考,也参照了TRM。但是发现TRM手册上的IWR1443和其他mmw芯片也有区别。
我自己是如下写的,但是并没有观测到时钟输出,想请教下如何解决这个问题,谢谢。
我先设置了引脚P13复用为PMIC_CLKOUT
然后调用了自己写的函数
static int32_t SOC_setPMIC_CLKOUT(SOC_Handle handle, int32_t* errCode)
{
SOC_DriverMCB* ptrSOCDriverMCB;
int32_t retVal = 0;
{
SOC_DriverMCB* ptrSOCDriverMCB;
int32_t retVal = 0;
pmicClockCfg_t pmicClkCfg;
pmicClkCfg.pmicClkOutEn = 1U;
pmicClkCfg.pmicClkOutSrc = 0U; /* CLK Src XTAL:40MHz */
pmicClkCfg.pmicClkSrcDiv = 16U; /* 40M / 250 = 160 KHz */
pmicClkCfg.modeSel = 0U;
pmicClkCfg.freqSlope = 0U;
pmicClkCfg.minNdivVal = 15U;
pmicClkCfg.maxNdivVal = 17U;
pmicClkCfg.clkDitherEn = 0U;
pmicClkCfg.pmicClkOutEn = 1U;
pmicClkCfg.pmicClkOutSrc = 0U; /* CLK Src XTAL:40MHz */
pmicClkCfg.pmicClkSrcDiv = 16U; /* 40M / 250 = 160 KHz */
pmicClkCfg.modeSel = 0U;
pmicClkCfg.freqSlope = 0U;
pmicClkCfg.minNdivVal = 15U;
pmicClkCfg.maxNdivVal = 17U;
pmicClkCfg.clkDitherEn = 0U;
/* Get the pointer to the SOC Driver Block: */
ptrSOCDriverMCB = (SOC_DriverMCB*)handle;
if (ptrSOCDriverMCB == NULL)
{
*errCode = SOC_EINVAL;
retVal = MINUS_ONE;
}
else
{
System_printf("Debug: PMIC Initialization was successful\n");
//设置PMIC输出
SOC_DriverMCB* ptrSOCDriverMCB = (SOC_DriverMCB*)handle;
/* PMIC clockout enable request is issued*/
ptrSOCDriverMCB = (SOC_DriverMCB*)handle;
if (ptrSOCDriverMCB == NULL)
{
*errCode = SOC_EINVAL;
retVal = MINUS_ONE;
}
else
{
System_printf("Debug: PMIC Initialization was successful\n");
//设置PMIC输出
SOC_DriverMCB* ptrSOCDriverMCB = (SOC_DriverMCB*)handle;
/* PMIC clockout enable request is issued*/
/* Disable the dithering control block .DCDCCTL1.DCDCLKEN */ //toprcmREG->DCDCCTL1[1] = 0U;
//ptrSOCDriverMCB->ptrTopRCMRegs->DCDCCTL1 = CSL_FINSR (ptrSOCDriverMCB->ptrTopRCMRegs->DCDCCTL1, 1U, 1U, 0U);
//ptrSOCDriverMCB->ptrTopRCMRegs->DCDCCTL1 = CSL_FINSR (ptrSOCDriverMCB->ptrTopRCMRegs->DCDCCTL1, 1U, 1U, 0U);
/* 1 Setup the frequency slope .DCDCCTL0.DCDCCTL0 */ //toprcmREG->DCDCCTL0[25:0]= pmicClkCfg.freqSlope;
ptrSOCDriverMCB->ptrTopRCMRegs->DCDCCTL0 = CSL_FINSR (ptrSOCDriverMCB->ptrTopRCMRegs->DCDCCTL0,
25U, 0U, pmicClkCfg.freqSlope);
/* 2 Dithering control block reset. Set to 0 .DCDCCTL1.DCDCRST */
ptrSOCDriverMCB->ptrTopRCMRegs->DCDCCTL1 = CSL_FINSR (ptrSOCDriverMCB->ptrTopRCMRegs->DCDCCTL1, 0U, 0U, 0U);
/* 3 Enable the dithering control block .DCDCCTL1.DCDCLKEN */ //toprcmREG->DCDCCTL1[1] = 1U;
ptrSOCDriverMCB->ptrTopRCMRegs->DCDCCTL1 = CSL_FINSR (ptrSOCDriverMCB->ptrTopRCMRegs->DCDCCTL1, 1U, 1U, 1U);
/* 4 Setup the mode of operation .DCDCCTL1.DCDCCTL1[8] */ //toprcmREG->DCDCCTL1[8] = pmicClkCfg.modeSel;
ptrSOCDriverMCB->ptrTopRCMRegs->DCDCCTL1 = CSL_FINSR (ptrSOCDriverMCB->ptrTopRCMRegs->DCDCCTL1,
8U, 8U, pmicClkCfg.modeSel);
/* 5 Setup the clock dither control .DCDCCTL1.DCDCCTL1[9] */ //toprcmREG->DCDCCTL1[9] = pmicClkCfg.clkDitherEn
ptrSOCDriverMCB->ptrTopRCMRegs->DCDCCTL1 = CSL_FINSR (ptrSOCDriverMCB->ptrTopRCMRegs->DCDCCTL1,
9U, 9U, pmicClkCfg.clkDitherEn);
/* 6 7 Setup the divider value */
//toprcmREG->DCDCCTL1[23:16] = pmicClkCfg.minNdivVal; //toprcmREG->DCDCCTL1[31:24] = pmicClkCfg.maxNdivVal;
ptrSOCDriverMCB->ptrTopRCMRegs->DCDCCTL1 = CSL_FINSR (ptrSOCDriverMCB->ptrTopRCMRegs->DCDCCTL1,
23U, 16U, pmicClkCfg.minNdivVal);
ptrSOCDriverMCB->ptrTopRCMRegs->DCDCCTL1 = CSL_FINSR (ptrSOCDriverMCB->ptrTopRCMRegs->DCDCCTL1,
31U, 24U, pmicClkCfg.maxNdivVal);
ptrSOCDriverMCB->ptrTopRCMRegs->DCDCCTL0 = CSL_FINSR (ptrSOCDriverMCB->ptrTopRCMRegs->DCDCCTL0,
25U, 0U, pmicClkCfg.freqSlope);
/* 2 Dithering control block reset. Set to 0 .DCDCCTL1.DCDCRST */
ptrSOCDriverMCB->ptrTopRCMRegs->DCDCCTL1 = CSL_FINSR (ptrSOCDriverMCB->ptrTopRCMRegs->DCDCCTL1, 0U, 0U, 0U);
/* 3 Enable the dithering control block .DCDCCTL1.DCDCLKEN */ //toprcmREG->DCDCCTL1[1] = 1U;
ptrSOCDriverMCB->ptrTopRCMRegs->DCDCCTL1 = CSL_FINSR (ptrSOCDriverMCB->ptrTopRCMRegs->DCDCCTL1, 1U, 1U, 1U);
/* 4 Setup the mode of operation .DCDCCTL1.DCDCCTL1[8] */ //toprcmREG->DCDCCTL1[8] = pmicClkCfg.modeSel;
ptrSOCDriverMCB->ptrTopRCMRegs->DCDCCTL1 = CSL_FINSR (ptrSOCDriverMCB->ptrTopRCMRegs->DCDCCTL1,
8U, 8U, pmicClkCfg.modeSel);
/* 5 Setup the clock dither control .DCDCCTL1.DCDCCTL1[9] */ //toprcmREG->DCDCCTL1[9] = pmicClkCfg.clkDitherEn
ptrSOCDriverMCB->ptrTopRCMRegs->DCDCCTL1 = CSL_FINSR (ptrSOCDriverMCB->ptrTopRCMRegs->DCDCCTL1,
9U, 9U, pmicClkCfg.clkDitherEn);
/* 6 7 Setup the divider value */
//toprcmREG->DCDCCTL1[23:16] = pmicClkCfg.minNdivVal; //toprcmREG->DCDCCTL1[31:24] = pmicClkCfg.maxNdivVal;
ptrSOCDriverMCB->ptrTopRCMRegs->DCDCCTL1 = CSL_FINSR (ptrSOCDriverMCB->ptrTopRCMRegs->DCDCCTL1,
23U, 16U, pmicClkCfg.minNdivVal);
ptrSOCDriverMCB->ptrTopRCMRegs->DCDCCTL1 = CSL_FINSR (ptrSOCDriverMCB->ptrTopRCMRegs->DCDCCTL1,
31U, 24U, pmicClkCfg.maxNdivVal);
//初始化
/* Disable the clock by gating off the clock */ //toprcmREG.EXTCLKCTL[15:8] = 0xAD;
ptrSOCDriverMCB->ptrTopRCMRegs->EXTCLKCTL = CSL_FINSR (ptrSOCDriverMCB->ptrTopRCMRegs->EXTCLKCTL, 15U, 8U, 0xADU);
/* Setup the clock divider value */ //toprcmREG->EXTCLKDIV[15:8] = pmicClkCfg.pmicClkSrcDiv;
ptrSOCDriverMCB->ptrTopRCMRegs->EXTCLKDIV = CSL_FINSR (ptrSOCDriverMCB->ptrTopRCMRegs->EXTCLKDIV,
15U, 8U, pmicClkCfg.pmicClkSrcDiv);
/* Select the source of the PMIC clock */ //toprcmREG->EXTCLKSRCSEL[11:8] = pmicClkCfg.pmicClkOutSrc;
ptrSOCDriverMCB->ptrTopRCMRegs->EXTCLKSRCSEL = CSL_FINSR (ptrSOCDriverMCB->ptrTopRCMRegs->EXTCLKSRCSEL,
11U, 8U, pmicClkCfg.pmicClkOutSrc);
/* Ungate the PMIC clockout */ //toprcmREG->EXTCLKCTL[15:8] = 0x0U;
ptrSOCDriverMCB->ptrTopRCMRegs->EXTCLKCTL = CSL_FINSR (ptrSOCDriverMCB->ptrTopRCMRegs->EXTCLKCTL, 15U, 8U, 0U);
/* Disable the clock by gating off the clock */ //toprcmREG.EXTCLKCTL[15:8] = 0xAD;
ptrSOCDriverMCB->ptrTopRCMRegs->EXTCLKCTL = CSL_FINSR (ptrSOCDriverMCB->ptrTopRCMRegs->EXTCLKCTL, 15U, 8U, 0xADU);
/* Setup the clock divider value */ //toprcmREG->EXTCLKDIV[15:8] = pmicClkCfg.pmicClkSrcDiv;
ptrSOCDriverMCB->ptrTopRCMRegs->EXTCLKDIV = CSL_FINSR (ptrSOCDriverMCB->ptrTopRCMRegs->EXTCLKDIV,
15U, 8U, pmicClkCfg.pmicClkSrcDiv);
/* Select the source of the PMIC clock */ //toprcmREG->EXTCLKSRCSEL[11:8] = pmicClkCfg.pmicClkOutSrc;
ptrSOCDriverMCB->ptrTopRCMRegs->EXTCLKSRCSEL = CSL_FINSR (ptrSOCDriverMCB->ptrTopRCMRegs->EXTCLKSRCSEL,
11U, 8U, pmicClkCfg.pmicClkOutSrc);
/* Ungate the PMIC clockout */ //toprcmREG->EXTCLKCTL[15:8] = 0x0U;
ptrSOCDriverMCB->ptrTopRCMRegs->EXTCLKCTL = CSL_FINSR (ptrSOCDriverMCB->ptrTopRCMRegs->EXTCLKCTL, 15U, 8U, 0U);
/* Dithering control block reset. Set to 1 .DCDCCTL1.DCDCRST */
ptrSOCDriverMCB->ptrTopRCMRegs->DCDCCTL1 = CSL_FINSR (ptrSOCDriverMCB->ptrTopRCMRegs->DCDCCTL1, 0U, 0U, 1U);
ptrSOCDriverMCB->ptrTopRCMRegs->DCDCCTL1 = CSL_FINSR (ptrSOCDriverMCB->ptrTopRCMRegs->DCDCCTL1, 0U, 0U, 1U);
}
return retVal;
}
return retVal;
}
根据打印信息发现寄存器的设置写入操作步骤都是正常执行了的。