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.

请帮看一下F5510的时钟设置是否正确?

Other Parts Discussed in Thread: CC1101

//======================== MCU时钟初始化 ==========================
//ACLK = LFXT1 = 32kHz, SMCLK = HF or default DCO, MCLK = HF or default DCO
void MCU_init()
{
  WDTCTL = WDTPW + WDTHOLD;                 // Stop watchdog timer
// Enable XT1
  P5SEL |= BIT4+BIT5;                             // Port select XT1
  UCSCTL6 &= ~(XT1OFF);                     // XT1 On
  UCSCTL6 |= XCAP_3;                           // Internal load cap 12pF,参考F5xx用户手册Page91 & Page108
// Enable XT2,需要外部负载电容
  P5SEL |= BIT2+BIT3;                             // Port select XT2
  UCSCTL6 &= ~XT2OFF;                       // Set XT2 On

// Loop until XT1、XT2 & DCO stabilizes
  do
  {
    UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG);
                                            // Clear XT2,XT1,DCO fault flags
    SFRIFG1 &= ~OFIFG;                         // Clear fault flags
  }while (SFRIFG1&OFIFG);                   // Test oscillator fault flag

  UCSCTL6 &= ~(XT1DRIVE_3);           // Xtal is now stable, reduce drive strength 
 
  UCSCTL6 &= ~XT2DRIVE0;                // Decrease XT2 Drive according to expected frequency
                                                                    // 参考F5xx用户手册Page108,目前设置为24~32MHz
  UCSCTL4 |= SELA_0 + SELS_5 + SELM_5;      // Select ACLK=XT1,SMCLK=XT2 or DCO,MCLK for XT2 or DCO
}

  • 代码初看起来没有问题,现在是芯片晶振起振出了问题?有些寄存器配置和具体硬件有关。比如32k晶振要求的负载电容是多少,XT2接的高频晶振是几M?请楼主再把问题描述的清楚一点吧。

  • 这个程序,原先使用上发生问题,XT1是常见的12.5pF负载电容(但并未在PCB上焊接电容、只有1只32768晶振);XT2原用的24.576MHz,配二只负载电容为27pF,最初工作基本正常(从ACLK的看门狗的LED闪烁、及SMCK源的串口输出字符串判断),但工作大约5秒后,明显感觉时钟不再对了,一个100ms的循环可以花费1分钟以上。

    后来将XT2换成7.3728MHz的,并对应调整串口设置后,前面那些异常不再出现了。

    想问一下,如果XT2想用尽量高速的,例如24.576MHz,该如何设置?

    F5510内部的ACLK精度和稳定性,能与常见的20ppm的32768晶振一致吗?

  • 代码中将XT2DRIVE0清成了0,XT2的Driver 没有开到最大,当外接晶振频率过高时,可能发生停振。将那句代码去掉再试试。

  • 另外,楼主所提到的ACLK精度,是否是指片内的REFO?REFO典型误差在3V,25C时是+/-1.5%,还是无法做到晶振的精度。

  • 发现问题了,不应该是时钟系统的事情。

    只要以下程序启动,就会出现不正常的现象:

    void GDO2_ISR(void)

    {

     TI_CC_GDO2_PxSEL &=~TI_CC_GDO2_PIN;      // 普通IO

     TI_CC_GDO2_PxDIR &=~TI_CC_GDO2_PIN;      // input

     TI_CC_GDO2_PxREN |= TI_CC_GDO2_PIN;       //  

     TI_CC_GDO2_PxIES &=~TI_CC_GDO2_PIN;      // P2.0 Lo->Hi edge

     TI_CC_GDO2_PxIE  |= TI_CC_GDO2_PIN;           // P2.0 interrupt enabled,GDO2

     TI_CC_GDO2_PxIFG &=~TI_CC_GDO2_PIN;      // P2.0 IFG cleared  

    }

    这是用于CC1101的外部中断,当CC1101接收到同步信号(或者数据,依据IOCFG2的设置而定)后,读出数据并回复和保存。

    以前用于F2132时都是正常的,但移植到F5510后,就出了问题。

    请问是什么地方忽略掉了?

  • IFG的清除在IE置位之后,会否是误进入P2的中断了,换个次序试试。