Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
nuc980
ptp_IEEE1588_时间同步网络
【NK-980IoT评测】EMAC之4:IEEE1588
5.00
发布于 2022-04-04 08:56:38 浏览:1378
订阅该版
IEEE1588是网络精密时钟同步协议也称PTP,利用传统的NTP实现的能PTP能达到s级,利用EMAC带IEEE1588的芯片比如NUC980应当能达到ms级甚至更高,也有PYH带时钟的如DP83640。 NUC980的IEEE1588有关的寄存器如下 ```c #define REG_EMAC0_TSCTL (EMC0_BA+0x100) /*!< Time Stamp Control Register */ #define REG_EMAC0_TSSEC (EMC0_BA+0x110) /*!< Time Stamp Counter Second Register */ #define REG_EMAC0_TSSUBSEC (EMC0_BA+0x114) /*!< Time Stamp Counter Sub Second Register */ #define REG_EMAC0_TSINC (EMC0_BA+0x118) /*!< Time Stamp Increment Register */ #define REG_EMAC0_TSADDEN (EMC0_BA+0x11c) /*!< Time Stamp Addend Register */ #define REG_EMAC0_TSUPDSEC (EMC0_BA+0x120) /*!< Time Stamp Update Second Register */ #define REG_EMAC0_TSUPDSUBSEC (EMC0_BA+0x124) /*!< Time Stamp Update Sub Second Register */ #define REG_EMAC0_TSALMSEC (EMC0_BA+0x128) /*!< Time Stamp Alarm Second Register */ #define REG_EMAC0_TSALMSUBSEC (EMC0_BA+0x12c) /*!< Time Stamp Alarm Sub Second Register */ ``` 时间的更新支持粗略以及精细更新,`TSMODE (EMAC_TSCTL[2])` 为1时是精细更新。 粗略更新时每个周期会加上EMAC_TSINC的值,如时钟是150MHz时, 次秒寄存器 `(EMAC_TSSUBSEC) `共有31位, 所以 EMAC_TSINC要填入` (231) / 150M = 14.31 ~= 14 = 0x0E`,这样时钟误差会有`0.31/14 = 2.2%`比较大。 若是使用精细更新,则每个时钟周期有一个32位的累加器会不断加上存在`EMAC_TSADDNED`寄器中的值, 每当累加器溢位,次秒时间会加上储存在`EMAC_TSINC` 寄存器的值,因此更准确。 选择不同的`EMAC_TSINC`需要使用不同的 `EMAC_TSADDNED`。 ![图片1.png](https://oss-club.rt-thread.org/uploads/20220404/8fe5fa1ec829b2163930d16fe7db6d33.png) 初始化网络时钟的步骤如下: 1将TSEN(EMAC_TSCTL[0]) 设1使能网络时钟模块。 2将初始秒及次秒填入 EMAC_TSSEC以及EMAC_TSSUBSEC寄存器。 3设置EMAC_TSINC寄存器, 若是使用精细更新也须设置 EMAC_TSADDEND寄存器。 4将TSIEN (EMAC_TSCTL[1]) 设1开始网络时钟计时, 若要使用精细更新一并将 `TSMODE(EMAC_TSCTL[2])`置1。 5在IEEE 1588 规范当同一装置有多个网口时必须能共享时钟,所以若是两个以太网口同时开启网络时钟功能, 必须要将 EMAC1 的 `PTP_SRC (EMAC_MCMDR[7])` 置 1让EMAC1使用EMAC0内部时钟模块。 若网络时钟功能使能, 接收到封包的同时RXDES1及RXDES3会记录收到封包的时间。 所以若处理完封包后要重新使用这个描述符的话, 除了`RXDES0[31]`需要重新设置为1, 驱动程序要在这之前先将RXDES1和RXDES3 填回正确的指针值, 也就是说驱动程序需要在其他位置备份这两个指针以便之后回填。以下流程显示着初始化接收描述符的步骤,初始化描述符并预留了空间保存 RXDES1和RXDES3 的值, 在被时间戳覆盖后可以回填。 ```c TSCTL /* (EMC0_BA+0x100) /*!< Time Stamp Control Register控制寄存器 */ [0]=TSEN=Time Stamp Function Enable Bit,1使能0关闭 [1]=TSIEN =Time Stamp Counter Initialization Enable Bit,1则装载EMAC_UPDSEC和EMAC_UPDSUBSEC to PTP time stamp counter后清零. [2]=TSMODE=Time Stamp Fine Update Enable Bit选择时间计数器的更新方式1精密更新,0是粗糙更新。 [3]TSUPDATE=Time Stamp Counter Time Update Enable Bit时间计数器更新使能,1增加EMAC_UPDSEC和EMAC_UPDSUBSEC的值到时间计数器,完成后清零. [5]=TSALMEN=Time Stamp Alarm Enable Bit设置报警,1则设置TSALMIF (EMAC_INTSTS[28])高当EMAC_TSSEC=EMAC_ALMSEC和EMAC_TSSUBSEC=EMAC_ALMSUBSEC. UPDSEC; /*!< [0x0120] 秒初值秒寄存器*/ UPDSUBSEC;/*!< [0x0124] 次秒初值寄存器*/ TSINC; /*!< [0x0118] 秒加数寄存器*/ TSADDEND; /*!< [0x011c] 次秒加数寄存器*/ TSSUBSEC; /*!< [0x0114] 次秒计数结果寄存器*/ TSSEC;/*!< [0x0110] 秒计数结果寄存器*/ ALMSEC;/*0x128秒报警寄存器,与秒计数结果寄存器进行比较*/ ALMSUBSEC;/*0x12C次秒报警寄存器,与次秒计数结果寄存器进行比较*/ ``` 每个脉冲TSSEC在UPDSEC基础上增加TSINC。 UPDSEC溢出后TSSUBSEC在UPDSUBSEC基础上增加TSADDEND。 比较后设置时间戳中断`TSALMIF (EMAC_INTSTS[28])`为1. RTT已经实现的时钟函数如下 ```c void EMAC_EnableTS(EMAC_T *EMAC, uint32_t u32Sec, uint32_t u32Nsec); void EMAC_DisableTS(EMAC_T *EMAC); void EMAC_GetTime(EMAC_T *EMAC, uint32_t *pu32Sec, uint32_t *pu32Nsec); void EMAC_SetTime(EMAC_T *EMAC, uint32_t u32Sec, uint32_t u32Nsec); void EMAC_UpdateTime(EMAC_T *EMAC, uint32_t u32Neg, uint32_t u32Sec, uint32_t u32Nsec); void EMAC_EnableAlarm(EMAC_T *EMAC, uint32_t u32Sec, uint32_t u32Nsec); void EMAC_DisableAlarm(EMAC_T *EMAC); ``` 这几个函数只是实现了以太网收发帧的时间戳功能,还不能说实现实现了完整IEEE1588。 完整的IEEE1588至少局域网内要鉴别出主时钟, 如何使用?如何与IEC61850结合? `void EMAC_Open《== nu_emac_init(rt_device_t dev)《== rt_hw_nu_emac_init` 在drv_emc.c有宏`INIT_APP_EXPORT(rt_hw_nu_emac_init);`
0
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
zt1234
这家伙很懒,什么也没写!
文章
7
回答
0
被采纳
0
关注TA
发私信
相关文章
1
ENV下的NUC980能移动到RT STUDIO上吗?
2
NUC980 生成 UFFS 文件系统镜像
3
怎样生成基于NUC980、rt_thread系统的板级支持包(MDK开发环境)
4
这个接口在哪个文件里面的。
5
NUC980IOT开发板rt工程创建文件
6
NUC980之EMAC功能模块的硬件介绍
7
nuc980DDR和MDK的IRAM是怎样的映射关系
8
ncu977 跑rtthread 操作io没有反应
9
NUC980开发板生成Keil工程找不到Device和编译出错
10
rtthread studio创建NUC980工程无法设置RTC日期和时间
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
DMA
USB
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
I2C_IIC
ESP8266
UART
cubemx
WIZnet_W5500
ota在线升级
PWM
BSP
flash
freemodbus
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
keil_MDK
ulog
SFUD
msh
C++_cpp
MicroPython
本月问答贡献
RTT_逍遥
7
个答案
2
次被采纳
三世执戟
7
个答案
1
次被采纳
KunYi
6
个答案
1
次被采纳
winfeng
2
个答案
1
次被采纳
chenyaxing
2
个答案
1
次被采纳
本月文章贡献
出出啊
1
篇文章
4
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
3
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
2
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部