0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

同一网络,同一瞬间!一起玩转1588!

先楫半导体HPMicro 2022-08-03 10:05 次阅读

在HPM6700/6400系列微控制器上,提供了2个以太网控制器。都可以支持IEEE1588-2002IEEE1588-2008标准。方便用户实现基于网络的精确时间同步。

本文提供了与HPM6700/6400系列微控制器基于网络的IEE1588的功能示例和使用指南。


IEEE1588简介

IEEE1588的全称是网络测量和控制系统的精密时钟同步协议标准(PTP – Precision Time Protocol)。目前为2个版本,分别为IEEE1588(v1)和IEEE1588(v2)。IEEE1588的目的是为了对全网设备时钟同步,这对于网络设备在控制和采集同步尤为重要。本节简单介绍IEEE1588的基础知识,详细的协议描述,请参考相关网站。

1588的同步原理

1588的原理是通过网络中的主设备对从设备发送特殊的报文并以此和从设备进行交互得出时间的偏离以进一步将设备时钟同步。如下图所示:

33458b70-0f88-11ed-9ade-dac502259ad0.png

端口在t1时刻发送同步报文,并在接下来的报文中发送t1点的时间,从端口在t2时间点收到同步报文并在t3时刻发送响应给主端口,主端口在收到从端口的响应后再将t4时刻发送给从端口。


在这个过程中,得到网络延迟和时钟偏差。

Toffset=((t2 - t1) + (t4 – t3)) / 2

Tdelay=((t4 - t1) -(t3 – t2)) / 2

在整个网络拓扑中,所有的节点定期的进行时钟同步,最终达到纳秒(IEEE1588-2008)或者微秒级(IEEE1588-2002)的精度。


HPM67/64系列1588功能介绍

IEEE1588本身是基于以太网提出的,因此其详细使用以及寄存器描述请参见HPM6700/6400用户手册的第60章

使用1588功能,首先要为该功能赋予时钟源。因为HPM6700/6400有2个以太网控制器,ENET0, ENET1。因此,控制器为1588设立了2个时钟源,分别为:

CLOCK_TOP_PTP0;

CLOCK_TOP_PTP1。


HPM6700/6400微控制器上,CLOCK_TOP_PTP0/1分别作为ENET0/1的1588时间戳计数器的运行时钟,其默认频率选择是使用PLL1CLK1输出, PLL1CLK1的默认输出为400MHz,默认时钟分频系数为4,因此CLOCK_TOP_PTP0/1的默认频率为100MHz。用户可以根据自己的需要设置成不同的频率作为输入。

clock_set_source_divider(clock_ptp0, clk_src_pll1_clk1, 4);clock_set_source_divider(clock_ptp1, clk_src_pll1_clk1, 4);

用户需要设置以下几个寄存器来实现相应的1588功能

TS_CTRL 时间戳控制寄存器

SUB_SEC_INCR 次-秒增量寄存器

SYST_SEC 系统时间 – 秒寄存器

SYST_NSEC 系统时间 – 纳秒寄存器

SYST_SEC_UPD 系统时间 – 秒更新寄存器

SYST_NSEC_UPD 系统时间 – 纳秒更新寄存器

TS_ADDEND 时间戳加法寄存器

当确定好输入频率后,用户需要在SUB_SEC_INCR中填写增量值。它的填写主要依靠2个因素,一个是TS_CTRL中的第9位TSCTRLSSR,另一个因素是前面提到的输入频率。

TSCTRLSSR是计数方式的选择,当其置1时,SYS_NSEC纳秒寄存器到0x3B9AC9FF时翻转;当其置0时,SYS_NSEC纳秒寄存器到0x7FFFFFFF时翻转。SYS_NSEC每翻转一次代表时间上的1秒钟。因此,当TSCTRLSSR置1时,SYS_NSEC中的1代表1ns;当TSCTRLSSR置0时,SYS_NSEC中的1代表0.465ns。SUB_SEC_INCR.SSINC中的数代表着输入频率所对应的时间,它会根据SYS_NSEC中1个计数所代表的时间进行相应的折算。

例如,当输入频率为100MHz时,一个clock是10ns,当TSCTRLSSR置1时,则SUB_SEC_INCR.SSINC设为10(10/1);当TSCTRLSSR置0时,则SUB_SEC_INCR.SSINC设为21(10/0.465)

建议用户将TSCTRLSSR置1,这样理解和计算都更方便。


SYST_SEC和SYST_NSEC为MAC维护的时间戳。SYST_SEC为秒级时间戳,SYST_NSEC为纳秒级时间戳。其中SYS_NSEC会根据TSCTRLSSR的设置在不同的数据下翻转。当TSCTRLSSR置1时,它将会在0x3B9AC9FF时翻转,当TSCTRLSSR置0时,它将会在0x7FFFFFFF时翻转


SYST_SEC_UPD和SYST_NSEC_UPD为更新时间戳的寄存器,如果需要减少纳秒时间,需要将SYST_NSEC_UPD中的最高位置1,如果需要增加纳秒时间则需要将SYST_NSEC_UPD中的最高位置0。


假设时钟同步算法发现时钟偏慢,希望将累加的步长调整为10.1 ns,这时,可以保持SUB_SEC_INCR.SSINC为10,设置ADDEND = 0xFFFFFFFF * (0.1) = 0x19999999。此时,可以视为累加的等效步长为10.1 ns。

假设时钟同步算法发现时钟偏快,希望将累加的步长调整为9.9 ns,这时,需要设置SUB_SEC_INCR.SSINC为 9,设置ADDEND = 0xFFFFFFFF * (0.9) = 0xE6666666。此时,可以视为累加的等效步长为9.9 ns。


注意,以上所有的寄存器的写入都是需要通过设置TS_CTRL中相应的状态位为1,等待此位为0时,认为设置成功。


在先楫提供的SDK中,可以直接调用

../../hpm_sdk/drivers/src/hpm_enet_drv.c进行设置

void enet_init_ptp(ENET_Type *ptr, enet_ptp_config_t *config)void enet_set_ptp_timestamp(ENET_Type *ptr, enet_ptp_time_t *timestamp)

1588例程分析

在先楫发布的SDK中,可以找到1588的实现例程v1(即IEEE1588-2002)

..\..\hpm_sdk\samples\lwip\lwip_ptp\v1

其中包括master和slave, 分别对应主端口和从端口。在不改动任何设置的情况下,用户需要2块进行测试,一块作为主端口,另一块作为从端口。为了测试IEEE1588的时钟同步性能,我们采用了2块HPM6750EVK,分别烧写master和slave的程序。

需要注意一下2块板子的ip地址应该是不同的。默认的例程使用的是板子上的RMIIPHY,用户可以根据自身的需求更换成RGMII PHY进行测试。

1. 代码分析


初始化系统,首先初始化IO,以太网芯片以及设置1588的时钟。

board_init();board_init_enet_ptp_clock(ENET);board_init_enet_pins(ENET);enet_init(ENET);

在初始化以太网芯片成功后,初始化lwip,设置网络参数,ptp时钟

enet_ptp_init();lwip_init();netif_config();user_notification(&gnetif);ptpd_Init();

接受网络时钟同步数据包,并以此进行时钟校正。如此往复。

while (1) {ethernetif_input(&gnetif); ptpd_periodic_handle(localtime);}

2. 测试方法


因为1588的时钟精确同步功能需要在网络中实现,因此先楫用了2块HPM6750EVK通过对接的方式测试。在分别烧入了master和slave的程序后,通过网线直接连接板子上的RJ45(J10)端口。如图所示:

337a8c58-0f88-11ed-9ade-dac502259ad0.jpg

系统上电后,在从端口的串口中显示

(D 1651074120.060559130) state PTP_SLAVE(D 1651074121.919880830) addForeign: new record (0,1) 1 1 98bc9f:18(D 1651074121.923243890) event MASTER_CLOCK_CHANGED(D 1651074121.925549510) state PTP_UNCALIBRATED(D 1651074121.927681110) toState: Q = 0, R = 5(D 1651074123.919898550) updateOffset(D 1651074123.921597570) updateClock seconds(D 1651074134.003162180) setTime: resetting system clock to 1651074134s 3162050ns(D 1651074134.006781080) initClock(D 1651074134.008349500) one-way delay: 0s 0ns(D 1651074134.011270660) offset from master: -10s -79562820ns(D 1651074134.014279260) observed drift: 0(D 1651074135.999474620) updateOffset(D 1651074136.001174640) one-way delay: 0s 0ns(D 1651074136.004096190) offset from master: 0s 10170ns(D 1651074136.007017370) observed drift: 169(D 1651074137.999480800) updateOffset(D 1651074138.001180620) one-way delay: 0s 0ns(D 1651074138.004101330) offset from master: 0s 14370ns(D 1651074138.007022680) observed drift: 408

3. 测试结果

通过对结果的比对,我们将时间戳的偏移值进行比较,得到下图:


339c46d6-0f88-11ed-9ade-dac502259ad0.png

从图中可以看到,在同步之初,时间的偏差较大,但经过最初的快速调整后,时钟精确在±10us之内。这对于IEEE1588-2002来说,已经是非常好的效果。

总结

本文介绍了HPM6700/6400系列微控制器的以太网1588功能的使用和示例的演示。在IEEE1588-2002下,100MHz的网络测试中得到了很好的效果。对于1588-2008版本的测试,会在后续的文档中推出。


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 控制器
    +关注

    关注

    112

    文章

    15245

    浏览量

    171262
收藏 人收藏

    评论

    相关推荐

    STM32上电一瞬间GPIO是处于什么状态?

    STM32 芯片上电一瞬间 GPIO是处于什么状态?是高阻态吗?还是还是高电平,记得51是高电平,请各位大佬指点一二。
    发表于 03-13 07:00

    LTC1624在上电的一瞬间,电源芯片会发生异常如何解决?

    我用LTC1624设计了个24V转5V的降压电路,功率大概5V@1A。 偶尔会发生,在上电的一瞬间,电源芯片会发生异常,导致输出电压只有2点几V。且需要断电重启,才能恢复。 请问是什么原因导致该
    发表于 01-08 08:01

    提高存储能力都在一瞬间

    电子发烧友网站提供《提高存储能力都在一瞬间.pdf》资料免费下载
    发表于 08-29 10:17 0次下载
    提高存储能力都在<b class='flag-5'>一瞬间</b>

    如何判断两个IP地址在同一个网段?如何实现跨网段访问?

    IP地址是因特网中用来标识主机的独特编号,为互联网的每一个网络和主机分配一个逻辑地址,从而可以进行定位与通信,其作用类似身份证。 子网掩码可以判断任意两个IP地址是否属于同一网段内。分别对各自的IP
    的头像 发表于 08-18 15:30 994次阅读

    同一网段多个相同IP设备如何进行NAT转换和跨网段访问

    在智能工厂的场景中,设备需要联网才能接入数字化管理系统,而在实际操作中,企业往往会遇见一些问题,比如同一网段下相同设备IP冲突的问题、不同网段下设备无法通行的问题,都会影响到设备联网和网络管理工作的开展。那么有没有简单高效的解决方法呢?
    的头像 发表于 08-15 15:35 512次阅读

    ARM®CoreLink™ NIC-450网络互连技术概述

    ARM CoreLink NIC-450网络互连是个高度可配置的多电源域工具库。 CoreLink NIC-450网络互连是个关键互连IP捆绑包,使您能够构建可扩展和可配置的
    发表于 08-02 13:30

    使用Arduino IDE对其进行闪存但是毫无作用怎么处理?

    嗨,我有个 ESP8266 版本 12E (NodeMCU),我正在使用 Arduino IDE 对其进行闪存。 我在同一网络上有个树莓派,它运行着 Mosquitto MQTT。 我正在尝试
    发表于 06-12 07:48

    同一个vlan不同的网段能不能互通?

    PING与网关同一网段IP,在A上抓包,可以看到A首先发出了关于网关11.1.1.1的ARP广播请求(对应B接到这个广播请求),B对这个11.1.1.1进行了ARP应答.但这个IP是不存在的所以PING结果超时。
    发表于 06-11 12:43 8840次阅读
    <b class='flag-5'>同一</b>个vlan不同的网段能不能互通?

    两个网络IP地址是否在同一个段中的判断方法

    我们知道IP地址是由“网络号+子网号+主机号”组成,判断两个IP地址是否在同一个网段主要看“网络号”,如果网络号一样,那么他们就在同一个网段
    的头像 发表于 06-02 14:31 1.1w次阅读
    两个<b class='flag-5'>网络</b>IP地址是否在<b class='flag-5'>同一</b>个段中的判断方法

    如何为NodeMCU添加以太连接?

    IP 地址连接。我尝试连接到路由器 (DHCP) 并连接到我的笔记本电脑并分配个固定的 IP 地址。在这两种情况下,连接都会失败。我使用的代码是库中包含的 TcpClient 示例。 有一瞬间我以为以太模块可能坏了,所以我
    发表于 06-02 08:37

    在dhcp模式下使用MIMRT1024,并在同一网络中使用不同的mac id连接了多个设备报错怎么解决?

    在dhcp模式下使用 MIMRT1024,并在同一网络中使用不同的 mac id 连接了多个设备。某些时期的设备出现错误(两次释放令牌)。我正在使用 Cortex M3 以太驱动程序(我不确定是否使用最新的驱动程序)。
    发表于 05-24 06:55

    这个是个什么情况?不能第二次启动同一个线程?

    ) rt_thread_startup(tid1); 尽然就卡住了,这个线程尽然重新不了,卡住。。。。 这个是个什么情况?不能第二次启动同一个线程,不应该啊,求助!!!
    发表于 05-17 14:16

    esp可以与wifi连接一起使用吗?

    ,因为速度非常快且能量低,但经过研究后我对 esp now 有些疑问: 1- esp现在可以与 wifi 连接一起使用吗? 我读到 esp 的频道现在应该和 wifi 样,但我听说它只能在频道 1 或
    发表于 05-08 06:48

    为什么将DALI与蓝牙网状网络一起使用?

    。   为什么将DALI与蓝牙网状网络一起使用?   最近的DALI计划侧重于灯具内网络。顾名思义,这是灯具内部的网络。这个网络可以像两个设
    发表于 05-04 17:44

    Arduino/8266 I2C无法找到与twi.h一起使用的twi.cpp怎么解决?

    我正在尝试深入了解 Arduino/8266 I2C 通信的核心,我发现了 8266 的特定版本: Wire.h Wire.ccp twi.h 但直无法找到与 twi.h 一起使用的 twi.cpp。通常它与 .h 文件位于同一
    发表于 05-04 06:29