基于TC397(适用STM32H7)的两层下位机PTP协议

一.目的:

基于TC397(或者STM32H7)实现两层的PTP协议;

二.参考资料:

核心参考:

RT-Thread : IEEE1588/PTP 协议的实现_stm32 ptp-CSDN博客

附加参考

Linux下调试1588单步时间戳报文_linuxptp onestep单步模式-CSDN博客

RT-Thread : IEEE1588/PTP 协议的实现_stm32 ptp-CSDN博客

三.摘要

通过移植和修改开源ptpd(ptp软件实现)项目:https://github.com/hasseb/stm32h7_atsame70_ptpd

,实现链路层的ptp协议(ptp的实现越接近于底层,软件时间戳则越精确);既实现PTP主机也实现PTP从机;

四.移植和修改流程:

1.移植:

下载上述开源项目,删除\atsame70整个文件夹,拷贝\stm32h7所有文件到dep文件夹中.

2.修改:

a.net.c基于udp实现,所以该文件重新实现,我用的是网卡的驱动重写了net.c的接口。

b.ptp_dep.c中,如果采用的是stm32h7单片机,完全可以使用,如果使用的其他的单片机需要重写。例如,我目前用的是TC397,可以直接操作MAC的寄存器重写即可。可以参考每款单片机的开发手册,一般都是有编程指南的。

c.msg.c中的msgPackAnnounce(const PtpClock *ptpClock, octet_t *buf)和msgUnpackAnnounce(const octet_t *buf, MsgAnnounce *announce)在TC397实际运行环境中会报hard_falut,在stm32中正常运行。实际测试在announce->stepsRemoved的赋值和解析时出错,所有采用memcpy进行赋值,采用提前数组元素的方式buff[61]<<8+buff[62]的方式解析。

d. msgPackHeader(const PtpClock *ptpClock, octet_t *buf)中将nibble_t transport = 0x80; //(spec annex D)修改为nibble_t transport = 0x00; //(spec annex D),主要原因是因为Linux_ptp中的transport默认是0,当然也可以修改linux_ptp配置文件中的transprot的值为0x80;

e.由于初步通信时的校正的偏移值很大,下位机作为从机无法从未校验状态转换为从机状态。(通信状态:初始化状态->监听状态->接收到Annouce解析后通过BMC算法产生主时钟确定事件->转换为未校验状态->合理的校正偏移值->转换为从机状态),所以为了跑通整个链路,修改constants.h中的#define DEFAULT_CALIBRATED_OFFSET_NS    10000  为 #define DEFAULT_CALIBRATED_OFFSET_NS    1000000000(后期需要解决这个问题).

3.从机测试:

a.constants.h中设置SLAVE_ONLY 为TRUE时 则只作为从机,(为FALSE时可作为主机)。 #define DEFAULT_DELAY_MECHANISM         E2E,表示端对端通信;#define DEFAULT_PRIORITY1    255,#define DEFAULT_PRIORITY2    255;

b.开启linux_ptp作为主机:sudo ptp4l -i enp0s25 -m -S -2;然后通过linux的wireshark抓包主机发送annonce报文(间隔时间2s)和sync(间隔 时间1s)和follow_up(间隔时间1s)报文,.从机发送delay_req报文(间隔时间不是一个固定值,追溯到void issueDelayReqTimerExpired(PtpClock *ptpClock),定时器判定到时后开启定时器的间隔时间取了一个范围内的随机时间),之后主机回复delay_resp报文。

e.linux主机报告异常:clock jumped forward or running faster than expected,所以关掉了防火墙,不再出现。linux命令:service iptables stop # 关闭防火墙。

4.主机测试:

1.constants.h中设置SLAVE_ONLY 为FALSE, 作为主机;#define DEFAULT_PRIORITY1   1 28,#define DEFAULT_PRIORITY2    128;

2.开启linux_ptp作为主机:sudo ptp4l -i enp0s25 -m -S -2

3.下位机发送annonce报文(间隔时间2s),syn(间隔时间1s),follow_up报文(间隔时间1s),上位机linux_ptp发送delay_res(间隔时间3s);下位机作为主机会回复delay_reps;

4.目前在linux ptp的从机中打印的状态信息中 master offset:1708479143312373781;s0 freq +100000000 ,path delay :31274858 ,所有参数均不理想,特别是master offset 大的离谱;

目前解决中!!!!!!!!

五.问题解决:

之后改用了ubuntu 中的linux_ptp的时间戳方式。之前采用的是软件时间戳,然后导致的问题是,下位机作为主机,pc中的linux_ptp开启从机模式,测试的结果不但出现了主机测试时的问题,还频繁出现了以下问题:SLAVE TO UNCALIBRATED on SYNCHRONIZATION_FAULT,之后又从UNCASLIBRATED 重新恢复到了SLAVE状态。分析原因,还是因为master offset太大了,导致同步错误;于是改用硬件时间戳就解决了,sudo ptp4l -i enp0s25 -m -2 -s,于是状态信息b变成如下:master offset -105 ,freq +31649 , path delay 906;结果很理想。

  • 22
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值