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.

[参考译文] MSP430FR2355:MCU 锁定、时钟问题?

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1451456/msp430fr2355-mcu-lockup-clock-issue

器件型号:MSP430FR2355

工具与软件:

我们面临以下问题:在涉及数百个器件的批量生产过程中、我们确定了3、4个 MSP430FR2355微控制器、表现出非常奇怪的行为。 经过进一步分析、我们观察到这些器件进入某种锁定状态。

该设置涉及三个 MSP 连接在一个电路板上、如下所示:

  • 主 FPGA 通过 SPI 连接到每个 MSP。
  • FPGA 生成单端24MHz 时钟信号、该信号提供给第一个 MSP。
  • 第一个 MSP 将24MHz 时钟转发至第二个 MSP、第二个 MSP 将时钟转发至下一个 MSP、从而使用创建菊花链时钟配置 XIN MCLK_OUT 引入抖动。
  • 对于编程、我们使用了 Spy-Bi-Wire 接口。 FPGA 对第一个 MSP 进行编程、第一个 MSP 通过 Spy-Bi-Wire 接口对第二个 MSP 进行编程、依此类推、从而形成菊花链 Spy-Bi-Wire 编程配置。
  • 我们希望 MSP 的时钟输出保持稳定、并使下一个 MSP 保持复位状态、以避免在转换或瞬态条件下出现任何与时钟相关的问题。



使用此设置、我们可以完全控制每个 MSP、并能够对其进行编程和管理。 但是、如果链中的第一个或第二个 MSP 发生故障、后续器件会对该故障变得敏感。 例如、如果第一个或第二个 MSP 停止为链中的下一个 MSP 生成时钟信号、整个系统将受到影响。

在3-4受影响的装置中、我们观察到以下行为:

  • 在启动期间、MSP 有时会进入锁定状态并保持卡滞。
  • 处于此状态时、不会为链中的下一个 MSP 生成输出时钟。
  • 通过 Spy-Bi-Wire 接口重置器件可能是不可能的、也可能是非常困难的。
  • 在大多数情况下、器件可以正常工作、而不会出现任何问题。

经过进一步调查、我们怀疑在 MCLK 从内部800kHz 时钟转换到外部24MHz 时钟期间、器件进入了锁定状态。 请查看以下代码片段以了解潜在问题并提供有关如何检测和防止此状态的建议。

此问题并不会出现在每个设备上、我们有数百个 MSP 没有出现此问题。


void main(void)
{
    /* Stop watchdog timer */
    WDT_A_hold(WDT_A_BASE);

    __delay_cycles(20000);

    init_ports();

    SPI_init();
    UART_init();

    // Activate port configuration
    PMM_unlockLPM5();

    memcpy((void*)ram_iv, (void*)fram_iv, sizeof(ram_iv));
    SysCtl_enableRAMBasedInterruptVectors();

    init_CS();
    RTClock_init();
    RTClock_start();
    ADCC_init();

    GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P2, GPIO_PIN6, GPIO_PRIMARY_MODULE_FUNCTION);
    //GPIO_setAsInputPinWithPullUpResistor(SBW_OUT_PORT, SBW_OUT_DAT_PIN);
    GPIO_setOutputHighOnPin(SBW_OUT_PORT, SBW_OUT_DAT_PIN);

    reset_MSP_SBW();

    get_ID();
    init_ctrl();

    init_registers();
    SPI_enable(1);

    _EINT();
}

void init_ports(void) {
    // XIN and MCLK_OUT
    GPIO_setAsPeripheralModuleFunctionInputPin(GPIO_PORT_P2, GPIO_PIN7, GPIO_SECONDARY_MODULE_FUNCTION);
    //GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P2, GPIO_PIN6, GPIO_PRIMARY_MODULE_FUNCTION);
    GPIO_setAsOutputPin(GPIO_PORT_P2, GPIO_PIN6);
    GPIO_setOutputLowOnPin(GPIO_PORT_P2, GPIO_PIN6);

    // SBW pins
    //GPIO_setAsInputPinWithPullUpResistor(SBW_OUT_PORT, SBW_OUT_DAT_PIN);
    GPIO_setAsOutputPin(SBW_OUT_PORT, SBW_OUT_DAT_PIN);
    GPIO_setOutputLowOnPin(SBW_OUT_PORT, SBW_OUT_DAT_PIN);
    //GPIO_setAsInputPinWithPullDownResistor(SBW_OUT_PORT, SBW_OUT_CLK_PIN);
    GPIO_setAsOutputPin(SBW_OUT_PORT, SBW_OUT_CLK_PIN);
    GPIO_setOutputLowOnPin(SBW_OUT_PORT, SBW_OUT_CLK_PIN);
}

void init_CS(void) {
    // Configure two FRAM waitstate as required by the device datasheet for MCLK
    // operation at 24MHz(beyond 8MHz) _before_ configuring the clock system.
    FRAMCtl_configureWaitStateControl(FRAMCTL_ACCESS_TIME_CYCLES_2);

    //Enable HF/LF mode
    HWREG16(CS_BASE + OFS_CSCTL6) |= XTS_1;

    //Switch OFF XT1 oscillator and enable BYPASS mode
    HWREG16(CS_BASE + OFS_CSCTL6) |= (XT1BYPASS_1 | XT1AUTOOFF_1 | XT1HFFREQ_3);

    do
    {
        GPIO_setOutputLowOnPin(GPIO_PORT_P4, GPIO_PIN1);
        //Clear XT1 and DCO fault flags
        HWREG8(CS_BASE + OFS_CSCTL7) &= ~(XT1OFFG | DCOFFG);

        // Clear the global fault flag. In case the XT1 caused the global fault
        // flag to get set this will clear the global error condition. If any
        // error condition persists, global flag will get again.
        HWREG8(SFR_BASE + OFS_SFRIFG1) &= ~OFIFG;
        GPIO_setOutputHighOnPin(GPIO_PORT_P4, GPIO_PIN1);
    } while (HWREG8(SFR_BASE + OFS_SFRIFG1) & OFIFG);              // Test oscillator fault flag

    GPIO_setOutputLowOnPin(GPIO_PORT_P4, GPIO_PIN1);
    CS_initClockSignal(CS_ACLK, CS_XT1CLK_SELECT, CS_CLOCK_DIVIDER_640);    // ACLK = 37500Hz
    CS_initClockSignal(CS_MCLK, CS_XT1CLK_SELECT, CS_CLOCK_DIVIDER_1);      // MCLK = 24MHz
    CS_initClockSignal(CS_SMCLK, CS_XT1CLK_SELECT, CS_CLOCK_DIVIDER_1);     // SMCLK = 24MHz

}

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

    您好 zero_cool、

    设置看起来正常。

    该故障在这些器件上是否可以重复?  这些故障是在室温还是其他温度下发生的?  VDD 电压是多少?

    第一个或第二个 MSP 停止为链中的下一个 MSP 生成时钟信号

    我看到在代码中、你在振荡器测试期间设置 P4.1 = 1、然后在退出 do-while 循环时将其清除。  您是否已查看此引脚以了解发生故障时它处于什么状态? 如果高电平、则表示时钟系统中的某个组件不工作。  是否有任何其他使用寿命迹象、例如在正常运行期间可能切换的其他引脚?

    我还看到您已注释掉下面一行。 对于在这些器件上运行的代码是否适用?
    //GPIO_setPeripheralModuleFunctionOutputPin (GPIO_PORT_P2、GPIO_PIN6、GPIO_PRIMARY_MODULE_FUNCTION);

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

    大家好、Dennis、感谢快速回复。

    此 MSP 上的故障是重复的、发生频率很高、尤其是当拔下电源并在几分钟后重新插回电源时。 但是、执行快速下电上电(插入和拔出)或软件复位通常可以让 MSP 正常启动、而一切都正常。 在我们批量测试的几百个 MSP 中、我们发现了另外两个具有相同行为的装置。

    您正确地注意到、在错误测试期间、我们监控了引脚 P4.1、该引脚在 do-while 循环中的振荡器测试期间切换。 在故障情况下、引脚 P4.1在变为低电平之前切换大约5至8次、这表明振荡器测试本身工作正常。 似乎 MCU 发生故障并在此时锁定:

        GPIO_setOutputLowOnPin(GPIO_PORT_P4, GPIO_PIN1);
        CS_initClockSignal(CS_ACLK, CS_XT1CLK_SELECT, CS_CLOCK_DIVIDER_640);    // ACLK = 37500Hz
        CS_initClockSignal(CS_MCLK, CS_XT1CLK_SELECT, CS_CLOCK_DIVIDER_1);      // MCLK = 24MHz
        CS_initClockSignal(CS_SMCLK, CS_XT1CLK_SELECT, CS_CLOCK_DIVIDER_1);     // SMCLK = 24MHz

    该器件处于室温并由3.3V 电源供电。

    GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P2, GPIO_PIN6, GPIO_PRIMARY_MODULE_FUNCTION);已移至init_CS()函数后。 这是因为、当配置开始时、MSP 在 MCLK_OUT 上生成800kHz 信号。 MCU 需要从内部 RC 时钟切换到24MHz 时钟、我们认为第一个时钟在继续执行下一个 MSP 时钟之前应该是稳定的。

    来自 main()的代码;

    init_CS();
    RTClock_init();
    RTClock_start();
    ADCC_init();
    
    GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P2, GPIO_PIN6, GPIO_PRIMARY_MODULE_FUNCTION);

    我们不知道如何防止这种情况发生或原因、因此我们目前已经停止生产、直到我们确定这种行为的原因。

    此致

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

    好的、这是很好的信息。  我将重点介绍电源。  您是否知道或者是否使用示波器测量过在拔下电源后+3.3V 衰减的速度?  根据您的描述、当电源长时间拔下时、我想系统中的所有电容都可能降到零伏或接近零伏。 然后当重新接通电源时、VDD 从0v 开始并升至+3.3V、MPS430会通过 POR、此时您发现了这个问题。  奇怪!

    在另一种情况下、如果拔下电源插头、然后快速将其插回、或进行软件复位、则不会出现此问题。  BTW、您使用哪个软件复位、是 PMMSWPOR 还是 PMMSWBOR?  这表明系统电容不会降至 MSP430的最小 VDD 以下、器件会继续正常运行、并且 MSP430不会进行 BOR 或 POR。

    您能否从器件上的标记中了解故障器件是否具有相同的批次/生产日期代码?

    MSP430FR2355是否已在您的生产中使用了一段时间、也是首次使用。  换言之、您已经成功构建了一段时间、现在突然看到这个问题?

    是否可以分享展示 MSP430及其连接的原理图?  如果是专有资源、您或许可以仅剪切 MSP430部分以便共享、或者您可以向我发送"友谊"请求并可以私下与我共享。

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

    我正在向您发送一个朋友请求。 我会在您的收件箱中分享更多详细信息。

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

    此问题似乎与器件温度有关。 我们今天进行了更多测试、并将一个"好"的器件放入冷却/加热室中。 我们在这些器件上观察到相同的行为。 处理室的温度约为-20°C。 在内部800kHz 时钟与外部24MHz 时钟之间切换时、MSP 似乎会卡住、暂时保持该状态。 通常、当温度轻微上升时、MCU 会恢复正常工作。 根据环境温度、它可以保持该状态长达几分钟。

    我们怀疑这是 MCU 锁定的点。


    CSCTL4 = SELMS__XT1CLK | SELA__REFOCLK;

    init_cs 函数:

    void init_CS(void) {
        // Configure two FRAM waitstate as required by the device datasheet for MCLK
        // operation at 24MHz(beyond 8MHz) _before_ configuring the clock system.
        FRAMCtl_configureWaitStateControl(FRAMCTL_ACCESS_TIME_CYCLES_2);
    
        //Enable HF/LF mode
        //HWREG16(CS_BASE + OFS_CSCTL6) |= XTS_1;
    
        //Switch OFF XT1 oscillator and enable BYPASS mode
        //HWREG16(CS_BASE + OFS_CSCTL6) |= (XT1BYPASS_1 | XT1AUTOOFF_1 | XT1HFFREQ_3);
    
        HWREG16(CS_BASE + OFS_CSCTL6) = (XTS_1 | XT1BYPASS_1 | XT1AUTOOFF_1 | XT1HFFREQ_3);
    
        do
        {
            GPIO_setOutputLowOnPin(GPIO_PORT_P4, GPIO_PIN1);
            //Clear XT1 and DCO fault flags
            HWREG8(CS_BASE + OFS_CSCTL7) &= ~(XT1OFFG | DCOFFG);
    
            // Clear the global fault flag. In case the XT1 caused the global fault
            // flag to get set this will clear the global error condition. If any
            // error condition persists, global flag will get again.
            HWREG8(SFR_BASE + OFS_SFRIFG1) &= ~OFIFG;
            GPIO_setOutputHighOnPin(GPIO_PORT_P4, GPIO_PIN1);
        } while (HWREG8(SFR_BASE + OFS_SFRIFG1) & OFIFG);              // Test oscillator fault flag
    
        GPIO_setOutputLowOnPin(GPIO_PORT_P4, GPIO_PIN1);
    
        CSCTL4 = SELMS__XT1CLK | SELA__REFOCLK;        
                                                           // default DCOCLKDIV as MCLK and SMCLK source
        GPIO_setOutputHighOnPin(GPIO_PORT_P4, GPIO_PIN1);
        //CS_initClockSignal(CS_ACLK, CS_XT1CLK_SELECT, CS_CLOCK_DIVIDER_640);    // ACLK = 37500Hz
        //CS_initClockSignal(CS_MCLK, CS_XT1CLK_SELECT, CS_CLOCK_DIVIDER_1);      // MCLK = 24MHz
        //CS_initClockSignal(CS_SMCLK, CS_XT1CLK_SELECT, CS_CLOCK_DIVIDER_1);     // SMCLK = 24MHz
    /*
        CS_bypassXT1_HS();
    */
    }

    我们还尝试了使用内部24MHz 时钟、该器件目前正在正常工作。 处理室中的温度约为-20°C。

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

    我回应了你的友谊要求。

    我已经看了一下 这台设备上的错误、特别是有一个、CS13、它可以解释您看到的内容。

    解决方法#4似乎值得尝试它是否可以缓解此问题。

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

    关于勘误表 CS13、我们已看到此内容、但我们未更改模式。 复位后 MCU 应始终在 AM 下工作、而且我们不会进入 LPM3/4模式。 因此、我目前无法将其与我们的问题联系起来、尽管我可能错了。 我将给您发送一条私人消息、以便我可以私下与您分享完整代码。

    此外、我们注意到 MSP 卡滞了一段时间、然后从其卡滞点恢复工作。 该问题似乎也与温度有关、在较低的器件温度下发生的频率更高

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

    此时、可能值得提交 故障分析请求。  您可以发送 2或3个器件、我们可以验证您看到的内容并跟踪问题。