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.

[参考译文] TMS320F280025:触发 PLL 参考时钟丢失检测、未触发时钟丢失检测

Guru**** 2560240 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1126440/tms320f280025-pll-reference-clock-lost-detection-triggered-missing-clock-detect-not

器件型号:TMS320F280025

您好、支持团队、

我们遇到了 PLL 参考时钟丢失检测问题、无法找到根本原因。

我们的软件设置为:

  • PLLSYSCLK =带 INTOSC2的 PLL (100MHz)
  • 缺少时钟检测(默认开启)
  • PLL 参考时钟检测(MCDCR.SYSREF_LOW_MCD_EN=1)
  • DCC 时钟容差(允许的频率容差为7%+所需的容差为1%)。 检测时间= 324µs μ s
  • NMI 中断模拟 SIMRESET

大约50%的器件使用上述设置执行复位。

如果我们禁用 PLL 参考时钟检测(删除代码行 MCDCR.SYSREF_LOW_MCD_EN=1)、则不再进行复位。

1µs 我们的理解:Δ t (PLL 的324µs µs 时间)<时钟丢失时间<Δ t (DCC 的检测时间)< 819.2 μ s (MCD 的检测时间)

请告诉我们这种复位行为的可能原因是什么?

谢谢、此致、

问题

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

    您好、Quy、

    在进入可能导致 MCD 的原因之前、您能否提供一些详细信息:

      -时钟源(外部振荡器、晶体、内部振荡器等)。  如果可能、请提供使用外部振荡器或晶体时的输入时钟原理图

      - PLL 设置(时钟倍频器和分频器)

    谢谢、此致、

    Joseph

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

    您好、Joseph、

    感谢您的快速回复。

    抱歉、这个问题。正如我在前面的帖子中提到的、我们使用来自时钟源 INTOSC2的 PLL。

    未触发 MCD。 PLL 参考时钟丢失检测被触发。

    请在下面找到我的代码:

    #define CPU_IMULT                   10uL                  /**< integer value of the multiplier */
    #define CPU_REFDIV                  0uL                   /**< reference divider for the OSCCLK  */
    #define CPU_ODIV                    0uL                   /**< output divider of the PLLRAWCLK */
    #define CPU_PLLCLK_DIV_1            0u                    /**< PLLCLK_BY_1 SPRUIN7A, Table 3-50 */
    #define CPU_PLLCLK_DIV              CPU_PLLCLK_DIV_1      /**< PLLSYSCLK = PLLRAWCLK */
    #define CPU_OSC2                    0u    /**< OSCCLK = INTOSC2. SPRUIN7A, Table 3-44. */
    /** TMS320F28002x has 224 Vector IDs. The first 3 initialized by Boot ROM */
    #define CPU_NO_USED_VECTOR_ID       221u
    /** SPRSP45B . Table 7-4. Minimum Required Flash Wait States */
    #define CPU_MIN_WAIT_STATES         4u
    /** PLL multipliers and dividers - 100Mhz clock */
    #define CPU_SYS_PLL_MULT            ((u32)((CPU_REFDIV << 24u) | (CPU_ODIV << 16u) | CPU_IMULT))
    /** 7.11.3.2.1.4 APLL Characteristics - SYS PLL Lock Time = 1024 OSCCLK * (REFDIV+1) */
    #define CPU_LOCK_TIMEOUT            ((u32)(1024uL * (CPU_REFDIV + 1uL)))
    
    
    void CPU_InitSysPll(void)
    {
      u32 u32Timeout;
      u16 u16PllLockStatus;
    
      EALLOW;
    
      /* Bypass PLL and set dividers to /1 */
      ClkCfgRegs.SYSPLLCTL1.bit.PLLCLKEN = 0u;
    
      /* Delay at 200 OSCCLK cycles required post PLL bypass */
      CPU_Delay100Cycles();
      CPU_Delay100Cycles();
    
      /* Turn off the PLL */
      ClkCfgRegs.SYSPLLCTL1.bit.PLLEN = 0u;
    
      /* Delay 100 OSCCLK cycles to wait for PLL turning off */
      CPU_Delay100Cycles();
    
      ClkCfgRegs.CLKSRCCTL1.bit.OSCCLKSRCSEL = CPU_OSC2;
    
      /* Delay of 300 OSCCLK cycles for the setting takes effect */
      CPU_Delay100Cycles();
      CPU_Delay100Cycles();
      CPU_Delay100Cycles();
    
      /* Set dividers to /1 to ensure the fastest PLL configuration */
      ClkCfgRegs.SYSCLKDIVSEL.bit.PLLSYSCLKDIV = CPU_PLLCLK_DIV_1;
    
      /* Program PLL multipliers */
      ClkCfgRegs.SYSPLLMULT.all = CPU_SYS_PLL_MULT;
    
      /* Enable SYSPLL */
      ClkCfgRegs.SYSPLLCTL1.bit.PLLEN = 1u;
    
      u32Timeout = CPU_LOCK_TIMEOUT;
      u16PllLockStatus = ClkCfgRegs.SYSPLLSTS.bit.LOCKS;
    
      /* Wait for the SYSPLL lock */
      while((u16PllLockStatus != 1u) && (u32Timeout != 0uL))
      {
        u16PllLockStatus = ClkCfgRegs.SYSPLLSTS.bit.LOCKS;
        u32Timeout--;
      }
    
      /* Set divider to produce slower output frequency to limit current increase */
      ClkCfgRegs.SYSCLKDIVSEL.bit.PLLSYSCLKDIV = CPU_PLLCLK_DIV + 1u;
    
      /* Enable PLLSYSCLK is fed from system PLL clock */
      ClkCfgRegs.SYSPLLCTL1.bit.PLLCLKEN = 1u;
    
      /* Delay 100 OSCCLK cycles for the setting takes effect */
      CPU_Delay100Cycles();
    
      /* Set the divider to user value */
      ClkCfgRegs.SYSCLKDIVSEL.bit.PLLSYSCLKDIV = CPU_PLLCLK_DIV;
      EDIS;
    }

    此致、

    问题

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

    您好、Quy、

    很抱歉、错过了这些详细信息、尤其是问题陈述中的最后一个词。  总之、查看您的代码设置、我看到 IMULT 为10、所有分频器都设置为1。  INTOSC2产生10MHz 并乘以 IMULT、这产生一个10MHz*10或100MHz 的 VCO 时钟。  这是 PLL 工作所需的过低电平。  请参阅表7.11.3.2.1.6、了解内部时钟频率 f (VCOCLK)范围为220Mhz 至600MHz。  要获得最佳性能、请将 VCO 设置为标称值或中值、该值约为400MHz。  将 IMULT 设置为40、然后将 PLL 分频器设置为2、最后将 SYSCLK 分频器设置为2、以达到100MHz SYSCLK。

    100MHz VCO 时钟 是 PLL 参考时钟丢失的最可能原因。 尝试一下、让我知道它是如何工作的。

    此致、

    Joseph

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

    您好、Joseph、

    感谢你的答复。

    我根据您的建议更改了软件。

    故障器件触发复位的速度更快(每2-3分钟更改一次之前、每秒更改一次之后)

    无故障器件始终不会触发复位。

    #define CPU_IMULT                   40uL                  /**< integer value of the multiplier */
    #define CPU_REFDIV                  0uL                   /**< reference divider for the OSCCLK  */
    #define CPU_ODIV                    1uL                   /**< output divider of the PLLRAWCLK */
    #define CPU_PLLCLK_DIV_1            0u                    /**< PLLCLK_BY_1 SPRUIN7A, Table 3-50 */
    #define CPU_PLLCLK_DIV_2            1u                    /**< PLLCLK_BY_2 SPRUIN7A, Table 3-50 */
    #define CPU_PLLCLK_DIV              CPU_PLLCLK_DIV_2      /**< PLLSYSCLK = PLLRAWCLK */

    我还尝试了其他设置、我们具有相同的行为

    #define CPU_IMULT                   40uL                  /**< integer value of the multiplier */
    #define CPU_REFDIV                  0uL                   /**< reference divider for the OSCCLK  */
    #define CPU_ODIV                    3uL                   /**< output divider of the PLLRAWCLK */
    #define CPU_PLLCLK_DIV_1            0u                    /**< PLLCLK_BY_1 SPRUIN7A, Table 3-50 */
    #define CPU_PLLCLK_DIV              CPU_PLLCLK_DIV_1      /**< PLLSYSCLK = PLLRAWCLK */

    此致、

    问题

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

    您好、Quy、

    我没有看到 PLL 设置例程有什么问题、但确切地说、您能否像下面那样对寄存器显示进行快照:

    我看到您复制了 driverlib 函数的 PLL 设置函数。  以上设置是我 使用 INTOSC2、IMULT=40、REFDIV=0、 ODIV=2和 SYSCLKDIV=2时读取的设置。  我在几个部件上使用上述时钟设置、然后长时间运行、看不到您使用 driverlib 函数 sysctl_setclock 报告的 DCC 问题。  让我们首先检查时钟寄存器是否正确填充。

    此致、

    Joseph

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

    Josseh、您好。

    我想再次澄清一下。 我们希望使用3算法进行时钟监控

    • 和 MDC
    • 具有 PLL 参考时钟丢失检测功能
    • 和 DCC

    我们不会像您一样看到 MDC 或 DCC 的问题。 我们只有 PLL 参考时钟丢失检测问题。

    我们认为您对设置的建议是合理的。 我们现在将频率设置在允许范围的中间。

    我有2个具有相同设置的 SWS、分别为 REFDIV = 0、IMULT = 40、ODIV = 3、SYSCLKDIVSEL = 0 (我们希望在 DCC 中进行简单设置、以便通过 SYSCLKDIVSEL = 0来设置 Fclk1 = Fsysclk)

    • SW1:"ClkCfgRegs.MCDCR.bit.SYSREF_LOW_MCD_EN = 1"
    • SW2:不带"ClkCfgRegs.MCDCR.bit.SYSREF_LOW_MCD_EN = 1.

    一旦 SW1位于器件中、我就无法使用调试器(XDS200)与其连接。 请查找附加的消息

    我们必须通过 LIN 引导加载程序刷写 SW2。 一旦 SW2进入器件、我就可以连接调试器并读取寄存器:

    如果我再次刷写 SW1、则无法再次使用调试器(XDS200)与其连接。

    此致、

    问题

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

    您好、Quy、

    抱歉、我无法理解导致与调试器连接断开的实际问题。  您能否在 driverlib 中使用 PLL 设置例程(SYSCTL_setClock)?  在 PLL 设置中、需要遵循一些 PLL / DCC 设置和时序步骤、并且可能在您的例程中错过了这些步骤。

    谢谢、

    Joseph

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

    您好、Quy、

    此外、您能否 显示在使用 SYSREF_LOW_MCD 时在代码中设置的位置?

    Joseph

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

    您好、Quy、

    至于是否需要 ClkCfgRegs.MCDCR.bit.SYSREF_LOW_MCD_EN 的问题、您可以从代码中删除此内容、因为 DCC 检查以及 MCD 已经涵盖了 SYSREF_LOW_MCD_EN 的功能。

    此致、

    Joseph

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

    您好、Joseph、

    我们无法在 driverlib 中使用 PLL 设置例程、因为我们不使用 driverlib、而只使用 device_support 中的库。 但是、我们的代码会复制 f28002x_sysctrl.c 中的代码 我们刚才使用的延迟

    static void CPU_Delay100Cycles(void)
    {
      /* repeat NOP 100 times */
      __asm(" RPT #100 || NOP");
    }

    关于 SYSREF_LOW_MCD、

    • 我们首先设置 PLL
    • 然后执行一些内部测试(RAM、寄存器...)
    • 然后复制 RAM 函数(在 driverlib 中复制函数)
    • 初始化闪存(driverlib 中的复制函数)
    • 初始化 PIECTRL 和 InitPieVectTable (driverlib 中的 replicate 函数)
    • 然后启用 MCD (只需确保)
    • 然后打开 SYSREF_LOW_MCD
    • static void MCU_ClockMissingDetectionEnable(void)
      {
        EALLOW;
        /* Enable the missing clock detection (MCD) Logic as a precaution */
        ClkCfgRegs.MCDCR.bit.MCLKOFF = 0u;
        /* enable Reference Clock Lost to trigger a CLOCKFAIL event */
        ClkCfgRegs.MCDCR.bit.SYSREF_LOST_MCD_EN = 1u;
        EDIS;
      }
    • 然后设置 DCC

    此致、

    问题

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

    您好、Joseph、

    对于该解决方案、我们决定在我们的软件中禁用此功能、并侧重于其他拓扑。

    感谢您的帮助和问候、

    问题