主题中讨论的其他器件:DP83640
您好!
我正在尝试将 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 发送它? 或者硬件会自动执行它、我会错过一些东西。