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.

[参考译文] MSP430FR2311:无法使外部高频(16MHz)振荡器工作

Guru**** 2826755 points

Other Parts Discussed in Thread: MSP430FR2311

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/724779/msp430fr2311-cannot-get-an-external-high-frequency-16mhz-oscillator-to-work

器件型号:MSP430FR2311

大家好、使用 MSP430FR2311时、我们无法使用外部16MHz 振荡器。

```μ A

//将2.6和 P2.7设置为 XT1引脚
P2SEL1 = BIT6 | BIT7;

//设置外部晶体用法
// XT1HFFREQ_2:10b =高于6MHz 到16MHz
// DIVA = 512 => ACLK = 31250Hz
CSCTL6 |= XTS_1 | XT1HFFREQ_2|<0x13_512_
CSCTL4 |=(SELMS_XT1CLK | SELA_XT1CLK);//设置 ACLK = XT1;MCLK = SMCLK = DCO
CSCTL3 = SELREF_XT1CLK 和 FLLREFDIV__512 //将 FLL 参考设置为 XT1 /


///
(等待 XCOFFG

和 XCOFFG)|~ //清除 XT1和 DCO 故障标志
SFRIFG1 &=~OFIFG;//清除中断
}while (SFRIFG1和 OFIFG); 

```μ A


但我们从未停止等待...

有人能看到什么问题吗?
我们还尝试了不同的晶体和电容器。

2*6pf 电容器这个 晶振  

我使用的是调试器和 Code Composer Studio。 在循环前后放置断点。

提前感谢

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

    请检查具有调试范围的 ACLK 和 MCLK、以查看这些信号的频率。
    另外、请说明哪些故障标志无法清除? 这是 XT1OFFG 还是 DCOFFG?
    如何设置 FLL 乘法器位和 DCO RSEL 位?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    用户好!

    也许我需要一杯咖啡、因为我看不到
    如何为 FRAM 操作添加等待状态。
    FRAM 需要1个等待状态才能与 MCU @16MHz 配合使用。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    -直到明天我才可以检查范围。 我会在我有机会后与您保持联系。

    XT1OFFG 是不清零的。

    -我不在循环之前设置 FLL 乘法器。 我应该吗? 在示例代码中、FLL 在此循环后设置。

    下面是如何设置 DCORSEL 位:

    CSCTL1 &=~(0b1110);  //设置 DCO = 1MHz

    -这是我如何设置 FLL 乘法器位

    CSCTL2 = FLLD_0 | 31; // DCOCLKDIV = 1MHz

    ------------------------------------------

    总之、我尝试了以下几项:

    添加以下行、XT1OFFG 和 DCOFFG 都被置位:

    `CSTCTL0 = 0;循环前`μ s。

    这是我尝试过的代码、但 FLL 不会锁定。 在尝试启动 DCO 之前、我还尝试了相同的 CSCTL 设置、但 DCOFFG 和 XT1OFFG 都无法清除。

    P2SEL1 = BIT6 | BIT7;
    
    
    CSCTL6 &=~
    
    
    
    
    
    ~(DIVA)//将 DIVA 清除为0 CSCTL6 |= XTS_1 | XT1HFFREQ_2 | DIVA__512 |(0x1 <<13);CSCTL4 |= SELMS_XT1CLK |_ XT1CLK|_ 0 + CSCTL1寄存器0 + CSCLLA 0 + CSCLLA 0 + 0 + CSCLCE0 + CSCL0 + CSCL0 + CSCLLA 0 + C1CLK 寄存器 //设置 DCO = 1MHz
    
    CSCTL3 = SELREF_XT1CLK & FLLREFDIV__512;//将 XT1设置为 FLL 基准源
    
    // DCOCLK =(FLLN + 1)* FLLREFCLK / FLLREFDIV =(31 + 1)* 16MHz / 512
    // DCOCLK
    =(FLLN + 1)* FLLREFCLK = FLLDCLK = DCLK = 1)* FLLDCOCLK = DCLK = DCLK = DCLK = DCLKCLK // DCOCLKDIV = 1MHz
    
    
    __bis_SR_register (SCG0);//禁用 FLL
    
    // FLLREF = 16MHz
    // FLLREFDIV = 32.250kHz
    CSCTL3 = SELREF_XT1CLK & FLLREFDIV_512;//将 XT1设置为 FLL 基准源
    
    ;/ CSCTL0 = CSCB0 ~ 0;清除寄存器 //设置 DCO = 1MHz
    
    // DCOCLK =(FLLN + 1)* FLLREFCLK / FLLREFDIV =(31 + 1)* 16MHz / 512
    // DCOCLKDIV = DCOCLK / 2** FLLD = 1MHz
    CSCTL2 = FLLD_0 | 31;// DCOCLKDIV =
    
    3倍* CCOCLKSR_0*
    
    
    (3倍);_ CCOCL_DCOCLUS_0_DCR = 3倍(3倍) //启用 FLL
    while (CSCTL7 &(FLLUNLOCK0 | FLLUNLOCK1)); // FLL 锁定
    

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

    您为什么要等待范围?
    将 FRCTL0寄存器中的 NWAITS[2:0]位置为"001"。
    如果您不实施、范围将不会对您有所帮助。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    当您尝试使用示波器分析您的 MCU 信号时、我的提示是:
    为了确保存储器完整性、实施了一种复位器件的机制
    如果系统时钟频率和等待状态设置违反 FRAM 访问时序、则使用 PUC。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Tomasz、
    示波器有助于查看时钟信号的外观以及频率和占空比是否符合预期。 这可以提供晶体是否正确振荡的提示。 但您认为正确、FRAM 的等待状态似乎未在此处进行连接。

    user3629885、
    除了这个 Tomasz、您还可以为 MCLK 选择 XT1CLK、这意味着您必须在执行此操作之前将等待状态与更高的频率保持一致! 否则、您将对器件进行超频、这可能导致复位或其他不可预测的行为。

    此致、
    Dietmar
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Dietmar、
    我希望、我知道有什么余地。
    当范围不可用时、我尝试推进此项目。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Tomasz、 Dietmar

    感谢您的回复、

    实际上、我使用16MHz 振荡器、但我将 MCU 设置为@1MHz 运行。

    无论如何、我尝试添加以下内容:

    FRCTL0 = FRCTLPW | NWAITS0;

    设置引脚以执行外部晶振操作后立即执行该操作。

    但它仍然不起作用。 (锁定在"while (SFRIFG1 & OFIFG);" 循环中)

    直接在晶体上使用示波器、似乎晶体根本不会振荡。

    我尝试使用驱动程序库设置所有内容:

    void main (void){
    //设置 WDT
    //WDTCTL = WDTPW | WDTSSEL_VLOCLK | WDTIS_512K | WDTCNTCL;
    WDTCTL = WDTPW | WDTHOLD;
    //将2.6和 P2.7设置为 XT1引脚
    P2SEL1 = BIT6 | BIT7;
    
    FRCTL0 = FRCTLPW | NWAITS0;
    CS_TurnOnXT1HF (XT1DRIVE_3、XT1HFFREQ_2);
    } 

    但也会出现同样的问题。

    我还使用以下内容检查了时钟设置:

    clockValue = CS_getMCLK ();
    clockValue = CS_getACLK ();
    clockValue = CS_getSMCLK (); 

    这将提供所需的结果(MCLK =SMCLK ==1000000和 ACLK ==31250)如果我还记得( 它是目标设置)

    芯片仍然锁定在该验证环路中。

    ===================

    下一步、我将尝试使用频率为1MHz 的信号发生器直接驱动芯片。 保持联系。

    此致

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

    因此、我尝试使芯片与外部信号发生器一起工作。 结果与以前相同。

    测量信号时、您可以看到信号非常弱。 那么、我想知道什么可能导致信号这么弱。

    我使用了10x 探头。 将示波器直接连接到发生器可提供完美的方波。

    我还尝试让芯片在不使用晶体的情况下工作、并且它工作正常。

    不过、我需要使用外部晶体...

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我刚才尝试了信号发生器和示例代码中的低频(30kHz)->同样的问题。

    我还尝试了不同的 PCB 和芯片。 结果相同。

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

    如果需要、您可以布置原理图的一部分+布局。 请注意、布局对于寄生电容器而言可能起着虚构的作用。

    但是、当它不能与外部函数发生器配合使用时、寄生效应可能不是问题。

    此致、
    Dietmar

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

    您好、再说一次、

    所以我解决了这个问题、芯片没有正确焊接。 这确实是一个难题。

    那么、这里是我使用的代码、它起作用。 以供将来使用。




    CSCTL6 |= XTS; //选择 XT1 HF 模式 CSCTL4 = SELMS_XT1CLK | SELA_REFOCLK;//设置 MCLK = XT1CLK = 16MHz // XT1CLK = MCLK 和 SMCLK 源 P2SEL1 |= BIT6 | BIT7; // P2.6~P2.7:晶振引脚 操作 { CSCTL7 &=~(XT1OFFG | DCOFFG); //清除 XT1和 DCO 故障标志 SFRIFG1 &=~OFIFG; } while (SFRIFG1和 OFIFG); //测试振荡器故障标志 CSCTL5 |= DIVM__16 | DIVS_0; // MCLK = XT1CLK / 16 = 1MHz、 // SMCLK = MCLK = 1MHz _bis_SR_register (SCG0); //禁用 FLL CSCTL3 |= SELREF_XT1CLK | FLLREFDIV__512; //将 XT1设置为 FLL 基准源 CSCTL0 = 0; //清除 DCO 和 MOD 寄存器 CSCTL1 &=~(DCORSEL_7); //首先清除 DCO 频率选择位 CSCTL1 |= DCORSEL_0; //设置 DCO = 1MHz CSCTL2 = FLLD_0 + 31; // DCOCLKDIV = 1MHz _DELAY_CYCLES (3); _BIC_SR_register (SCG0); //启用 FLL while (CSCTL7 &(FLLUNLOCK0 | FLLUNLOCK1));// FLL 锁定 CSCTL5 &=~(DIVM); //清除 DIVM CSCTL6 &=~(DIVA); //清除 DIVA 位 CSCTL6 |= DIVA__512; //将 diva 设置为512:16000000/512 = 31250 CSCTL4 = SELMS_DCOCLKDIV | SELA_XT1CLK;//将分频的 XT1 (~31250Hz)设置为 ACLK 源、ACLK = 31250Hz //默认 DCOCLKDIV 为 MCLK 和 SMCLK 源 PM5CTL0 &=~LOCKLPM5; //禁用 GPIO 上电默认高阻抗模式 //激活先前配置的端口设置

    非常感谢您的帮助