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.

[参考译文] MSP430F6659:每个 OSC 故障(XT2OFFG、XT1LFOFFG、DCOFFG)被持续置位。

Guru**** 2379650 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/828121/msp430f6659-every-osc-fault-xt2offg-xt1lfoffg-dcoffg-gets-set-constantly

器件型号:MSP430F6659

下面是所涉及的代码、对于我调用的函数、它们都可以在 DriverLib (http://dev.ti.com/tirex/content/msp/MSP430Ware_3_60_00_10/driverlib/doc/MSP430F5xx_6xx/html/index.html)( http://dev.ti.com/tirex/content/msp430ware_3_80_07_00/driverlib/doc/MSP430FR5xx_6xx/MSP430FR5xx_6xx_DriverLib_Users_Guide-2_91_11_01.pdf 上的指南)中找到。

总之、代码熔断:我们成功进入功率模式3、X2始终超时、然后 X1超时、将 ACLK 和 FLLREF 设置为 REFO 工作正常、然后 FLLSettle 因 DCOFFG 故障锁定。

由于每个时钟都发生故障、我希望我做了一些错误、而不是在这个定制板上出现如此糟糕的硬件故障。

X2为19.2MHz、X1为32并改变 kHz、虽然我最终希望通过 DCO 使 MCLK 以20运行、但这只是我的初始"振荡器工作"测试。

那么、有人看到我在这里缺少什么吗?

我将努力制作一个不使用 DriverLib 的版本。

int main (void)
{
WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器
uint8_t working_crystals = init_crystals (); //其代码如下所示,但在我的实际项目中,它位于另一个顶部包含的文件中。
while (1){
test_math();
test_freq();

}
返回0;
} 

uint8_t init_crystals (){
uint8_t working_crystals =(BIT1 | BIT2); //位1表示 X1,位2表示 X2
uint8_t VCORE = 0;
uint8_t core_set_counter = 17;

//从一开始,PMMVCore 为0,我们要将其移动到3,每次发生一个。
while ((VCORE < 3)&&(CORE_SET_COUNTER > 0)){ //虽然我们低于所需的 VCORE、但我们尝试了不到16次来更改它
core_set_counter--; //取消一次尝试
if (PMM_setVCoreUp (VCORE + 1)){ //尝试将其上调一个,如果您成功
VCORe++; //更新您的 VCORE 跟踪器,从而更新您的目标
CORE_SET_COUNTER = 17; //并重置您的尝试次数
}
}
//注意,由于制造商的勘误表,不使用此函数的 driverlib 版本可能会导致故障。
//测试此系统是否能够以16、12、8 MHz 运行。
//TODO:使用以下信息更好地设置时钟。
uint8_t MaxCPU = 8 +(VCORE << 2); //MaxCPU 速度、单位为 MHz = 8 + VCORE * 4.
UCS_setExternalClockSource (32768、 //X1频率、32.768kHz
19200000); //X2频率、19.2MHz

//UCS TurnOnXT2 (UCS_XT2_DRIVE_16MHz_24MHZ);
int16_t 外部;
int16_t 内部;
_no_operation(); //延迟循环
for (Outer = 24000;Outer > 0;Outer -){
for (inner = 10;inner > 0;inner--){
_no_operation();
}
}
//~~~~~~~~~~~~~~~~~~~~~~~ 这条线以上的所有内容都有效~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//此 if 语句始终失败(始终发生超时)
if (UCS_TurnOnXT2WithTimeout (UCS_XT2_DRIVE_16MHz_24MHZ、0xFFFF)){//将 XT2设置为正确的频率范围
//但如果某些错误位需要65536个周期才能清除,则返回到另一个时钟。
//Anyway、这种情况适用于 IT 正常工作和继续。
UCS_initClockSignal (UCS_MCLK、UCS_XT2CLK_select、UCS_Clock_divider); //主时钟目前以基本的19.2MHz 运行
UCS_initClockSignal (UCS_SMCLK、UCS_XT2CLK_select、UCS_Clock_divider); //Submain 现在以19.2运行、但我们稍后可能会对此进行更改

if (UCS_TurnOnLFXT1WithTimeout (UCS_XT1_DRIVE_3、UCS_XCAP_0、0xFFFF)){ //drive_3为高稳定性高功率、drive_0为低稳定性低功率
//Cap 为0、因为我们有自己的外部电容器、因此我们不需要使用内部电容器。 尽管如此、如果需要、我们可以进一步调整内部电阻器。
//同样、如果某些错误位占用65536个完整周期、但仍未清除、我们将返回到另一个计时器。
//但这是正常工作的情况,我们继续正常进行。
UCS_initClockSignal (UCS_ACLK、UCS_XT1CLK_select、UCS_Clock_divider); //和辅助时钟以32.768kHz 标准运行,用于... 原因

。}
否则{ //这是 X2工作正常但 X1不工作的情况。 在本例中、我们对 ACLK 使用 REFO
UCS_initClockSignal (UCS_ACLK、UCS_REFOCLK_select、UCS_Clock_divider);
//并显式关闭 X1。
UCS_TurnOffXT1 ();
working_crystals &=!(BIT1);
}

}

否则{ //这是 X2不工作的情况(现在始终发生)
//SO 第一步、关闭 X2
UCS_TurnOffXT2 ();
working_crystals &=!(BIT2);

//然后处理 X1
//现在它也总是超时
if (UCS_TurnOnLFXT1WithTimeout (UCS_XT1_DRIVE_3、UCS_XCAP_0、0xFFFF)){ //drive_3为高稳定性高功率、drive_0为低稳定性低功率
//Cap 为0、因为我们有自己的外部电容器、因此我们不需要使用内部电容器。 尽管如此、如果需要、我们可以进一步调整内部电阻器。
//同样、如果某些错误位占用65536个完整周期、但仍未清除、我们将返回到另一个计时器。
//但这是正常工作的情况,我们继续正常进行。
UCS_initClockSignal (UCS_ACLK、UCS_XT1CLK_select、UCS_Clock_divider); //和辅助时钟以32.768kHz 标准运行,用于... 原因。
//现在我们有 X1设置并通过 ACLK 运行,我们还通过 FLL 运行它,
UCS_initClockSignal (UCS_FLLREF、UCS_XT1CLK_select、UCS_Clock_divider);


}
否则{ //这是 X2发生故障和 X1发生故障的情况。 在本例中、我们对 ACLK 使用 REFO
//现在这种情况总是发生的,这些时钟信号输入似乎正常工作
UCS_initClockSignal (UCS_ACLK、UCS_REFOCLK_select、UCS_Clock_divider);
//然后通过 FLL 运行它
UCS_initClockSignal (UCS_FLLREF、UCS_REFOCLK_SELECT、UCS_CLOCK _divider);
//并显式关闭 X1
UCS_TurnOffXT1 ();
working_crystals &=!(BIT1);

}
//现在这两者中的一个已经设置了 ACLK 和 FLL,我们使用 FLL 来设置 DCO,我们将其用于 MCLK 和 SMCLK
//但该 FLLSettle 始终挂起在 DCOFFG 比较循环中
UCS_initFLSettle (19200、59);
UCS_initClockSignal (UCS_MCLK、UCS_DCOCLK_select、UCS_Clock_divider); //从技术上讲,这个是冗余的,因为 initFLL 将 MCLK 和 SCLK 设置为 DCO,但我们仍将在此处写入它。
while (HWREG8 (UCS_BASE + OFS_UCSCTL7_L)& DCOFFG);
UCS_initClockSignal (UCS_SMCLK、UCS_DCOCLK_select、UCS_Clock_divider); //Submain 目前以19.2MHz 运行、但我们稍后可能会对此进行更改。
//另请注意,当我们需要知道时钟频率时,我们使用方法来测量时钟频率,而不是仅仅假设,这实际上得出19.33312MHz


}

返回 working_crystals;
} 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    更新:这些似乎都是明显的故障、或者至少第一个故障是。 X2发生故障、因为相对于其默认 GPIO 配置、我没有正确设置 P7.2和 P7.3以运行 X2。  
    具体而言、在尝试开启晶体之前的任何时候添加行" P7SEL |=(BIT2 | BIT3);"。

    但仍然获得 X1超时、并且不再找到 DCO 错误、因为在这种模式下、我的代码不会尝试打开 DCO。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Andy:

    感谢您的详细帖子以及对您的调查结果的跟进。 我们很高兴听到您解决了 XT2问题。 对于 XT1、振荡器故障标志可能是由于代码中的配置不正确或者可能是错误的有效负载电容引起的、这可能是由于您正在使用定制板而引起的问题。

    当您深入研究时、我建议您阅读 《MSP430 32kHz 晶体振荡 器》应用手册、其中介绍了如何计算 XT1晶体外部所需的有效负载电容。 此外、我建议查看我们的代码示例、其中包含 XT1设置代码作为参考。 假设负载电容正确、则代码示例应在您的定制板上正常工作。

    此致、

    James