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.

[参考译文] RTOS/AM5728:外部 PCIe 时钟使用情况

Guru**** 2551570 points
Other Parts Discussed in Thread: AM5728, SYSCONFIG

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/571768/rtos-am5728-external-pcie-clock-usage

器件型号:AM5728
Thread 中讨论的其他器件: SysConfig

工具/软件:TI-RTOS

尝试在 AM5728上使用外部 PCIe 时钟时出现问题。  我从该示例开始
来自 AM5728 EVM GP 的代码。  我在 DSP 内核上的 SYS/BIOS 下运行。  使用示例代码
如下所示、PCIe 正常工作(在第1代、第2代不那么可靠)。

   /*OCP2SCP_SysConfig[1]软复位*/
   regVal = HW_RD_REG32 (SOC_OCP2SCP3_BASE + 0x10U)和0xFFFFFFFDU;

   regVal |= 0x02U;

   HW_WR_REG32 (SOC_OCP2SCP3_base + 0x10U、regVal);

   /*OCP2SCP_SYSSTATUS[0]重置完成*/
   while ((HW_RD_REG32 (SOC_OCP2SCP3_base + 0x14U)& 0x01U)!= 0x01U);

   /*OCP2SCP_SYSRing[9:7]分频比= 1*/
   regVal = HW_RD_REG32 (SOC_OCP2SCP3_base + 0x18U)& 0xFFFFFFU;

   regVal |=(uint32_t) 0x8U <<4U;

   HW_WR_REG32 (SOC_OCP2SCP3_base + 0x18U、regVal);

   /*OCP2SCP_SYSRing[3:0](SYNC2)= 0xF*/
   regVal = HW_RD_REG32 (SOC_OCP2SCP3_base + 0x18U)& 0xFFFFFFF0U;

   regVal |= 0xFU;

   HW_WR_REG32 (SOC_OCP2SCP3_base + 0x18U、regVal);

   /*PCIe DPLL - M&N 编程;CLKSEL*/
   regVal = HW_RD_REG32 (SOC_CKGEN_CM_CORE_BASE + CM_CLKSEL_DPLL_PCIe_REF);

   HW_SET_FIELD (regVal、CM_CLKSEL_DPLL_PCIe_REF_DPLL_DIV、0x09U);

   HW_SET_FIELD (regVal、CM_CLKSEL_DPLL_PCIe_REF_DPLL_MULT、0x2EEU);

   HW_WR_REG32 (SOC_CKGEN_CM_CORE_BASE + CM_CLKSEL_DPLL_PCIe_REF、regVal);

   /* SigmaDelta SD DIV 编程*/
   HW_WR_FIELD32 (SOC_CKGEN_CM_CORE_BASE + CM_CLKSEL_DPLL_PCIe_REF、
                 CM_CLKSEL_DPLL_PCIe_REF_DPLL_SD_DIV、0x06U);

   /*PCIe DPLL - M2编程*/
   HW_WR_FIELD32 (SOC_CKGEN_CM_CORE_BASE + CM_DIV_M2_DPLL_PCIe_REF、
                 CM_DIV_M2_DPLL_PCIe_REF_DIVHS、0x0FU);

   /*DPLL 使能*/
   HW_WR_FIELD32 (SOC_CKGEN_CM_CORE_BASE + CM_CLKMODE_DPLL_PCIe_REF、
                 CM_CLKMODE_DPLL_PCIe_REF_DPLL_EN、
                 CM_CLKMODE_DPLL_PCIe_REF_DPLL_EN_DPLL_LOCK_MODE);

   /*检查 DPLL 锁定状态*/
   while (((HW_RD_REG32 (SOC_CKGEN_CM_CORE_BASE + CM_IDLEST_DPLL_PCIe_REF)和
            CM_IDLEST_DPLL_PCIe_REF_ST_DPLL_CLK_MASK)<<
           CM_IDLEST_DPLL_PCIe_REF_ST_DPLL_CLK_SHIFT)!=
          CM_IDLEST_DPLL_PCIe_REF_ST_DPLL_CLK_DPLL_LOCKED);

   /*AC PCIe 的 Tx 和 Rx 控制*/
   HW_WR_FIELD32 (SOC_SEC_EFUSE_REGISTER_BASE + CSL_CONTRAING_CORE_SEC_SMA_SW_6、
                 CSL_CONTRAL_CORE_SEC_SMA_SW_6_PCIe_TX_RX_CONTROL、0x02U);

   /*使用100MHz 输入将 APLL 锁定到2.5GHz */
   regVal = HW_RD_REG32 (SOC_CKGEN_CM_CORE_BASE + CM_CLKMODE_APLL_PCIe);

   HW_SET_FIELD (regVal、CM_CLKMODE_APLL_PCIe_CLKDIV_BYPASS、
                CM_CLKMODE_APLL_PCIe_CLKDIV_BYPASS_PCIEDIVBY2_BYPASS_1);

   HW_SET_FIELD (regVal、CM_CLKMODE_APLL_PCIe_REFSEL、
                CM_CLKMODE_APLL_PCIe_REFSEL_CLKREF_ADPLL);

   HW_WR_REG32 (SOC_CKGEN_CM_CORE_BASE + CM_CLKMODE_APLL_PCIe、regVal);

   HW_WR_FIELD32 (SOC_CKGEN_CM_CORE_BASE + CM_CLKMODE_APLL_PCIe、
                 CM_CLKMODE_APLL_PCIe_MODE_SELECT、
                 CM_CLKMODE_APLL_PCIe_MODE_SELECT_APLL_FORCE_LOCK_MODE);

   /*等待 APLL 锁定*/
   while (((HW_RD_REG32 (SOC_CKGEN_CM_CORE_BASE + CM_IDLEST_APLL_PCIe)和
            CM_IDLEST_APLL_PCIe_ST_APLL_CLK_MASK)<<
           CM_IDLEST_APLL_PCIe_ST_APLL_CLK_SHIFT)!=
          CM_IDLEST_APLL_PCIe_ST_APLL_CLK_APLL_LOCK);

由于上述代码会配置 DPLL 并将 CM_CLKMODE_APLL_PCIe_REFSEL 设置为
CM_CLKMODE_APLL_PCIe_REFSEL_CLKREF_ADPLL、该代码不使用内部时钟
外部时钟。

由于 SMA_SW_6_PCIe_TX_RX_CONTROL 已设置为2、因此已设置 ACSPCIE
作为接收器、因此如果我将 CM_CLKMODE_APLL_PCIe_REFSEL 更改为
CM_CLKMODE_APLL_PCIe_REFSEL_CLKREF_ACSPCIE、它应与外部时钟和配合使用
我的测试表明确实如此。  

但是、我随后假设我可以删除 DPLL 设置和
使用如下所示的代码。

   /*OCP2SCP_SysConfig[1]软复位*/
   regVal = HW_RD_REG32 (SOC_OCP2SCP3_BASE + 0x10U)和0xFFFFFFFDU;

   regVal |= 0x02U;

   HW_WR_REG32 (SOC_OCP2SCP3_base + 0x10U、regVal);

   /*OCP2SCP_SYSSTATUS[0]重置完成*/
   while ((HW_RD_REG32 (SOC_OCP2SCP3_base + 0x14U)& 0x01U)!= 0x01U);

   /*OCP2SCP_SYSRing[9:7]分频比= 1*/
   regVal = HW_RD_REG32 (SOC_OCP2SCP3_base + 0x18U)& 0xFFFFFFU;

   regVal |=(uint32_t) 0x8U <<4U;

   HW_WR_REG32 (SOC_OCP2SCP3_base + 0x18U、regVal);

   /*OCP2SCP_SYSRing[3:0](SYNC2)= 0xF*/
   regVal = HW_RD_REG32 (SOC_OCP2SCP3_base + 0x18U)& 0xFFFFFFF0U;

   regVal |= 0xFU;

   HW_WR_REG32 (SOC_OCP2SCP3_base + 0x18U、regVal);

   /*在此删除了 DPLL 设置*/

   /*AC PCIe 的 Tx 和 Rx 控制*/
   HW_WR_FIELD32 (SOC_SEC_EFUSE_REGISTER_BASE + CSL_CONTRAING_CORE_SEC_SMA_SW_6、
                 CSL_CONTRAL_CORE_SEC_SMA_SW_6_PCIe_TX_RX_CONTROL、0x02U);

   /*使用100MHz 输入将 APLL 锁定到2.5GHz */
   regVal = HW_RD_REG32 (SOC_CKGEN_CM_CORE_BASE + CM_CLKMODE_APLL_PCIe);

   HW_SET_FIELD (regVal、CM_CLKMODE_APLL_PCIe_CLKDIV_BYPASS、
                CM_CLKMODE_APLL_PCIe_CLKDIV_BYPASS_PCIEDIVBY2_BYPASS_1);

   HW_SET_FIELD (regVal、CM_CLKMODE_APLL_PCIe_REFSEL、
                CM_CLKMODE_APLL_PCIe_REFSEL_CLKREF_ACSPCIE);//使用外部时钟*

   HW_WR_REG32 (SOC_CKGEN_CM_CORE_BASE + CM_CLKMODE_APLL_PCIe、regVal);

   HW_WR_FIELD32 (SOC_CKGEN_CM_CORE_BASE + CM_CLKMODE_APLL_PCIe、
                 CM_CLKMODE_APLL_PCIe_MODE_SELECT、
                 CM_CLKMODE_APLL_PCIe_MODE_SELECT_APLL_FORCE_LOCK_MODE);

   /*等待 APLL 锁定*/
   while (((HW_RD_REG32 (SOC_CKGEN_CM_CORE_BASE + CM_IDLEST_APLL_PCIe)和
            CM_IDLEST_APLL_PCIe_ST_APLL_CLK_MASK)<<
           CM_IDLEST_APLL_PCIe_ST_APLL_CLK_SHIFT)!=
          CM_IDLEST_APLL_PCIe_ST_APLL_CLK_APLL_LOCK);

但是、当我使用此功能时、APLL 不会锁定。  我不明白为什么它看起来起作用
当我将 CM_CLKMODE_APLL_PCIe_REFSEL 更改为 CM_CLKMODE_APLL_PCIe_REFSEL_CLKREF_ACSPCIE 时、但会发生变化
而不是当我不对 DPLL 进行编程时。

我实际上希望完全关闭 DPLL。

有没有关于这里发生什么错误的想法?

谢谢、

Chris

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    RTOS 团队已收到通知。 他们将在这里作出回应。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Chris、

    您使用的是 GP EVM、对吧? 在 ACSPCIE Rx 模式下、哪个器件为 EVM 提供 PCIe 参考时钟? 我之前做过类似的工作、以查看是否可以禁用 DPLL、而只需在 Rx 模式下使用 ACSPCIE 即可获得 PCIe APLL 锁定、但未成功。

    正如我与我们的硬件团队讨论过的、AM57x IDK 和 GP EVM 专为 RC 模式而设计、它是板载晶体为 PCIe 提供参考时钟、不能断开连接。 您无法禁用 DPLL 以使用外部时钟。

    此致、Eric
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很抱歉、我应该提到我们有一个定制板(与 GP EVM 密切建模)、它使用 IDT 9FGV0441 PCIe 时钟发生器。 它连接到 AM5728的 LJCB_CLKP 和 LJCB_CLKN 引脚、也连接到我们直接连接到的 FPGA。 为了确认时钟连接和 ACSPCIE 缓冲器方向、我将 PCIe_TX_RX_CONTROL 的值从2更改为1、并看到时钟损坏。 由于 PCIe GEN 2存在可靠性问题、我试图确保它们使用的参考时钟与设计的相同。 (我们目前正在进行设置、以便在发布有关第2代可靠性的任何问题之前测量他的眼图。)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    感谢您的讲解。 让我与我的同事核实一下。

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

    您好 Chris、

    即使使用外部时钟、APLL 仍需要启用和配置 DPLL。 TRM 的 PCIe PHY 子系统低级编程序列表(26-61)对此进行了说明。