主题中讨论的其他器件: USB-2-MDIO
您好!
在执行此操作之前、 PHY 的状态是它按预期工作以接收/发送网络数据包。 我能够使用 LWIP 库发送/接收 UDP/TCP 数据包。 (如果相关、微控制器为 STM32F7)
我正在使用充当 主设备的 Linux PTPD 守护程序 manpages.debian.org/.../ptpd.8.en.html 发送 PTP 版本2消息。
在 Wireshark 上、我看到同步消息是定期发送的。
在微端、我使用了一个具有 DP83640 PHY 的 STM32F7x 微控制器。 我按照 PHYTER_Software_Development_Guide.pdf 的建议、并与 DP83640数据表交叉参考、按照以下顺序配置寄存器。 我还看了一下 PTPControl.c 以了解它是如何实现的、我注意到在该示例中使用了版本1 PTP。 使用提供的 EPL_1588.c 库、以下是初始化配置:
PTPEnable (pEPL_Handle、false);
首先、将0x2写入 PTP_CTRL 寄存器以禁用时钟。
PTPClockSetRateAdjustment (pEPL_Handle、0、false、false);
通过将0写入 PTP_Ratel 和 PTP_Rateh、将时钟速率调整设置为 none。 我相信这些也是默认值。
PTPClockSet (pEPL_Handle、1、0);
然后、PTP 时钟被设定为1秒和0纳秒。
PTPSetClockConfig (pEPL_Handle、CLKOPT_CLK_OUT_EN、0x0A、0x00、8u);
之后、通过将0x800a 写入 PTP_COC 来配置 PTP 时钟。 这表示启用 CLK_OUT 和一个10分频器。 0x8写入 PTP_CLKSRC 寄存器、以表示要使用的内部125MHz 时钟和8ns 周期。
PTPEnable (pEPL_Handle、TRUE);
我们再次启用时钟。
PTPSetTransmitConfig (pEPL_Handle、TXOPT_TS_EN | TXOPT_IPV4_EN、2、0、0);
在这里、我们将0x25 (0b100101)写入 PTP_TXCFG0寄存器。 这表示启用 IPv4时间戳 TX_IPV4_EN、TX_PTP_VER 为2、TX_TS_EN 为1。
PTPSetReceiveConfig (pEPL_Handle、RXOPT_IP1588_en0|RXOPT_IP1588_EN1|RXOPT_IP1588_EN2| RXOPT_RX_IPV4_EN|RXOPT_RX_TS_EN|RXOPT_ACC_UDP|RXOPT_ACC_CRC|RXOPT_PAC_CFG_RXOP_RXOP_RXOP_RXT_RXPT_RXT_RXPT_RXPT_RXT_RXT_RV_RV_RV_PROTOS_
在这里、我们将0xf25写入 PTP_RXCFG0寄存器。 这表示 RX_SLAVE 为1、IP1588_EN 为0b111、RX_IPV4_EN 为1、TX_PTP_VER 为2、RX_TS_EN 为1。
完成这些配置后、我会不断读取寄存器 PTP_STS 以查看是否存在接收时间戳。 如果有、我通过调用 PTPGetReceiveTimestamp 来获取它。
问题1:
如果我在调试模式下运行上述启动、我只能成功获得 PTP 时间戳(即 PTP_STS 表示存在接收时间戳)。 具体而言、逐步执行它们、并在 PTPSetClockConfig 命令之后进行一些暂停。 如果在没有任何断点的情况下运行启动代码、则进一步读取 PTP_STS 始终会导致0。 我不知道为什么会出现这种情况。 在我们再次启用 PTP 时钟之前、可能无法完成 ClockConfig 的设置?
问题2:假设我能够获得时间戳、如果我停止 Linux PTP 主站、然后重新启动它、则 PHY 永远无法获得新的时间戳。
有人有什么想法吗?