TI E2E™ 设计支持论坛将于 5 月 30 日至 6 月 1 日进行维护。如果您在此期间需要技术支持,请联系 TI 的客户支持中心寻求帮助。

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.

[参考译文] TMS570LS3137:DP83640创建 PTP 消息并发送

Guru**** 2046970 points
Other Parts Discussed in Thread: DP83640
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1030569/tms570ls3137-dp83640-create-ptp-messages-and-send

器件型号:TMS570LS3137
主题中讨论的其他器件: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 发送它? 或者硬件会自动执行它、我会错过一些东西。