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.
您好!
我正在尝试将 ptpv2协议与 TMS570LS31HDK 结合使用。 HDK 上有 DP83640作为以太网物理层。 首先 、我尝试在 Wireshark 中看到第一条同步消息。 请注意、我可以使用 lwIP 库成功发送和接收 UDP 消息。
我使用 PTPINIT()初始化 PTP 协议,并在 hdkif_hw_init()中,在 EMACEnable 之后和 TX/RX Int Enable 函数之前调用此函数。
我确认我可以通过 MDIO 正确更改寄存器值。
空 PTPInit()
{
RX_CFG_ITEMS rxCfgItems;
uint32_t rxCfgOpts;
内部时间;
//禁用1588时钟,设置开始时间,将速率设置为0
PTPEnable (&pObj、false);
//从 GPIO 断开事件12.
PTPSetEventConfig (&pObj、7、false、false、false、false、 0);
标志= 0;
PTPSetClockConfig (&pObj、flags、0、0、8);
PTPEnable (&pObj、true);
PTPClockSet (&pObj、0、0);
//设置 PPS 配置
// PTPSetTriggerConfig (&pObj、0、TRGOPT_PULSE|TRGOPT_Period|TRGOPT_NOTIFY_EN、ptpStackCfg->ppsGpio);
// PTPArmTrigger (&pObj、0、ptpStackCfg->ppsStartTime、0、
// ptpStackCfg->ppsRiseOrFallFlag,false,500000000,500000000);
//禁用发送和接收时间戳
PTPSetTransmitConfig (&pObj、0、0、0、0);
memset (&rxCfgItems、0、sizeof (RX_CFG_Items));
PTPSetReceiveConfig (&pObj、0、&rxCfgItems);
//刷新发送、接收和事件时间戳
while ((events = PTPCheckForEvents (&pObj))){
IF (事件和 PTPEVT_Transmit、TIMESTAMP_BIT)
PTPGetTransmitTimestamp (&pObj、&ts.seconds、&ts.nanoseconds、&overflowCount);
if (事件和 PTPEVT_Receive_TIMESTAMP_BIT)
PTPGetReceiveTimestamp (&pObj、&ts.seconds、&ts.nanoseconds、&overflowCount、&seqid、 &msgType、&hashValue);
if (事件和 PTPEVT_EVENT_TIMESTAMP_BIT)
PTPGetEvent (&pObj、&eventNum、&riseFlag、&ts.seconds、&ts.nanoseconds、 &eventsMissed);
}
//启用发送时间戳操作
FLAGS = TXOPT_IPV4_EN | TXOPT_TS_EN;//| TXOPT_CRC_1STEP | TXOPT_CHK_1STEP | TXOPT_SYNC_1STEP | TXOPT_IGNORE_2STEP;
PTPSetTransmitConfig (&pObj、flags、2、0xf8、0x00);
MDIOPhyRegWrite (pObj.portMdioAddress、pObj.portPhyAddress、(uint32_t) PHY_PAGESEL、(uint16_t) 4);
MDIOPhyRegWrite (pObj.portMdioAddress、pObj.portPhyAddress、(uint32_t) PTP_TXCFG1、(uint16_t) TXTS_IE);
//启用接收时间戳操作
rxCfgItems.ptpVersion = 0x02;
rxCfgItems.ptpFirstByteMask = 0xf8;
rxCfgItems.ptpFirstByteData = 0x00;
rxCfgItems.ipAddrData = 0;
rxCfgItems.tsMinIFG = 0x0C;
rxCfgItems.srcIdHash = 0;
rxCfgItems.ptpDomain = 0;
rxCfgItems.tsSecLen = 3;//0;// DRS 选项
rxCfgItems.rxTsNanoSecOffset = 0;//0x24;// DRS 选项
rxCfgItems.rxTsSecondsOffset=0;//0x21;// DRS 选项
rxCfgOpts = RXOPT_RX_IPV4_EN|RXOPT_RX_TS_EN|RXOPT_ACC_UDP|RXOPT_ACC_CRC;
PTPSetReceiveConfig (&pObj、rxCfgOpts、&rxCfgItems);
}
当我想读取当前时钟时、我会得到合理的值。 但我无法理解如何启动同步过程。 我知道我必须获取类似 PHY_Sync()下面的事件位,但事件始终返回0。
void PHY_Sync(){
内部时间;
while ((events = PTPCheckForEvents (&pObj))){
IF (事件和 PTPEVT_Transmit、TIMESTAMP_BIT)
PTPGetTransmitTimestamp (&pObj、&ts.seconds、&ts.nanoseconds、&overflowCount);
if (事件和 PTPEVT_Receive_TIMESTAMP_BIT)
PTPGetReceiveTimestamp (&pObj、&ts.seconds、&ts.nanoseconds、&overflowCount、&seqid、 &msgType、&hashValue);
if (事件和 PTPEVT_EVENT_TIMESTAMP_BIT)
PTPGetEvent (&pObj、&eventNum、&riseFlag、&ts.seconds、&ts.nanoseconds、 &eventsMissed);
}
}
我不熟悉以太网、很抱歉、如果这是一个显而易见的问题。 我是否必须根据 ptpmessage 创建一个缓冲区、并使用寄存器值填充该缓冲区、然后通过 UDP 发送它? 或者硬件会自动执行它、我会错过一些东西。
您好 Caner、
我不知道如何使用 DP83640 PHY 的 PTP。 您可以联系 DP83640团队以获取帮助。
和
主席先生、您好!
我正在尝试在 FreeRTOS 中实现我的目标、以便 Linux 选项不适合我。
我可以在 TMS570LS3137HDK 中使用 PTP。 它具有内置的 DP83640、但我假设我必须将一些 GPIO 引脚连接到 MCU。 根据 HDK 的数据表、任何地方都没有 GPIO 引脚连接。 我是否需要为此目的制作定制板? 我的最终目标是同步至少20个 PHY、所有 PHY 都应连接到 MCU 以存储数据。 那么、如何启动同步过程呢?
提前感谢、
斜角
在 HDK 上、没有 GIO 引脚连接到 DP83640。