我想使用IWR1443的PMIC_CLKOUT输出时钟信号。
但是我发现IWR1443没有直接调用的api。然后我在英文论坛进行了搜索参考,也参照了TRM。但是发现TRM手册上的IWR1443和其他mmw芯片也有区别。
我自己是如下写的,但是并没有观测到时钟输出,想请教下如何解决这个问题,谢谢。
我先设置了引脚P13复用为PMIC_CLKOUT
然后调用了自己写的函数
{
SOC_DriverMCB* ptrSOCDriverMCB;
int32_t retVal = 0;
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;
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->ptrTopRCMRegs->DCDCCTL1 = CSL_FINSR (ptrSOCDriverMCB->ptrTopRCMRegs->DCDCCTL1, 1U, 1U, 0U);
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);
ptrSOCDriverMCB->ptrTopRCMRegs->DCDCCTL1 = CSL_FINSR (ptrSOCDriverMCB->ptrTopRCMRegs->DCDCCTL1, 0U, 0U, 1U);
return retVal;
}
Chris Meng:
你好,
请问你是参考的下面的论坛讨论么?配置的顺序是否又尝试和下面论坛的一致?
e2e.ti.com/…/3309253
e2e.ti.com/…/2420424
ZhaiQian:
回复 Chris Meng:
你好,我是参考的这些讨论,配置顺序我分别按照TRM文档和讨论中的顺序都进行过尝试,但是都没有生效。
并且,我注意到TRM文档中14系列寄存器的定义功能和别的系列还存在区别。
尝试了很多次,对这个问题很苦恼。。。
Chris Meng:
回复 ZhaiQian:
你好,
你又尝试过下面的配置顺序么?
e2e.ti.com/…/827545你说的“TRM文档中14系列寄存器的定义功能和别的系列还存在区别”,能否具体一点?
ZhaiQian:
回复 Chris Meng:
这个我也尝试过,但是在这些尝试也无效的时候我也无法确定问题在哪里。
sorry,对于不同系列键的区别:
在IWR14xx/16xx/18xx/68xx Industrial Radar Family Technical Reference Manual中,
对于14xx是P310-311,但是比如对于16xx描述则不一样,P497-498。1854.swru522d.pdf
Chris Meng:
回复 ZhaiQian:
你好,
描述是由不同,但我不认为本质上有区别。
你的代码在最后为什么是否复位模块? 最后应该是下面类似操作吧。
//Enable the PMIC CLKOUT by releasing the reset <Bit 1>
RSTD.SetAndTransmit ("/Registers/MSS_TOPRCM/DCDCCTL1","0x32320202")
ZhaiQian:
回复 Chris Meng:
你好,ptrSOCDriverMCB->ptrTopRCMRegs->DCDCCTL1 = CSL_FINSR (ptrSOCDriverMCB->ptrTopRCMRegs->DCDCCTL1, 0U, 0U, 1U);
这句是把RST位写为1,也就是releasing the reset
Chris Meng:
回复 ZhaiQian:
你好,
请不要只关注注释,0x32320202里面的第0bit值为0,而第1bit值为1. 而你的代码配置第0bit为1,是不匹配的。
ZhaiQian:
回复 Chris Meng:
你好,我明白,把第1bit置1我也写了。如果是顺序问题,那我也不可能一步步硬试吧。。。
Chris Meng:
回复 ZhaiQian:
你好,
我建议你再检查一下代码的的寄存器设置值和论坛上的讨论是否一致。
或者你可以直接在CCS里按照论坛建议,写入相关寄存器值,看看结果如何?
ZhaiQian:
回复 Chris Meng:
你好
至少给我一个你们在IWr1443上实测通过的例子吧?