PTP移植笔记九:FRDM K64F时间戳问题

FRDM-K64F的时间戳代码位于:fsl_enet.c文件中。

接收时间戳代码位于:

  • ENET_ReadFrame()中。
  • 通过函数ENET_Ptp1588ParseFrame()函数判断是否将其中的时间戳数据读取出来。也就是说,硬件本身是对所有的包记录时间戳的。
  • ENET_Ptp1588ParseFrame()函数的作用是判断报文是否为PTP事件报文。返回值为TRUE和FALSE。

发送时间戳的代码位于:

  • ENET_TransmitIRQHandler()调用的ENET_StoreTxFrameTime()中。
  • 通过ENET_Ptp1588ParseFrame()函数判断是否保存时间戳,所以发送也是对所有的数据包记录了时间戳。

硬件时间戳读取代码:

  • 时间戳为48位的秒+32位的纳秒时间。
  • 硬件时间戳记录了时间中的纳秒。秒需要从外部获取。
  • K64提供了一个中断函数ENET_Ptp1588TimerIRQHandler(),这个中断每秒触发一次,中断中给秒计数器加1。
  • 读取PTP秒数据时,需要先关闭中断,然后通过ENET_Ptp1588GetTimer()读取秒数据,另外读取前还需要判断是否发生了时钟中断,如果发生了,则秒数减一。
    **秒的疑问:**感觉这个秒的处理存在问题。

环形缓冲区问题:

  • 官方示例中ENET_Ptp1588SearchTimeRing()以及ENET_Ptp1588UpdateTimeRing()函数中,对环形缓冲区的处理有问题,导致数据包(发送、接收)经常获取不到时间,具体情况记不清了,大概就是隔一两帧会有一两帧获取不到。
  • 后来没有查看那个逻辑为什么出错,因为编写的思路不同,不想花费太多时间,所以直接重写,之后发送和接收报文再没有出现丢失时间戳的情况。

你可能感兴趣的:(PTP移植笔记九:FRDM K64F时间戳问题)