【原创】IgH EtherCAT主站详解(一)--EtherCAT协议、帧格式和ESC

一、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 在工业自动化协议栈中的位置

图: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 协议栈,从而实现了极高的通信效率。

帧处理流程

flowchart LR M["主站<br/>Master"] -->|"发送帧"| S1["从站 1<br/>ESC"] S1 -->|"转发"| S2["从站 2<br/>ESC"] S2 -->|"转发"| S3["从站 3<br/>ESC"] S3 -->|"帧返回"| M M -.->|"检查 WKC"| M

核心协议组成

协议 全称 用途
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 个可选状态),由低到高:

stateDiagram-v2 [*] --> Init: 上电 Init --> PreOp: 请求状态转换 PreOp --> Init: 错误/请求回退 PreOp --> SafeOp: 配置完成 SafeOp --> PreOp: 错误/请求回退 SafeOp --> Op: 数据交换就绪 Op --> SafeOp: 错误/请求回退 Init --> Bootstrap: 请求固件更新(可选) state Init { [*] --> 邮箱通信不可用 } state PreOp { [*] --> 邮箱通信可用 } state SafeOp { [*] --> 过程数据只读 邮箱通信可用: 邮箱仍可用 } state Op { [*] --> 过程数据读写 邮箱通信可用: 邮箱仍可用 } state Bootstrap { [*] --> 固件更新模式 }
状态 邮箱通信 过程数据 说明
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 部分) 分布式时钟配置流程

源码阅读建议

建议按照以下顺序阅读协议相关源码:

  1. datagram.h/c — 理解数据帧基本单元

  2. mailbox.c — 理解邮箱通信基础

  3. fsm_change.c — 理解 AL 状态转换

  4. fsm_coe.c — 理解 CoE/SDO 流程

  5. 其他 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 以太网帧字节级布局(含帧间隔、前导码、帧校验)

帧结构层次

flowchart TD WIRE["物理层帧<br/>On the Wire @ 100 Mbps"] --> IFG["帧间隔 IFG<br/>12 Bytes / 960 ns"] WIRE --> PRE["前导码 Preamble<br/>7 Bytes / 560 ns"] WIRE --> SFD["帧起始定界符 SFD<br/>1 Byte / 80 ns"] WIRE --> ETH["以太网帧<br/>64~1518 Bytes"] ETH --> HDR["帧头<br/>Dest MAC 6B + Src MAC 6B + EtherType 2B"] ETH --> PAY["EtherCAT 数据<br/>44~1498 Bytes"] ETH --> FCS["FCS 帧校验序列<br/>4 Bytes / CRC-32"] PAY --> EHDR["EtherCAT Header<br/>2 Bytes"] PAY --> DG["Datagram × N<br/>可串联多个"] DG --> ITEM["每个 Datagram:<br/>Header 10B + Data + WKC 2B"]

技术详情

物理层帧结构与传输时序

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

三种寻址模式

flowchart LR subgraph Auto["Auto-increment (APxx)"] A1["ADP(2B): 递增计数<br/>从0开始递减"] A2["ADO(2B): ESC 内存地址"] end subgraph Configured["Configured (FPxx)"] C1["ADP(2B): 站地址<br/>固定配置地址"] C2["ADO(2B): ESC 内存地址"] end subgraph Logical["Logical (Lxx)"] L1["4 Bytes: 逻辑地址<br/>FMMU 自动映射"] end

WKC (Working Counter) 机制

多 Datagram 串联排列与 WKC 机制

图:多个 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 Read
    EC_DATAGRAM_APWR = 0x02,  // Auto-increment Physical Write
    EC_DATAGRAM_APRW = 0x03,  // Auto-increment Physical ReadWrite
    EC_DATAGRAM_FPRD = 0x04,  // Configured Address Physical Read
    EC_DATAGRAM_FPWR = 0x05,  // Configured Address Physical Write
    EC_DATAGRAM_FPRW = 0x06,  // Configured Address Physical ReadWrite
    EC_DATAGRAM_BRD  = 0x07,  // Broadcast Read
    EC_DATAGRAM_BWR  = 0x08,  // Broadcast Write
    EC_DATAGRAM_BRW  = 0x09,  // Broadcast ReadWrite
    EC_DATAGRAM_LRD  = 0x0A,  // Logical Read
    EC_DATAGRAM_LWR  = 0x0B,  // Logical Write
    EC_DATAGRAM_LRW  = 0x0C,  // Logical ReadWrite
    EC_DATAGRAM_ARMW = 0x0D,  // Auto-increment Read Multiple Write
    EC_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 内部功能模块

flowchart LR subgraph "ESC 内部结构" P0["端口 0<br/>MII → PHY"] P1["端口 1<br/>MII → PHY"] EPU["EPU<br/>EtherCAT 处理单元"] FMMU["FMMU × 8<br/>逻辑→物理地址映射"] SM["同步管理器 × 8<br/>缓冲区管理"] DC["分布式时钟 (DC)<br/>64 位时间同步"] PD_RAM["过程数据 RAM<br/>8 KB"] EEPROM["SII EEPROM<br/>I2C 接口"] MON["监控单元<br/>错误计数器 + 看门狗"] PHY_MGMT["PHY 管理<br/>MII 管理接口"] PDI_IF["PDI 接口<br/>AHB-to-OPB 桥"] end P0 --> EPU P1 --> EPU EPU --> FMMU EPU --> SM FMMU --> PD_RAM SM --> PD_RAM EPU --> DC EPU --> MON EPU --> PHY_MGMT PD_RAM <--> PDI_IF EEPROM <--> EPU

ESC 内存映射全景

ESC 寄存器内存映射全景图

图:N32H7x5EC ESC 内存映射 (0x0000–0x2FFF)


技术详情

ESC 帧处理流程

ESC 使用标准 IEEE 802.3 以太网帧,EtherType = 0x88A4。ESC 无 MAC/IP 地址,可处理任意 MAC/IP 的 EtherCAT 帧。帧处理顺序:端口 0 → EPU → 端口 1。帧不存储,通过时即读写,转发延迟最小化。

flowchart TD A["接收 EtherCAT 帧<br/>(端口 0 或端口 1)"] --> B{"EtherType = 0x88A4?"} B -->|否| C{"DL 控制<br/>转发非 ECAT 帧?"} C -->|是| Z["转发标准以太网帧"] C -->|否| Z2["丢弃帧"] B -->|是| D["解析 EtherCAT Header<br/>Length + Type(=0x1)"] D --> E["遍历每个 Datagram"] E --> F{"寻址模式?"} F -->|Auto-inc| G["地址计数器递减<br/>为0时匹配"] F -->|Configured| H["匹配配置站地址"] F -->|Logical| I["FMMU 地址匹配"] F -->|Broadcast| J["所有从站执行"] G --> K{"地址匹配?"} H --> K I --> K J --> K K -->|是| L["执行读/写操作<br/>更新 WKC<br/>(读+1, 写+2, 读写+3)"] K -->|否| M["透传到下一从站"] L --> M M --> N{"More 标志=1?"} N -->|是| E N -->|否| O["转发帧到下一端口"] style A fill:#ebf8ff,stroke:#90cdf4 style L fill:#f0fff4,stroke:#9ae6b4 style Z2 fill:#fff5f5,stroke:#feb2b2

环路控制

每个端口可处于打开或关闭状态,支持四种环路控制模式:

模式 描述
手动打开 端口始终开启,即使无链路
手动关闭 端口始终关闭
自动 根据链路状态自动开关
自动关闭 链路丢失时关闭,但不自动打开

⚠ 注意

若所有端口均关闭,端口 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)

深入了解

深入了解

posted @ 2026-04-14 21:00  沐多  阅读(3056)  评论(0)    收藏  举报