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.
您好!
在执行此操作之前、 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 永远无法获得新的时间戳。
有人有什么想法吗?
尊敬的 Andrew:
这是一个有趣的问题。 作为进一步的调试步骤、是否可以对部分配置步骤进行分组并一次运行一个组、而不是单独运行每个步骤? 这可能有助于我们了解导致问题的顺序步骤、以及一个配置步骤是否需要额外的时间进行收敛。
我们将在内部对此进行研究、并在本周星期四之前提供更多反馈。
谢谢、
Nikhil
[引用用户="Nikhil Menon"
尊敬的 Andrew:
这是一个有趣的问题。 作为进一步的调试步骤、是否可以对部分配置步骤进行分组并一次运行一个组、而不是单独运行每个步骤? 这可能有助于我们了解导致问题的顺序步骤、以及一个配置步骤是否需要额外的时间进行收敛。
我们将在内部对此进行研究、并在本周星期四之前提供更多反馈。
谢谢、
Nikhil
[/报价]
您好、Nikhil、
在尝试各种分组后、我意识到当我将所有配置放入一个组、并在组之后有一个断点时、它会起作用。 而如果没有断点、则不起作用。
之后、我在所有配置完成后添加了一个1000ms 的 HAL_DELAY、但这不会改变任何东西。 只有在我在所有配置之后断点、然后从那里继续时、它才起作用。
此外、除非我在"PTPGetReceiveTimestamp"函数上添加了断点、否则不会从接收时间戳寄存器读取任何内容。
优化已关闭、我已将 volatile 关键字添加到事件中、PTP_Seconds 和 PTP_nanoseconds、因此不太确定发生了什么。
while ((事件= PTPCheckForEvents (pEPL_Handle))))
{
if (事件和 PTPEVT_Receive_TIMESTAMP_BIT)
{
PTPGetReceiveTimestamp (pEPL_Handle、&PTP_Seconds、&PTP_nanoseconds、&overflowCount、&seqid、 &msgType、&hashValue);
}
}
尊敬的 Andrew:
我们将在内部调查此问题、并将在本周结束前提供更新。
谢谢、
Nikhil
尊敬的 Andrew:
我们有一个工具 USB-2-MDIO、可用于对寄存器进行编程。 作为额外的调试步骤、您是否能够使用此工具对 PHY 的寄存器进行编程? 您是否遇到了相同的问题?
谢谢、
Nikhil
您好、Nikhil、
我对该工具有了一些了解、并阅读了用户指南。 您似乎需要 MSP430 LaunchPad?
我完全没有、所以看起来我不能使用这个工具?
目前、我正在使用 STM32微控制器通过 MDIO 与 PHY 通信。
请记住、将 TCP/UDP msgs 从我的 PC 发送到 micro 完全可以。
此致、
Andrew
尊敬的 Andrew:
我们将研究此问题、并将在本周结束前提供更多反馈。
谢谢、
Nikhil
尊敬的 Andrew:
这似乎正在成为调试器模式与延迟问题、这变得很难调试、可能超出了此论坛的范围。 但是、从 PHY 的角度来看、我有几个问题需要澄清。
谢谢、
Nikhil
您好、Nikhil、抱歉、由于某些奇怪的原因、此消息没有提前发送-也许是新网站。
你的问题是:当我无法读取时间戳时、我从寄存器中读取0。
关于所有写入后的读取、我很快就会尝试。
考虑读取寄存器并将其存储在所有初始化完成后要读取的变量中、因为我觉得单步执行断点会使其工作。
此致、
Andrew
尊敬的 Andrew:
我认为这两个实验、在所有写入后读取寄存器值以及将寄存器存储为变量可能会有所帮助。 请告诉我您的观察结果。
谢谢、
Nikhil
您好、Nikhil、
这是我得到的结果。 请注意、我没有读取 IP 地址寄存器、因为我一直在向它写入0。
我还键入了数据、并在之前将其屏蔽为0x00、这不会改变行为。
当在以下代码中没有断点时、行为仍然是:
if (事件和 PTPEVT_Receive_TIMESTAMP_BIT)
{
PTPGetReceiveTimestamp (pEPL_Handle、&PTP_Seconds、&PTP_nanoseconds、&overflowCount、&seqid、 &msgType、&hashValue);
}
变量 PTP_Seconds 不变。 我的下一个想法是修改函数 PTPGetReceiveTimestamp 以将所有易失性引用放在这里。
我写的内容:
PTP_BATEH = 0、
PTP_Ratel = 0、
PTP_COC = 32778、
PTP_CLKSRC = 8、
PHYCR2 = 0、
PTP_CTL = 4、
PTP_TXCFG0 = 37、
PTP_TXCFG1 = 0、
PTP_RXCFG0 = 3877、
PTP_RXCFG1 = 65280、
PTP_RXCFG3 = 3072、
PTP_RXCFG4 = 0、PTP_RXHASH = 0
我在写它之后的读:
PTP_BATEH = 0、
PTP_Ratel = 0、
PTP_COC = 32778、
PTP_CLKSRC = 8、
PHYCR2 = 0、
PTP_CTL = 4、
PTP_TXCFG0 = 37、
PTP_TXCFG1 = 0、
PTP_RXCFG0 = 3877、
PTP_RXCFG1 = 65280、
PTP_RXCFG3 = 3072、
PTP_RXCFG4 = 0、PTP_RXHASH = 0
此致、
Andrew
尊敬的 Andrew:
请告诉我修改 PTPGetReceiveTimestamp 函数的结果。
谢谢、
Nikhil
您好、Nikhil、
修改函数并不能解决问题、但我有一个想法。
我注意到、即使它在"工作"时、它在从时间戳寄存器读取大约15次之后仍然停止工作。
我添加了一个单独的命令来读取相关的 PTP 寄存器、并且我在 PTP 时间戳 停止工作(它不再在断点处停止)后调用了该命令。 我看到寄存器发生了变化。 我怀疑 PHY 已复位? 然后、我在任何会复位 PHY 的代码上放置一个断点(主要在初始化函数中、当网络发生变化时)、并且断点未被命中。
PHY 会复位寄存器是否有任何其他原因?
Andrew
尊敬的 Andrew:
复位应由硬件(将 RESET 引脚拉至低电平)或寄存器访问发起。 有不同的复位可由寄存器、软件复位、软复位和 PTP 复位发起。 有关每种复位类型的更多信息、请查看数据表的第5.4.10节。 如果触发 PTP 复位、软件复位或硬件复位、这可能会清除 PTP 寄存器。
谢谢、
Nikhil
您好、Nikhil、
我查看了所有不同的复位、也查看了代码。
PTP 复位只在初始化过程中完成、如上面的代码段所示。
软复位位位永远不会被置位、而且它不会复位寄存器配置。
硬件复位引脚似乎被拉至高电平、因此没有复位。
完全软件复位位位永远不会置位。
Andrew
尊敬的 Andrew:
PTP 寄存器集中的一些位是自清零的、在寄存器表中用"SC"指定。 非自清零位是否也被复位?
谢谢、
Nikhil
您好、Nikhil、
感谢你的所有帮助。 我想知道其他地方在哪里复位寄存器(当网络发生变化时)。 它现在在工作。
另一个问题-如何从 PHY 获取 PTP 数据包中的绝对 s 和 ns 值(不在固件中对其进行解码)。 它似乎只在寄存器中存储相对值、因为它在开始时复位为0。
谢谢、
Andrew
尊敬的 Andrew:
我很高兴听到您的代码正在运行!
我正在研究您对 PTP 数据包中 s 和 ns 值的读取问题、并将在下周的星期二之前提供反馈。
谢谢、
Nikhil
尊敬的 Andrew:
抱歉、我不清楚您的目标是在固件中读取时间戳而不进行解码。 通过分别读取寄存器0x1C 和0x1D、可以找到以秒和纳秒为单位的发送和接收时间戳。 这是您要查找的寄存器读取吗?
谢谢、
Nikhil Menon
此通信和任何相关通信中的所有信息均按“原样”和“不含任何瑕疵”提供,并受 TI 的重要声明(http://www.ti.com/corp/docs/legal/important-notice.shtml)约束。
您好、Nikhil、
根据我的理解、在启动时、PTP IEEE1588时钟设置为1秒和0纳秒。 之后、每当它获得接收时间戳时、PHY 芯片就会更新寄存器0x1D。 如果我们使用该寄存 器通过 PTPArmTrigger 和 PTPSetTriggerConfig 驱动周期性 GPIO 信号、则两个不同的 phy/micros 将不同步、因为它们的 PTP 时间戳将根据启动时间进行"保留"。
PHY 在某个时刻确实接收到 PTP 绝对时间戳、我想知道它是否存储在任何位置。
目前、我已经编写了一些代码来解析 SYNC/后继 PTP 消息以获得绝对 PTP 秒数和 ns、但令我感到震惊的是、PTP 内部逻辑已经执行了这一操作以获得相对 PTP 时间戳。
此致、
Andrew
尊敬的 Andrew:
我们将研究您的问题、并将于最晚周一提供更新。
谢谢、
Nikhil
此通信和任何相关通信中的所有信息均按“原样”和“不含任何瑕疵”提供,并受 TI 的重要声明(http://www.ti.com/corp/docs/legal/important-notice.shtml)约束。