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