- 一、EtherCAT 协议概述
- 概览
- EtherCAT 是什么?
- 协议栈位置
- 核心优势
- 与其他工业以太网协议对比
- 技术详情
- EtherCAT 通信原理
- 帧处理流程
- 核心协议组成
- EtherCAT 从站状态机 (AL State Machine)
- EtherCAT 通信原理
- 深入源码
- IgH 中的协议实现概览
- 概览
- 二、EtherCAT 数据帧结构
- 概览
- 帧结构全景
- 帧结构层次
- 帧结构全景
- 技术详情
- 物理层帧结构与传输时序
- EtherCAT Header
- Datagram 结构详解
- Datagram 命令类型一览
- 三种寻址模式
- WKC (Working Counter) 机制
- 帧校验 (FCS / CRC-32)
- 深入源码
- 源码:master/datagram.h
- ec_datagram 结构体
- Datagram 类型枚举
- Datagram 状态枚举
- 源码:master/datagram.c 关键函数
- 源码:master/datagram.h
- 概览
- 三、ESC 从站控制器 (EtherCAT Slave Controller)
- 概览
- ESC 是什么?
- ESC 内部功能模块
- ESC 内存映射全景
- 技术详情
- ESC 帧处理流程
- 环路控制
- 影子缓冲区
- 循环帧防护
- ESC 寄存器映射表
- ESC 内存空间总览
- FMMU 寄存器配置(每个通道 16 字节)
- 同步管理器寄存器(每个通道 8 字节)
- 同步管理器通信模式
- 错误计数器
- 看门狗
- 写保护机制
- ESC 复位
- LED 信号状态
- ESC 封装器寄存器 (N32H7x5EC 特有)
- 中断机制
- AL 事件请求(PDI 中断)
- ECAT 事件请求(ECAT 中断)
- SII EEPROM
- EEPROM 内容布局
- 物理层要求
- EtherCAT 命令类型
- WKC (工作计数器)
- ESC 帧处理流程
- 深入源码
- 源码:master/slave.h — ec_slave 结构体
- ESC 寄存器访问方式
- 深入了解
- 概览
- 分布式时钟 (Distributed Clock, DC)
- 概览
- 为什么需要分布式时钟?
- DC 同步时序
- 技术详情
- 64 位系统时间
- 时钟同步关键概念
- DC 寄存器映射表
- DC 同步流程
- 参考时钟选择流程
- 同步过程四步骤
- 传播延迟测量
- DC 配置子状态机详解
- 从站时钟类型
- 同步信号 (SYNC0 / SYNC1)
- 锁存信号 (LATCH0 / LATCH1)
- 通信模式
- 漂移补偿流程
- 漂移补偿算法流程
- 64 位系统时间
- 深入源码
- 源码:master/sync.h — ec_sync 结构体
- 源码:master/fsm_slave_config.c — DC 配置状态机
- DC 配置状态机流程
- ec_master_calc_dc() 完整调用链
- SYNC0/SYNC1 信号时序与从站采样
- 同步信号初始化步骤(编程指南)
- DC 中断方式
- 深入了解
- 概览
一、EtherCAT 协议概述
概览
EtherCAT 是什么?
EtherCAT (Ethernet for Control Automation Technology) 是一种基于以太网的工业实时通信协议,由德国 Beckhoff Automation 公司于 2003 年开发。它已成为 IEC 61158 / IEC/PAS 62407 国际标准,是目前工业自动化领域中性能最高、应用最广泛的实时以太网协议之一。
核心理念:"On the fly" 处理
EtherCAT 的核心创新在于数据帧穿越从站时即时处理——从站 ESC (EtherCAT Slave Controller) 芯片在数据帧经过时直接读取或写入数据,无需接收完整帧后再处理。这使得 EtherCAT 具备极高的带宽利用率和超低通信延迟。
协议栈位置
图:EtherCAT 与其他工业以太网协议在 OSI 模型中的对比
核心优势
| 优势 | 说明 |
|---|---|
| 超低延迟 | 数据帧 "on the fly" 处理,周期可达 ~100μs,抖动 <1μs |
| 高带宽利用率 | 有效数据利用率超过 90%,远超传统以太网轮询机制 |
| 灵活拓扑 | 支持线型、星型、树型、环型拓扑,无需交换机 |
| 从站低成本 | ESC 芯片成本低廉,无需微处理器即可实现从站通信 |
| 精确同步 | 分布式时钟 (DC) 实现纳秒级全网时间同步 |
| 协议开放 | ETG (EtherCAT Technology Group) 维护,开放协议规范 |
与其他工业以太网协议对比
| 特性 | EtherCAT | PROFINET IRT | EtherNet/IP | POWERLINK |
|---|---|---|---|---|
| 最小周期 | ~100 μs | ~31.25 μs | ~1 ms | ~200 μs |
| 时间抖动 | < 1 μs | < 1 μs | ~ms 级 | < 1 μs |
| 带宽利用率 | > 90% | 高 | 低 | 中等 |
| 从站成本 | 低 (ESC 芯片) | 高 (需 ASIC) | 低 (标准以太网) | 中等 |
| 拓扑灵活性 | 线/星/树/环 | 星型为主 | 任意 | 线/星 |
| 同步精度 | 纳秒级 (DC) | 纳秒级 | 毫秒级 | 微秒级 |
| 标准 | IEC 61158 | IEC 61158 | IEC 61158 | IEC 61158 |
技术详情
EtherCAT 通信原理
EtherCAT 基于标准以太网 (IEEE 802.3) 物理层,使用专有的 EtherType 0x88A4 标识 EtherCAT 帧。与传统的 TCP/IP 通信不同,EtherCAT 直接在以太网帧中承载过程数据,完全跳过了 TCP/IP 协议栈,从而实现了极高的通信效率。
帧处理流程
核心协议组成
| 协议 | 全称 | 用途 |
|---|---|---|
| CoE | CANopen over EtherCAT | SDO 参数配置、PDO 映射、Emergency 消息 |
| EoE | Ethernet over EtherCAT | 通过 EtherCAT 隧道传输标准以太网帧 |
| FoE | File Access over EtherCAT | 固件上传/下载 (类似 TFTP) |
| SoE | Servo over EtherCAT | 伺服驱动器参数访问 (SERCOS 映射) |
| VoE | Vendor-specific over EtherCAT | 厂商自定义协议扩展 |
EtherCAT 从站状态机 (AL State Machine)
每个 EtherCAT 从站具有 4 个应用层状态(外加 1 个可选状态),由低到高:
| 状态 | 邮箱通信 | 过程数据 | 说明 |
|---|---|---|---|
| Init | 仅初始化 | 不可用 | 从站上电初始状态,ESC 寄存器可访问 |
| Pre-Operational | 可用 | 不可用 | 可通过邮箱 (CoE/SoE) 配置从站参数 |
| Safe-Operational | 可用 | 输入可读 | 过程数据输入可用,输出保持安全值 |
| Operational | 可用 | 读写可用 | 正常工作状态,过程数据完整交换 |
| Bootstrap(可选) | 可用 | 不可用 | 固件更新专用状态,由 Init 直接进入 |
深入源码
IgH 中的协议实现概览
IgH EtherCAT Master 在内核空间完整实现了 EtherCAT 协议栈。以下列出协议各层对应的源码模块:
| 协议层 | 源文件 | 说明 |
|---|---|---|
| Datagram 收发 | master/datagram.c |
Datagram 生命周期管理,14 种类型支持 |
| FMMU 配置 | master/fmmu_config.c |
逻辑地址到物理地址映射配置 |
| Sync Manager | master/sync.c, master/sync_config.c |
同步管理器/邮箱缓冲区配置 |
| 邮箱通信 | master/mailbox.c |
邮箱发送/接收/握手底层实现 |
| CoE (SDO) | master/fsm_coe.c |
SDO 上传/下载,字典读取,PDO 映射 |
| EoE | master/fsm_eoe.c, master/ethernet.c |
以太网隧道,虚拟网络接口 |
| FoE | master/fsm_foe.c |
文件传输/固件升级 |
| SoE | master/fsm_soe.c |
SERCOS 协议映射 |
| AL 状态转换 | master/fsm_change.c |
从站 AL 状态请求-确认机制 |
| DC 同步 | master/fsm_slave_config.c (DC 部分) |
分布式时钟配置流程 |
源码阅读建议
建议按照以下顺序阅读协议相关源码:
datagram.h/c— 理解数据帧基本单元
mailbox.c— 理解邮箱通信基础
fsm_change.c— 理解 AL 状态转换
fsm_coe.c— 理解 CoE/SDO 流程其他 FSM 按需深入
二、EtherCAT 数据帧结构
完整以太网帧 + EtherCAT Header + Datagram 结构详解
概览
帧结构全景
EtherCAT 数据帧基于标准 IEEE 802.3 以太网帧格式,使用 EtherType 0x88A4 标识。在物理层上,完整帧包含帧间隔 (IFG, 12字节)、前导码 (Preamble, 7字节)、帧起始定界符 (SFD, 1字节)、以太网帧头、EtherCAT 数据区及 FCS 帧校验 (4字节, CRC-32)。一个 EtherCAT 帧内可以串联多个 Datagram,每个 Datagram 独立寻址、独立处理。
100 Mbps 传输速率
EtherCAT 物理层使用 100BASE-TX 全双工以太网 (100 Mbit/s)。在该速率下,每传输一个字节需要 80 ns(8 bits ÷ 100 MHz = 80 ns)。例如传输 100 字节数据需要 8 μs。
图:完整的 EtherCAT 以太网帧字节级布局(含帧间隔、前导码、帧校验)
帧结构层次
技术详情
物理层帧结构与传输时序
EtherCAT 基于 IEEE 802.3 标准以太网,物理层使用 100BASE-TX 全双工模式,固定传输速率 100 Mbit/s。下面是以太网帧在物理线路上的完整结构:
| 字段 | 大小 | 说明 | 传输时间 @ 100Mbps |
|---|---|---|---|
| IFG (Inter-Frame Gap) | 12 Bytes | 帧间隔,以太网规范要求两帧之间的最小间隔,用于设备准备接收下一帧 | 960 ns |
| Preamble (前导码) | 7 Bytes | 用于接收端时钟同步和信号电平稳定,固定模式 0x55 (10101010) 重复 7 次 |
560 ns |
| SFD (Start of Frame Delimiter) | 1 Byte | 帧起始定界符,固定值 0xD5 (10101011),标记以太网帧的开始 |
80 ns |
| Dest MAC (目标地址) | 6 Bytes | 目标 MAC 地址 | 480 ns |
| Src MAC (源地址) | 6 Bytes | 源 MAC 地址 | 480 ns |
| EtherType | 2 Bytes | EtherCAT 固定值 0x88A4,用于区分其他以太网协议 |
160 ns |
| EtherCAT Data | 44~1498 Bytes | 包含 EtherCAT Header (2B) + Datagram(s),满足以太网最小帧 64 字节要求 | 3.52 ~ 119.84 μs |
| FCS (Frame Check Sequence) | 4 Bytes | 帧校验序列,使用 CRC-32 算法,覆盖 Dest MAC 到 Data 的全部内容,用于检测传输错误 | 320 ns |
帧大小约束 (IEEE 802.3)
最小帧: 以太网帧(不含 IFG 和前导码)最小 64 字节。当 EtherCAT 数据不足时需填充 (Padding) 到 46 字节载荷。
最大帧: 以太网帧(不含 IFG 和前导码)最大 1518 字节(标准帧)。
完整帧: 含 IFG + 前导码 + SFD + 以太网帧,最小 84 字节 (6.72 μs),最大 1538 字节 (123.04 μs)。
EtherCAT Header
| 字段 | 位数 | 说明 |
|---|---|---|
| Length | 11 bits | EtherCAT 数据区长度 (不含 EtherCAT Header 本身) |
| Reserved | 1 bit | 保留位 |
| Type | 4 bits | 协议类型: 0x1 = EtherCAT Datagram 类型 |
Datagram 结构详解
| 字段 | 大小 | 说明 |
|---|---|---|
| Cmd | 1 Byte | 命令类型,决定操作方式 (读/写/读写) 和寻址模式 |
| Index | 1 Byte | Datagram 序号标识,由主站分配 |
| Address | 4 Bytes | 地址字段,含义取决于寻址模式 |
| Len+M | 2 Bytes | 数据区长度 (11 bits) + More 标志位 (1 bit,表示后续还有更多 Datagram) |
| IRQ | 2 Bytes | 中断寄存器,从站可通过此字段向主站发送中断请求 |
| Data | 最多 1486 Bytes | 有效数据负载 |
| WKC | 2 Bytes | Working Counter,由从站在处理过程中递增 |
Datagram 命令类型一览
| 命令 | 代码 | 寻址模式 | 操作 | WKC 增量 |
|---|---|---|---|---|
| APRD | 0x01 | Auto-increment | 读 | +1 (读) |
| APWR | 0x02 | Auto-increment | 写 | +2 (写) |
| APRW | 0x03 | Auto-increment | 读写 | +3 (读+写) |
| FPRD | 0x04 | Configured address | 读 | +1 |
| FPWR | 0x05 | Configured address | 写 | +2 |
| FPRW | 0x06 | Configured address | 读写 | +3 |
| BRD | 0x07 | Broadcast | 读 | 每站 +1 |
| BWR | 0x08 | Broadcast | 写 | 每站 +2 |
| BRW | 0x09 | Broadcast | 读写 | 每站 +3 |
| LRD | 0x0A | Logical | 读 | +1 |
| LWR | 0x0B | Logical | 写 | +2 |
| LRW | 0x0C | Logical | 读写 | +3 |
| ARMW | 0x0D | Auto-increment | 读多写 | +3 |
| FRMW | 0x0E | Configured address | 读多写 | +3 |
三种寻址模式
WKC (Working Counter) 机制
图:多个 Datagram 串联排列及 WKC 处理流程
WKC 机制要点
每个从站处理 Datagram 时按操作类型递增 WKC:读操作 +1、写操作 +2、读写操作 +3。主站通过检查返回帧中的 WKC 值来验证操作是否被正确执行。若 WKC 不等于期望值,表示通信异常。
帧校验 (FCS / CRC-32)
FCS (Frame Check Sequence) 位于以太网帧末尾,长度为 4 字节,使用 CRC-32 多项式校验算法。FCS 覆盖范围从目标 MAC 地址到数据区末尾的全部内容(即以太网帧中除前导码和 FCS 本身之外的所有字段)。
FCS 与 ESC 处理
ESC (EtherCAT 从站控制器) 在硬件层面自动处理 FCS:接收帧时验证 CRC-32,转发帧时重新计算并更新 FCS。这意味着 ESC 在 "on-the-fly" 处理过程中修改了帧数据(如写入过程数据、更新 WKC),FCS 会在转发时自动更新,无需主站干预。
深入源码
源码:master/datagram.h
ec_datagram 结构体
master/datagram.h — ec_datagram_t 核心字段
typedef struct {struct list_head queue; // 主站 datagram 队列节点struct list_head sent; // 已发送 datagram 列表节点ec_device_index_t device_index; // 发送设备索引 (主/备)ec_datagram_type_t type; // 命令类型 (APRD, APWR, ...)uint8_t address[EC_ADDR_LEN]; // 4 字节地址字段uint8_t *data; // 数据负载指针ec_origin_t data_origin; // 数据内存来源 (内部/外部)size_t mem_size; // 数据内存大小size_t data_size; // 实际数据大小uint8_t index; // Datagram 序号uint16_t working_counter; // 工作计数器 (返回值)ec_datagram_state_t state; // 当前状态unsigned long jiffies_sent; // 发送时间戳unsigned long jiffies_received; // 接收时间戳char name[EC_DATAGRAM_NAME_SIZE];// Datagram 描述名
} ec_datagram_t;
Datagram 类型枚举
master/datagram.h — ec_datagram_type_t
typedef enum {EC_DATAGRAM_NONE = 0x00, // 空类型EC_DATAGRAM_APRD = 0x01, // Auto-increment Physical ReadEC_DATAGRAM_APWR = 0x02, // Auto-increment Physical WriteEC_DATAGRAM_APRW = 0x03, // Auto-increment Physical ReadWriteEC_DATAGRAM_FPRD = 0x04, // Configured Address Physical ReadEC_DATAGRAM_FPWR = 0x05, // Configured Address Physical WriteEC_DATAGRAM_FPRW = 0x06, // Configured Address Physical ReadWriteEC_DATAGRAM_BRD = 0x07, // Broadcast ReadEC_DATAGRAM_BWR = 0x08, // Broadcast WriteEC_DATAGRAM_BRW = 0x09, // Broadcast ReadWriteEC_DATAGRAM_LRD = 0x0A, // Logical ReadEC_DATAGRAM_LWR = 0x0B, // Logical WriteEC_DATAGRAM_LRW = 0x0C, // Logical ReadWriteEC_DATAGRAM_ARMW = 0x0D, // Auto-increment Read Multiple WriteEC_DATAGRAM_FRMW = 0x0E // Configured Address Read Multiple Write
} ec_datagram_type_t;
Datagram 状态枚举
master/datagram.h — ec_datagram_state_t
typedef enum {EC_DATAGRAM_INIT, // 初始化状态EC_DATAGRAM_QUEUED, // 已入队等待发送EC_DATAGRAM_SENT, // 已发送 (仍在队列中)EC_DATAGRAM_RECEIVED, // 已接收 (已出队)EC_DATAGRAM_TIMED_OUT, // 超时 (已出队)EC_DATAGRAM_ERROR, // 发送/接收错误EC_DATAGRAM_INVALID // 无效,不应被入队
} ec_datagram_state_t;
源码:master/datagram.c 关键函数
| 函数 | 说明 |
|---|---|
ec_datagram_aprd(datagram, ring_pos, addr, size) |
构造 Auto-increment 读 Datagram |
ec_datagram_fpwr(datagram, config_addr, addr, size) |
构造 Configured address 写 Datagram |
ec_datagram_lrd(datagram, offset, size) |
构造逻辑地址读 Datagram |
ec_datagram_lrw(datagram, offset, size) |
构造逻辑地址读写 Datagram |
ec_datagram_brd(datagram, addr, size) |
构造广播读 Datagram |
ec_datagram_print_wc_error(datagram) |
打印 WKC 错误信息 |
常量定义
EC_ADDR_LEN = 4— 地址字段长度
EC_DATAGRAM_HEADER_SIZE = 10— Datagram 头部长度 (Cmd+Idx+Addr+Len+IRQ)
EC_DATAGRAM_FOOTER_SIZE = 2— Datagram 尾部长度 (WKC)
EC_MAX_DATA_SIZE ≈ 1486— 单个 Datagram 最大数据长度
三、ESC 从站控制器 (EtherCAT Slave Controller)
1.3 — ESC 硬件实现、寄存器映射、帧处理流程(基于 N32H7x5EC)
概览
ESC 是什么?
ESC (EtherCAT Slave Controller) 是 EtherCAT 从站的核心通信芯片,负责处理 EtherCAT 数据帧。ESC 由德国 Beckhoff 授权的 IP 核实现,在数据帧经过时直接读取/写入过程数据,无需在每个节点接收、解析和复制数据,实现 "on the fly" 帧处理。
N32H7x5EC ESC 主要特性
MII 端口: 2 个(连接外部以太网 PHY)
FMMU: 8 个现场总线内存管理单元
同步管理器 (SM): 8 个
过程数据内存: 8 KB
分布式时钟 (DC): 64 位纳秒精度
过程数据接口 (PDI): 片上总线(AHB-to-OPB 桥接)
ESC 内部功能模块
ESC 内存映射全景
图:N32H7x5EC ESC 内存映射 (0x0000–0x2FFF)
技术详情
ESC 帧处理流程
ESC 使用标准 IEEE 802.3 以太网帧,EtherType = 0x88A4。ESC 无 MAC/IP 地址,可处理任意 MAC/IP 的 EtherCAT 帧。帧处理顺序:端口 0 → EPU → 端口 1。帧不存储,通过时即读写,转发延迟最小化。
环路控制
每个端口可处于打开或关闭状态,支持四种环路控制模式:
| 模式 | 描述 |
|---|---|
| 手动打开 | 端口始终开启,即使无链路 |
| 手动关闭 | 端口始终关闭 |
| 自动 | 根据链路状态自动开关 |
| 自动关闭 | 链路丢失时关闭,但不自动打开 |
⚠ 注意
若所有端口均关闭,端口 0 自动打开作为恢复端口。ESC 间或主站与首个从站间不能使用非管理型交换机。
影子缓冲区
寄存器写入(0x0000-0x0F7F)先存入影子缓冲区,帧 FCS 正确后才写入有效寄存器。过程数据 RAM 无影子缓冲区。
循环帧防护
端口 0 环路关闭且为自动模式时,EPU 设置数据报循环位 (C 位)。循环位已为 1 的帧被丢弃,防止帧在网络中无限循环。
ESC 寄存器映射表
| 地址范围 | 大小 | 区域名称 | 读/写 | 说明 |
|---|---|---|---|---|
| 0x0000–0x000F | 16 B | 类型与版本信息 | R | ESC 类型 (0xAC/0xAD)、版本号、构建号、FMMU/SM 数量、端口描述 |
| 0x0010–0x0011 | 2 B | 配置站地址 | R/W | ESC_CFGSA — 用于 FPRD/FPWR 寻址 |
| 0x0012–0x0013 | 2 B | 配置站别名 | R/W | ESC_CFGSALIAS |
| 0x0020 | 1 B | 寄存器写使能 | W | ESC_REGWEN — 写保护控制 |
| 0x0030 | 1 B | ESC 写使能 | W | ESC_ESCWEN — 全局写保护控制 |
| 0x0040 | 1 B | ECAT 复位 ESC | W | 连续写入 'R','E','S' 触发硬件复位 |
| 0x0041 | 1 B | PDI 复位 ESC | W | ESC_RSTPDI |
| 0x0100–0x0103 | 4 B | DL 控制 | R/W | ESC_DLCTRL — 环路控制/FIFO/转发设置 |
| 0x0108–0x010B | 4 B | 物理 R/W 偏移 | R/W | ESC_RWOFFSET |
| 0x0110–0x0111 | 2 B | DL 状态 | R | ESC_DLSTS |
| 0x0120–0x0121 | 2 B | AL 控制 | R/W | ESC_ALCTRL — 应用层状态控制 |
| 0x0130–0x0131 | 2 B | AL 状态 | R | ESC_ALSTS — 当前应用层状态 |
| 0x0134–0x0135 | 2 B | AL 状态码 | R | ESC_ALSTSC — 状态码/错误码 |
| 0x0140–0x0159 | ~26 B | PDI 控制/配置 | R/W | ESC_PDICTRL, ESC_CFG, ESC_PDIINFO, ESC_PDICFG 等 |
| 0x0200–0x0223 | ~36 B | 事件/中断寄存器 | R/W | ECAT 事件屏蔽/请求, AL 事件屏蔽/请求 |
| 0x0300–0x0317 | ~24 B | 错误计数器 | R/W | RX 错误、转发错误、EPU 错误、丢失链接计数器 |
| 0x0400–0x0445 | ~70 B | 看门狗寄存器 | R/W | 分频器、PDI/PD 看门狗时间、状态、计数器 |
| 0x0500–0x051F | ~32 B | EEPROM 寄存器 | R/W | 配置、控制/状态、地址、数据 |
| 0x0510–0x0519 | ~10 B | MII 管理寄存器 | R/W | PHY 管理接口控制、地址、数据 |
| 0x0600–0x067F | 128 B | FMMU 寄存器 | R/W | 8 个 FMMU 通道,每个 16 字节 (0x0600+0x10×n) |
| 0x0800–0x083F | 64 B | 同步管理器寄存器 | R/W | 8 个 SM 通道,每个 8 字节 (0x0800+0x08×n) |
| 0x0900–0x0A07 | ~264 B | 分布式时钟 (DC) 寄存器 | R/W | 接收时间、系统时间、偏移、延迟、SYNC 控制、Latch 等 |
| 0x0E00–0x0E0F | 16 B | 识别寄存器 | R | 产品 ID、供应商 ID(来自 EEPROM) |
ESC 内存空间总览
| 地址范围 | 大小 | 用途 |
|---|---|---|
| 0x0000–0x0F7F | ~4 KB | 寄存器 |
| 0x0F80–0x0FFF | 128 B | 用户 RAM |
| 0x1000–0x2FFF | 8 KB | 过程数据 RAM |
FMMU 寄存器配置(每个通道 16 字节)
偏移地址公式:0x0600 + 0x10 × n(n = 0~7)
| 偏移 | 寄存器名 | 大小 | 说明 |
|---|---|---|---|
| +0x00 | ESC_FMMUnLSA | 4 B | 逻辑起始地址 (32 位) |
| +0x04 | ESC_FMMUnLEN | 2 B | 长度 (16 位) |
| +0x06 | ESC_FMMUnLSATB | 1 B | 逻辑起始位 |
| +0x07 | ESC_FMMUnLSTPB | 1 B | 逻辑停止位 |
| +0x08 | ESC_FMMUnPSA | 2 B | 物理起始地址 (16 位) |
| +0x0A | ESC_FMMUnPSATB | 1 B | 物理起始位 |
| +0x0B | ESC_FMMUnTYPE | 1 B | 类型 (读/写/读写) |
| +0x0C | ESC_FMMUnACT | 1 B | 激活/停用 |
同步管理器寄存器(每个通道 8 字节)
偏移地址公式:0x0800 + 0x08 × n(n = 0~7)
| 偏移 | 寄存器名 | 大小 | 说明 |
|---|---|---|---|
| +0x00 | ESC_SMnPSA | 2 B | 物理起始地址 |
| +0x02 | ESC_SMnLEN | 2 B | 长度 |
| +0x04 | ESC_SMnCTRL | 1 B | 控制 (模式/方向/看门狗/中断) |
| +0x05 | ESC_SMnSTS | 1 B | 状态 |
| +0x06 | ESC_SMnACT | 1 B | 激活 |
| +0x07 | ESC_SMnPDICTRL | 1 B | PDI 控制 |
同步管理器通信模式
| 模式 | 特点 | 用途 |
|---|---|---|
| 缓冲模式(三缓冲) | 生产者可随时写入,消费者获取最新数据,旧数据丢弃 | 周期过程数据 |
| 邮箱模式 | 握手机制,交替读写,数据不丢失 | 应用层协议(EoE/CoE/FoE/AoE) |
错误计数器
所有计数器在 0xFF 饱和,可通过写入清除。
| 计数器 | 寄存器 | 描述 |
|---|---|---|
| 无效帧计数器 | ESC_RXERRCNTn (低 8 位) | 最初检测到无效帧 |
| RX 错误计数器 | ESC_RXERRCNTn (高 8 位) | 物理层接收错误 |
| 转发 RX 错误计数器 | ESC_FWDRXERRCNTn | 前级 ESC 标记的无效帧 |
| EPU 错误计数器 | ESC_EPUERRCNT | 无效帧通过 EPU |
| PDI 错误计数器 | ESC_PDIERRCNT | PDI 检测到的物理错误 |
| 丢失链接计数器 | ESC_LOSTLINKCNTn | 链路丢失事件(每端口) |
| 看门狗计数器 PD | ESC_WDCNTPD | 过程数据看门狗超时 |
| 看门狗计数器 PDI | ESC_WDCNTPDI | PDI 看门狗超时 |
看门狗
两个独立看门狗共享分频器:
| 看门狗 | 触发条件 | 超时后果 |
|---|---|---|
| 过程数据 WD | SM 缓冲区完整写入 | 状态位反映,计数器递增 |
| PDI WD | 任何 PDI 读写访问 | DL 状态位反映,计数器递增 |
超时计算:tWD_Div = (WD_DIV + 2) × 40 ns。过程数据/PDI 看门狗分别可通过将对应时间寄存器设为 0 来禁用。
写保护机制
| 保护类型 | 范围 | 说明 |
|---|---|---|
| 寄存器写保护 | 0x0000–0x0F7F | 需在帧内先写 ESC_REGWEN (0x0020) |
| ESC 写保护 | 所有区域 | 需在帧内先写 ESC_ESCWEN (0x0030) |
ESC 复位
通过 ECAT 或 PDI 向 0x0040/0x0041 连续写入 0x52('R')、0x45('E')、0x53('S') 触发硬件复位。复位信号可通过 GPIO 输出(如 PHY 复位)。
LED 信号状态
| LED | 状态 | 含义 |
|---|---|---|
| RUN LED (绿) | 灭 | INIT 状态 |
| 慢闪 | 预运行 (Pre-Op) 状态 | |
| 单闪 | 安全运行 (Safe-Op) 状态 | |
| 常亮 | 运行 (Op) 状态 | |
| 快闪 | BOOTSTRAP 或加载 EEPROM | |
| ERR LED (红) | 灭 | 无错误 |
| 快闪 | EEPROM 加载错误 | |
| 慢闪 | 无效硬件配置 | |
| 单闪 | AL 状态错误指示 | |
| 双闪 | 过程数据看门狗超时 | |
| 常亮 | PDI 看门狗超时或自检错误 |
ESC 封装器寄存器 (N32H7x5EC 特有)
ESC 起始地址:0x400B 0000。封装器提供额外的控制和配置寄存器:
| 偏移地址 | 寄存器 | 描述 |
|---|---|---|
| 0x0000 | ESC_WRACTRLSTS | 控制状态(含 ESCRST 位) |
| 0x0004 | ESC_WRACFG0 | 配置 0(TXSHIFT, LINKPOL, ADDROFFSET 等) |
| 0x0008 | ESC_WRACFG1 | 配置 1(EEPROMSIZE, 中断使能, RSTESC 等) |
| 0x000C | ESC_WRAINTSTS | 中断状态(SYNC_OUT, PDI_WD, RESET, SOF/EOF 等) |
中断机制
AL 事件请求(PDI 中断)
AL 事件请求寄存器与 AL 事件屏蔽寄存器逻辑与后,所有位逻辑或合并为一个 IRQ。
| 中断线 | NVIC 映射 | 说明 |
|---|---|---|
| IRQ_A | ECAT_OPB_IRQ | AL 事件合并中断 |
| IRQ_B | ECAT_SYNC0_INT | DC SYNC0 中断 |
| IRQ_C | ECAT_SYNC1_INT | DC SYNC1 中断 |
| IRQ_D | ECAT_WRP_INT | 封装器中断 |
ECAT 事件请求(ECAT 中断)
通知主站从站事件,利用 EtherCAT 数据报中的 IRQ 字段,各从站中断位逻辑或组合。
SII EEPROM
通过 I2C 接口连接外部 EEPROM(最大 1 Mbit),EEPROM_CLK 和 EEPROM_DATA 需 4.7kΩ 上拉电阻。半字(16 位)寻址。
EEPROM 内容布局
| 半字地址 | 内容 |
|---|---|
| 0x0 | PDI 控制/ESC 配置 |
| 0x1 | PDI 配置 |
| 0x2 | 同步信号脉冲长度 |
| 0x3 | 扩展 PDI 配置 |
| 0x4 | 配置站别名 |
| 0x7 | 校验和 |
| 0x8–0x9 | 供应商 ID |
| 0xA–0xB | 产品代码 |
| 0xC–0xD | 修订编号 |
| 0xE–0xF | 序列号 |
| 0x14–0x1B | 邮箱配置(偏移/大小) |
| 0x1C | 邮箱协议 |
| 0x28–0x2F | 额外 ESC 配置 |
| 0x3E | 大小 |
| 0x3F | 版本 |
| 0x40+ | 类别数据 (Category) |
支持三种 EEPROM 命令:读(4 字节)、写(2 字节)、重新加载。上电/复位后自动加载配置区域(半字 0-7)。写操作需先在同一帧内设置写使能位。
物理层要求
100 Mbit/s 全双工,使用标准 IEEE 802.3 PHY,通过 MII 接口连接。不支持 RMII(会增加转发延迟和抖动)。
三种链路状态来源:LINK_MII 信号(PHY LED 输出,最快)→ MI 链路检测(MII 管理接口轮询)→ 增强型链路检测(RX_ERR 信号检测)。
EtherCAT 命令类型
| CMD | 缩写 | 名称 | 描述 |
|---|---|---|---|
| 0 | NOP | 无操作 | 从站忽略命令 |
| 1 | APRD | 自动递增读 | 地址递减,为 0 时读取数据 |
| 2 | APWR | 自动递增写 | 地址递减,为 0 时写入数据 |
| 3 | APRW | 自动递增读写 | 地址递减,为 0 时读写数据 |
| 4 | FPRD | 配置地址读 | 地址匹配时读取 |
| 5 | FPWR | 配置地址写 | 地址匹配时写入 |
| 6 | FPRW | 配置地址读写 | 地址匹配时读写 |
| 7 | BRD | 广播读 | 所有从站逻辑或读取 |
| 8 | BWR | 广播写 | 所有从站写入 |
| 9 | BRW | 广播读写 | 所有从站逻辑或读写 |
| 10 | LRD | 逻辑内存读 | FMMU 读映射 |
| 11 | LWR | 逻辑内存写 | FMMU 写映射 |
| 12 | LRW | 逻辑内存读写 | FMMU 读写映射 |
| 13 | ARMW | 自动递增读多次写 | 自动递增读,多次写 |
| 14 | FRMW | 配置读多次写 | 配置地址匹配读,多次写 |
WKC (工作计数器)
每次成功读写操作递增 WKC:读操作 +1,写操作 +2,读写操作 +3。
深入源码
源码:master/slave.h — ec_slave 结构体
从站在 IgH 主站中由 ec_slave 结构体表示,包含了从 ESC 寄存器和 EEPROM/SII 中读取的所有信息:
master/slave.h — ec_slave 关键字段
struct ec_slave {ec_master_t *master; // 所属主站ec_device_index_t device_index; // 响应设备索引 (主/备网卡)// 地址信息uint16_t ring_position; // 环形拓扑位置uint16_t station_address; // 配置站地址 (对应 ESC 0x0010)uint16_t effective_alias; // 有效别名地址 (对应 ESC 0x0012)// 端口信息ec_slave_port_t ports[EC_MAX_PORTS]; // 端口状态uint8_t upstream_port; // 面向主站的端口索引// 配置状态ec_slave_config_t *config; // 当前从站配置ec_slave_state_t requested_state;// 请求的 AL 状态 (写 0x0120)ec_slave_state_t current_state; // 当前 AL 状态 (读 0x0130)uint16_t last_al_error; // 最后 AL 错误码 (读 0x0134)// 邮箱配置 (来自 EEPROM 0x14-0x1B)uint16_t configured_rx_mailbox_offset;uint16_t configured_rx_mailbox_size;uint16_t configured_tx_mailbox_offset;uint16_t configured_tx_mailbox_size;// 基础信息 (从 ESC 0x0000 区域读取)uint8_t base_type; // ESC 类型 (0x0000, 复位值 0xAC/0xAD)uint8_t base_revision; // ESC 修订版本 (0x0001)uint16_t base_build; // 构建版本 (0x0002-0x0003)uint8_t base_fmmu_count; // FMMU 数量 (0x0004, 复位值 0x08)uint8_t base_sync_count; // SM 数量 (0x0005, 复位值 0x08)uint8_t base_dc_supported; // 是否支持 DC (0x0008 特性位)ec_slave_dc_range_t base_dc_range; // DC 范围类型uint32_t transmission_delay; // DC 传播延迟 (写入 0x0928)// SII/EEPROM 数据uint16_t *vendor_words; // SII 前 16 个字ec_sii_image_t *sii_image; // 完整 SII 镜像// 各类请求队列struct list_head sdo_requests; // SDO 请求队列struct list_head foe_requests; // FoE 请求队列struct list_head soe_requests; // SoE 请求队列struct list_head eoe_requests; // EoE 请求队列// 邮箱接收数据缓冲区ec_mbox_data_t mbox_coe_data;ec_mbox_data_t mbox_foe_data;ec_mbox_data_t mbox_soe_data;ec_mbox_data_t mbox_voe_data;
};
ESC 寄存器访问方式
IgH 主站通过以下 Datagram 类型访问 ESC 寄存器:
| 场景 | Datagram 类型 | 用途 |
|---|---|---|
| 拓扑扫描 | APRD (Auto-increment Read) | 扫描时按递增地址读取各从站 ESC 寄存器(类型/版本 0x0000) |
| 正常运行 | FPRD/FPWR (Configured address) | 通过配置站地址 (0x0010) 读写从站寄存器 |
| 过程数据 | LRD/LWR/LRW (Logical) | 通过 FMMU (0x0600+) 逻辑地址映射访问过程数据 RAM (0x1000-0x2FFF) |
| 广播操作 | BRD/BWR (Broadcast) | 同时向所有从站读写 (如 DC 时间同步 0x0910) |
| DC 漂移补偿 | ARMW/FRMW | 读取参考时钟并写入其他从站 (0x0910) |
深入了解
- 分布式时钟 (DC) — DC 寄存器详解与时间同步机制
- FMMU 原理 — FMMU 逻辑地址到物理地址的映射机制
- 同步管理器 — SM 缓冲区管理与通信模式
- AL 状态机 — ESC 状态机转换机制 (0x0120/0x0130)
- EEPROM 处理 — SII EEPROM 读取解析流程
分布式时钟 (Distributed Clock, DC)
1.4 — DC 全网精确时间同步原理、64 位系统时间、漂移补偿、SYNC 信号(基于 N32H7x5EC)
概览
为什么需要分布式时钟?
在工业自动化中,多个从站需要在完全相同的时刻采集输入信号或更新输出信号。即使微秒级的时间差异也会导致运动控制中的位置误差或测量数据不一致。EtherCAT 分布式时钟 (Distributed Clock, DC) 机制实现全网纳秒级精确时间同步。
N32H7x5EC DC 核心特性
系统时间: 64 位,从 2000-01-01 00:00 开始,基本单位 1 ns
内部更新速率: 100 MHz
同步抖动: 约 12 ns
同步信号: SYNC0 + SYNC1,可配置周期和脉冲长度
锁存信号: LATCH0/LATCH1,采样率 100 MHz,抖动约 11 ns
DC 同步时序
图:DC 传播延迟测量与 SYNC0/SYNC1 信号时序关系
技术详情
64 位系统时间
EtherCAT DC 使用 64 位纳秒计数器表示系统时间,从 2000-01-01 00:00 开始计时,基本单位为 1 ns。64 位时间可表示约 584 年的范围,无需处理溢出问题。每个具有 DC 功能的从站都维护独立的本地时钟。
时钟同步关键概念
| 概念 | 说明 |
|---|---|
| 系统时间 | 从 2000-01-01 00:00 开始,64 位,基本单位 1 ns |
| 参考时钟 | 主站后第一个具有 DC 功能的 ESC |
| 本地时钟 | 每个 DC 从站独立运行的自由时钟 |
| 偏移 (Offset) | 本地时钟与参考时钟的初始差异 |
| 漂移 (Drift) | 时钟源的微小频率偏差,需持续补偿 |
公式:tLocal copy of System Time = tLocal time + tOffset
DC 寄存器映射表
| 地址 | 寄存器名 | 大小 | 说明 |
|---|---|---|---|
| 0x0900–0x0903 | ESC_DCRXTIMP0 | 4 B | DC 接收时间端口 0 |
| 0x0904–0x0907 | ESC_DCRXTIMP1 | 4 B | DC 接收时间端口 1 |
| 0x0910–0x0917 | ESC_DCSYSTIM | 8 B | DC 系统时间 (64 位纳秒) |
| 0x0918–0x091F | DC 本地时间 | 8 B | 本地时间 = 系统时间 - 偏移 |
| 0x0920–0x0927 | ESC_DCSYSTIMOST | 8 B | DC 系统时间偏移 |
| 0x0928–0x092B | ESC_DCSYSTIMDLY | 4 B | DC 系统时间延迟 |
| 0x092C–0x092F | ESC_DCSYSTIMDIFF | 4 B | DC 系统时间差 |
| 0x0930–0x0933 | ESC_DCSCSAT | 4 B | DC 速度计数器启动值 |
| 0x0934–0x0937 | ESC_DCSCDIFF | 4 B | DC 速度计数器差 |
| 0x0938 | ESC_DCSTDFD | 1 B | DC 系统时间差滤波深度 |
| 0x0939 | ESC_DCSCFD | 1 B | DC 速度计数器滤波深度 |
| 0x0980 | ESC_DCCUCTRL | 1 B | DC 循环单元控制 |
| 0x0981 | ESC_DCACT | 1 B | DC 激活 (SYNC0/SYNC1 使能) |
| 0x0982–0x0983 | ESC_DCSSPLEN | 2 B | DC 脉冲长度 |
| 0x0984 | ESC_DCACTSTS | 1 B | DC 激活状态 |
| 0x098E | ESC_DCSYNC0STS | 1 B | DC SYNC0 状态 |
| 0x098F | ESC_DCSYNC1STS | 1 B | DC SYNC1 状态 |
| 0x0990–0x0997 | ESC_DCSTCOPE | 8 B | DC 起始时间循环操作 |
| 0x0998–0x099F | ESC_DCNSYNC1P | 8 B | DC Next SYNC1 脉冲 |
| 0x09A0–0x09A3 | ESC_DCSYNC0CT | 4 B | DC SYNC0 周期时间 |
| 0x09A4–0x09A7 | ESC_DCSYNC1CT | 4 B | DC SYNC1 周期时间 |
| 0x09AE | ESC_DCLATCH0CTRL | 1 B | DC Latch0 控制 |
| 0x09AF | ESC_DCLATCH1CTRL | 1 B | DC Latch1 控制 |
| 0x09B0–0x09B7 | — | 8 B | DC Latch0 时间正边沿 |
| 0x09B8–0x09BF | — | 8 B | DC Latch0 时间负边沿 |
| 0x09C0–0x09C7 | — | 8 B | DC Latch1 时间正边沿 |
| 0x09C8–0x09CF | — | 8 B | DC Latch1 时间负边沿 |
| 0x09F0–0x09F7 | ESC_DCECATBCET | 8 B | ECAT 缓冲区更改事件时间 |
| 0x09F8–0x09FF | ESC_DCPDIBSET | 8 B | PDI 缓冲区起始事件时间 |
| 0x0A00–0x0A07 | ESC_DCPDIBCET | 8 B | PDI 缓冲区更改事件时间 |
DC 同步流程
参考时钟选择流程
同步过程四步骤
DC 同步核心步骤
步骤 1 — 传播延迟测量:主站广播写操作,从站锁存本地时间 (0x0900/0x0904)
步骤 2 — 偏移补偿:将差异写入系统时间偏移寄存器 (0x0920)
步骤 3 — 重置时间控制环路:写入速度计数器起始值 (0x0930)
步骤 4 — 漂移补偿:周期性发送 ARMW/FRMW 命令,持续校正时钟
传播延迟测量
DC 配置子状态机详解
| 状态 | 寄存器操作 | 说明 |
|---|---|---|
dc_clear_assign |
写 0x0981 = 0 |
清除旧的 DC 激活,防止残留配置干扰 |
dc_cycle |
写 0x09A0 (Sync0 周期) 写 0x09A4 (Sync1 周期) |
设置 SYNC0/SYNC1 中断的周期时间 |
dc_sync_check |
读 0x092C |
循环读取系统时间差,等待 < 10μs(最多等 5s) |
dc_start |
写 0x0990 |
计算周期启动时间 = app_time + 100ms,写入起始时间 |
dc_assign |
写 0x0981 |
写入 DC 激活值 (DCACT),启用 SYNC0/SYNC1 生成 |
从站时钟类型
| 类型 | 说明 | DC 支持 |
|---|---|---|
| Bus Shift Register | 无 DC 能力,仅转发数据帧 | 不支持 |
| Single-Cut-Through | 有 DC,但不补偿传播延迟 | 部分支持 |
| Double-Cut-Through | 有 DC,补偿传播延迟 (最精确) | 完全支持 |
同步信号 (SYNC0 / SYNC1)
SYNC0 是基础同步信号,支持 4 种模式:
| 模式 | 说明 |
|---|---|
| 循环生成 | 按周期时间 (0x09A0) 持续生成脉冲 |
| 单次触发 | 仅生成一次脉冲 |
| 循环应答 | 每次脉冲需要确认后才生成下一个 |
| 单次应答 | 单次脉冲带应答 |
SYNC1 依赖 SYNC0,可配置延迟。内部更新速率 100 MHz,同步抖动约 12 ns。脉冲长度由 0x0982 寄存器设置(>0 为周期模式)。
锁存信号 (LATCH0 / LATCH1)
LATCH0/LATCH1 支持上升沿和下降沿时间戳,采样率 100 MHz,抖动约 11 ns。
| 模式 | 说明 |
|---|---|
| 单事件模式 | 仅锁存第一个事件的时间戳 |
| 连续模式 | 持续锁存每个事件的时间戳 |
通信模式
| 模式 | 描述 |
|---|---|
| 自由运行 | 通信与应用独立运行 |
| 输出事件同步 | 应用与输出事件同步 |
| 同步信号同步 | 应用与 DC 同步信号同步 |
漂移补偿流程
每个通信周期,主站通过三个专用数据报持续校正全网时钟漂移:
| 数据报 | 类型 | 地址 | 方向 | 用途 |
|---|---|---|---|---|
ref_sync_datagram |
FPWR | 0x0910 | 主站 → 参考从站 | 将主站时间写入参考时钟从站 |
sync_datagram |
FPRD | 0x0910 | 参考从站 → 主站 | 读取参考时钟当前时间 (64 位) |
sync64_datagram |
ARMW/FRMW | 0x0910 | 参考从站 → 其他从站 | 读取参考时钟并传播到其他从站 |
漂移补偿算法流程
深入源码
源码:master/sync.h — ec_sync 结构体
master/sync.h — ec_sync_t
typedef struct {ec_slave_t *slave; // 所属从站uint16_t physical_start_address; // 物理起始地址uint16_t default_length; // 默认数据长度uint8_t control_register; // 控制寄存器值uint8_t enable; // 使能位ec_pdo_list_t pdos; // PDO 分配列表
} ec_sync_t;
源码:master/fsm_slave_config.c — DC 配置状态机
DC 配置是 Slave Config FSM 的一部分,发生在 PREOP → SAFEOP 转换过程中。相关常量:
master/fsm_slave_config.c — DC 相关常量
#define EC_DC_MAX_SYNC_DIFF_NS 10000 // 最大允许时钟偏差: 10μs
#define EC_DC_SYNC_WAIT_MS 5000 // 等待时钟同步最长: 5秒
#define EC_DC_START_OFFSET 100000000ULL // 周期启动偏移: 100ms
DC 配置状态机流程
DC 配置关键步骤
dc_clear_assign: 写入 0x0981 清除旧的 DC 激活
dc_cycle: 写入 0x09A0/0x09A4 设置 SYNC0/SYNC1 周期,写入 0x0982 设置脉冲长度
dc_sync_check: 循环读取 0x092C 等待时钟同步 (<10μs)
dc_start: 计算并写入 0x0990 周期操作启动时间
dc_assign: 写入 0x0981 激活 DC 功能 (DCACT 寄存器)
ec_master_calc_dc() 完整调用链
以下展示主站 DC 同步的完整内核调用链:
SYNC0/SYNC1 信号时序与从站采样
同步信号初始化步骤(编程指南)
N32H7x5EC 同步信号初始化流程
在 ESC 配置寄存器启用 DC SYNC 输出单元(bit2 = 1)
设置 SYNC/Latch PDI 配置寄存器(输出 SYNC0/1,配置驱动参数)
设置脉冲长度寄存器
0x0982(>0 为周期模式)将同步单元分配给 ECAT 或 PDI
设置 SYNC0 周期时间
0x09A0和 SYNC1 周期时间0x09A4设置周期操作启动时间
0x0990(应晚于当前时间)设置 DC 激活寄存器
0x0981启用 SYNC0/SYNC1 生成
SYNC0 vs SYNC1
SYNC0:主同步信号,触发所有从站的数据采样和输出更新。周期由
0x09A0寄存器设置,内部更新速率 100 MHz,抖动约 12 ns。SYNC1:辅助同步信号,依赖 SYNC0,可配置延迟。周期由
0x09A4寄存器设置,通常为 SYNC0 周期的整数倍。
DC 中断方式
DC 同步信号中断有两种方式:
| 方式 | 抖动 | 说明 |
|---|---|---|
| 映射到 AL 事件请求寄存器 | ~40 ns | 合并为单个 IRQ_A (ECAT_OPB_IRQ) |
| 直接连到微控制器中断输入 | ~12 ns | IRQ_B (ECAT_SYNC0_INT), IRQ_C (ECAT_SYNC1_INT),精度更高 |
深入了解
- ESC 从站控制器 — ESC 寄存器全景与帧处理流程
- FMMU 原理 — 过程数据如何通过 FMMU 映射到逻辑地址
- 同步管理器 — SM 缓冲区管理与通信模式
- Slave Config FSM — DC 配置状态机在从站配置流程中的位置
- 启动配置流程 — DC 同步在整体启动序列中的时序
