文档

ECAN-Lite 文档

在线查阅产品文档、快速入门与协议资料。

产品介绍

ETHERCAT TO CAN / CAN FD GATEWAY
ECAN-Lite 产品介绍 V2.2
让 CAN 设备自然接入 EtherCAT 系统
ECAN-Lite 是面向工业现场的 EtherCAT 转 CAN / CAN FD 网关。 它对上是标准 EtherCAT 从站,对下连接多路 CAN 总线, 让伺服、传感器、执行器和测试设备更容易进入统一的实时控制网络。
标准 EtherCAT 从站 4 路 CAN / CAN FD 动态 PDO CoE 配置 FoE 升级 IgH demo 示例包 文档版本 V2.2

解决什么问题

很多现场设备仍然使用 CAN 或 CAN FD,但主控系统正在向 EtherCAT 集中。ECAN_Lite 的价值,就是把两边连接起来:

EtherCAT 主站
PLC / Linux 主站
周期 PDO 控制
ECAN_Lite
PDO 打包转换
SDO 配置维护
CAN 设备
伺服 / I/O / 传感器
CANopen 或私有协议
主站只需要按 EtherCAT 的方式交换 PDO 数据,ECAN_Lite 负责把这些数据转换成 CAN 帧,并把 CAN 总线收到的数据再送回 EtherCAT。

数据如何流动

发送
方向
主站写 PDO
周期任务写入 RxPDO
网关解析
识别通道、帧 ID 和数据
CAN 发送
按通道输出到 CAN 总线
设备响应
伺服、I/O、传感器执行动作
接收
方向
CAN 收帧
多通道采集现场数据
统一打包
整理成 TxPDO 数据区
主站读取
周期任务获得最新数据
诊断分析
结合状态、版本和错误计数排查

核心能力

多通道 CAN 扩展

一台设备连接多路 CAN / CAN FD,总线分组更清楚,控制柜布线更简洁。

动态 PDO 承载

PDO 容量可按项目规模调整,小系统轻量运行,多设备场景也能批量承载。

周期化数据收发

CAN 帧可以跟随 EtherCAT 周期组织,适合控制、采集和自动化测试。

现场维护友好

支持 SDO 参数配置、版本读取和 FoE 固件升级,减少拆机和单独烧录。

主站示例完整

提供 IgH demo,覆盖扫描、PDO 收发、周期测试、FoE OTA 和 CiA402 控制参考。

问题定位更快

保留状态字、错误统计、版本读取和诊断路径,现场调试不需要从零摸索。

规格速览

EtherCAT 接入

2 端口 100Mbps EtherCAT,从站侧支持 CoE 参数配置和 FoE 固件升级。

4 路 MCAN 总线

每路支持 CAN 2.0A/B 与 CAN FD ISO,CAN FD 单帧数据域最大 64 字节。

大容量 PDO

PDO 按 128B 粒度扩展,Classic CAN 推荐 384B 起步,CAN FD 容量验证推荐 1024B 起步,最大可配置到 3072B/方向。

实时发送增强

支持直接发送与时间戳/预约发送,RxPDO full64 格式可用于 SYNC0 相位预约。

高速 CAN FD 支持

TDC 默认开启,5Mbit/s 及以上数据段强制开启,适合高速 CAN FD 现场。

配置可持久化

关键参数保存到 Flash 配置镜像,并通过 CRC32 校验,减少掉电后重复配置。

类别 摘要
主控平台 HPMicro HPM5E00 系列 RISC-V MCU,CPU 400MHz,mchtmr 24MHz
EtherCAT 2 端口 100Mbps,支持 CoE/FoE
CAN / CAN FD 4 路 MCAN,支持 CAN 2.0A/B 和 CAN FD ISO,最大 64B 数据域
PDO 能力 384B/1024B 常用起步配置,最大 3072B/方向,128B 粒度配置
PDO 封装 固定头部 24B,CAN 帧封装包含控制字、CAN ID、可选时间戳和数据
实时特性 支持直接发送、delta16/delta32/full64 时间戳封装和 SYNC0 相位预约
维护能力 SDO 参数配置、Flash 参数持久化、FoE 固件升级

机器人内部通信与调试

机器人系统内部往往同时存在关节驱动、末端工具、力矩传感器、夹爪、IO 模块和安全部件。它们可能分布在不同 CAN 总线上,也可能使用 CANopen 或厂商私有协议。ECAN_Lite 可以作为机器人控制器和体内 CAN 网络之间的实时转换层,把分散的 CAN 数据统一汇入 EtherCAT 主站。

机器人控制器
EtherCAT 周期任务
运动控制与状态采集
ECAN_Lite
多路 CAN 汇聚
周期打包与转发
体内 CAN 网络
关节 / 夹爪 / 传感器
末端工具与扩展模块
体内总线集中接入

多路 CAN / CAN FD 可以按机械臂关节、末端执行器、传感器或测试接口分组,主站侧仍按统一 EtherCAT 从站访问。

控制与诊断同链路

同一条 EtherCAT 链路既能下发控制帧,也能回收状态帧、错误帧和调试数据,减少额外调试线缆。

适合样机调试

研发阶段可以快速观察 CAN 帧、节点状态、版本信息和错误计数,方便定位关节、线束和协议问题。

方便量产维护

产线和现场可通过主站脚本完成扫描、配置、收发验证和 FoE OTA,提升批量测试与固件升级效率。

典型示例:机器狗主控运行 Linux 和 IgH EtherCAT 主站,主控通过 EtherCAT 周期任务连接 ECAN_Lite,再由 ECAN_Lite 转换到多路 CAN / CAN FD,总线下挂关节电机、足端传感器或电源管理模块。这样主控软件仍然按 EtherCAT 的周期控制模型开发,同时保留 CAN 电机和 CAN 传感器的成熟生态。
机器狗
示例
Linux 主控
运行 IgH 主站
控制任务统一调度
EtherCAT
周期 PDO
低延迟主干网络
ECAN_Lite
EtherCAT 转 CAN
多通道分组转发
CAN 电机
关节驱动
传感器与扩展模块

适合哪些应用

应用场景 ECAN_Lite 带来的变化
CANopen 伺服接入 EtherCAT 用 EtherCAT 周期任务集中控制多个 CANopen 节点
机器人本体内部通信 将关节、末端工具、传感器和扩展模块的 CAN 数据汇入机器人控制器
机器狗 / 移动机器人控制 Linux 主控运行 IgH 主站,经 EtherCAT 转 CAN 控制关节 CAN 电机
机器人样机调试 通过统一主站链路观察 CAN 帧、节点状态、错误计数和版本信息
多路 CAN 数据采集 将分散的 CAN 总线数据汇入统一主站
设备产线测试 用脚本批量完成配置、收发、校验和升级
旧 CAN 设备升级改造 保留原有设备协议,降低系统迁移成本
控制柜接口扩展 减少主机 CAN 接口数量,让系统结构更清晰

为什么更容易集成

主站侧简单

按 EtherCAT 从站配置 PDO、SDO 和 FoE,不需要重新设计一套专用通讯框架。

设备侧灵活

CAN 总线可以连接 CANopen 设备,也可以承载客户已有的私有 CAN 协议。

数据路径清晰

主站写 RxPDO 发送 CAN,主站读 TxPDO 接收 CAN,方向明确,排查方便。

可从测试走向量产

同一套机制可用于实验验证、产线测试和现场部署,减少重复开发。

交付特色

IgH 主站 demo

提供可直接编译运行的 Linux / IgH 示例,帮助客户快速验证单轴、多轴和周期收发。

预约发送测试

示例中包含直接发送与预约发送对比,便于评估 EtherCAT 转 CAN 的实时性。

FoE OTA 示例

主站侧可通过 FoE 更新固件,适合现场维护、版本回归和批量升级。

配置文档清晰

技术手册提供 PDO 打包格式、SDO 配置流程、对象字典和常见问题排查。

典型工作流程

1
扫描从站
确认 ECAN_Lite 在线并读取版本。
2
配置能力
设置 PDO 大小、CAN 位率和通道模式。
3
写入 RxPDO
主站把待发送 CAN 帧放入周期数据。
4
读取 TxPDO
主站获取 CAN 总线回传的数据。
5
维护升级
通过 FoE OTA 更新固件并确认版本。

产品文档

ECAN-Lite 技术手册 V2.2
EtherCAT 转 4 路 CAN/CAN FD 动态 PDO 网关
项目 内容
文档名称 ECAN-Lite 技术手册 V2.2
文档版本 V2.2
日期 2026-05
适用对象 ECAN-Lite,EtherCAT CoE 从站,4 路 HPM MCAN
主站示例 IgH EtherCAT Master 示例包
推荐 PDO Classic CAN 推荐 384B 起步,CAN FD 容量验证推荐 1024B 起步;实时周期边界需按 15.6.1 验证

目录与阅读路径

本手册面向需要集成 ECAN-Lite 的用户,而不是只描述内部实现。读者应能根据本文完成以下闭环:识别产品能力、配置 EtherCAT PDO/SDO、进入 OP、在 RxPDO 中下发 CAN/CAN FD 帧、从 TxPDO 中读取 CAN/CAN FD 帧,并在异常时定位问题。

本手册按“先集成、再实现、再诊断”的顺序组织。前半部分说明 EtherCAT/PDO/SDO 协议边界,后半部分说明 IgH 示例、二次开发和现场排查。

从零到收发 CAN 帧

# 用户要完成的事 手册入口 完成标志
1 确认设备能力、版本、PDO 上限 2、3、13.8 读到 0xF000 版本、能力位和 PDO 最大倍数
2 在主站中选择连续 PDO chunk 5.1、5.2、5.4 SM2/SM3 长度等于 128 * N,assignment 选择前 N 个 chunk
3 写入 PDO profile 和 MCAN 通道 SDO 5.4.3、13.2、13.4 0x8010/0x8011:02 = 00x9000..0x9003 状态正常
4 进入 OP 并周期交换过程数据 14、15.5 EtherCAT working counter 正常,domain complete
5 在 RxPDO offset 24 写 CAN_FRAME 5.4.4、6、8 CAN 总线上看到主站下发的帧
6 从 TxPDO offset 24 解析 CAN_FRAME/TX_RESULT 5.4.4、6、8、10 主站程序收到 CAN 总线回传帧或发送结果
7 异常时按状态字段和 SDO 计数器定位 7、13.2.4、13.2.5、13.5、16 能区分 PDO 解析、CAN bus-off、通道未启用和 OP 异常

按任务阅读

任务 优先阅读 目标
快速理解设备能力 1、2、3、4 理解 ECAN-Lite 的数据方向、PDO 尺寸和通道模型
配置 TwinCAT / CODESYS / Acontis / 自研主站 5.1、5.2、5.4、5.4.3 选择 PDO chunk,写启动 SDO,完成 profile apply 和 MCAN 配置
编写主站 PDO 打包/解析 5.1.1、6、8、9、10、11 拼接连续 PDO buffer,生成 CAN_FRAME,解析 TxPDO 和 TX_RESULT
查询和配置 SDO 对象 13.1..13.8 0x8010/0x80110x8001..0x80040x8021..0x80240x90000x90110x9020..0x90230xF000
使用 IgH demo 做 bring-up 15.2、15.3、15.6 构建并运行 demo,完成单轴/多轴或 CAN 收发验证
不跑 demo,但复用 IgH API 15.1、15.4、15.5 选择 Adapter、MCAN Port 或 CiA402 层,并接入客户应用
现场排查问题 16、13.2.4、13.2.5、13.5、13.8 定位 OP 异常、PDO 解析错误、CAN 总线错误、数据面拥塞和版本能力问题

章节分工

章节 分工 不负责
1..4 产品定位、基础概念、系统架构 不展开对象字典细节
5 EtherCAT PDO 映射、PDO 大小、第三方主站配置 不解释每个帧字段
6..12 PDO 字节流格式、帧包、CRC、TX_RESULT、预算策略 不规定具体主站软件界面
13 CoE SDO 对象字典、能力对象、维护命令 不描述 IgH API 调用细节
14 通用启动流程和配置建议 不绑定某一个主站实现
15 IgH 示例包、API 层级、FoE OTA 和 demo 使用 不替代 5.4 的第三方主站配置
16..19 调试诊断、验证数据、规格和修订记录 不作为协议定义入口

完全不使用 IgH 时,优先阅读 5.45.4.3。使用 IgH 主站库但不直接运行本仓库 demo 时,优先阅读 15.415.5


1. 产品定位

ECAN-Lite 是一款 EtherCAT 到 CAN/CAN FD 的实时网关模块。设备作为 EtherCAT 从站运行,主站通过 RxPDO 下发 CAN/CAN FD 发送请求,设备通过 TxPDO 上传 CAN/CAN FD 接收帧、发送结果和紧凑通道状态。

本版本采用新的动态 PDO 协议:TxPDO 和 RxPDO 均以 128B * N 为单位独立配置,N=1..24,单方向最大 3072B。PDO 内容不再采用固定通道固定槽的旧布局,而是统一使用“两层结构”:

text
FixedPdoFrameHeader[24B] + FramePacketStream[ActivePDOBytes - 24]

24B 固定头部用于版本/头长、双序号提交、帧区长度、payload CRC16、布局标识、通道掩码、帧数量、溢出计数和 4 路压缩状态;后续帧区是连续的 CAN/CAN FD 帧封装包。每个帧包以 2B 控制字自描述后续 CAN ID、时间戳和数据长度,因此主站解析不依赖旧的固定槽位。


2. 核心特性

项目 说明
EtherCAT 2 端口从站,100Mbps,CoE,FoE
CAN 通道 4 路独立 MCAN,控制字 CH 字段预留 3bit,可表达 0..7
CAN 协议 CAN 2.0A / CAN 2.0B / CAN FD ISO
CAN 数据长度 Classic CAN 0..8B,CAN FD 0..64B,按 DLC 动态编码
PDO 大小 TxPDO/RxPDO 独立配置,128B * NN=1..24;Classic CAN 推荐 N=3 即 384B 起步,CAN FD 容量验证推荐 N=8 即 1024B 起步,实时周期边界需按物理机实测选择
PDO 上限 3072B/方向,帧封装区 3048B
PDO 结构 24B 固定头部 + 连续帧封装区,128B chunk 只作为 EtherCAT 映射单位
多通道复用 多路 CAN 共用同一方向帧区,按预算策略共享剩余空间
时间戳 每帧可选,支持 off / delta16,delta32/full64 作为能力扩展
预约发送 RxPDO TSF_FULL64 format=1 可将 CAN 帧预约到下一次 SYNC0 周期内的指定相位
TDC CAN FD 默认开启;5M 及以上数据段强制开启;Offset/Filter 默认 0 自动计算,非 0 支持手动覆盖
诊断 PDO 快速状态 + SDO 详细状态;PDO 解析错误和溢出有计数记录
配置 SDO 在线配置,支持参数持久化、设备维护、FoE

3. 方向定义

名称 EtherCAT 方向 主站视角 设备语义
TxPDO / Input PDO 从站 -> 主站 主站读取输入过程数据 上传 CAN/CAN FD 接收帧、TX_RESULT、压缩通道状态
RxPDO / Output PDO 主站 -> 从站 主站写入输出过程数据 下发 CAN/CAN FD 发送请求

TxPDO 与 RxPDO 是完全独立的方向。每个方向可独立选择 PDO 大小倍数、通道掩码、封装 profile、预算策略和方向选项。通道开启与 PDO 大小是两个正交维度:关闭某个 CAN 通道不会改变 SM2/SM3 长度,只会改变 active channel mask 和调度预算。

理解本文时可以把协议分成三层:

层级 主站需要做什么 本文入口
EtherCAT 映射层 选择前 N 个 128B PDO chunk,得到连续 RxPDO/TxPDO buffer 第 5 章
PDO 帧流层 在 offset 0 写/读 24B 固定头部,在 offset 24 开始写/读 CAN_FRAME 第 6..12 章
配置与诊断层 通过 SDO 配置 PDO profile、MCAN 通道、能力和状态对象 第 13..16 章

如果只想先跑通收发,可以先按第 5.4.3 和 5.4.4.1 完成一帧下发;当需要自己实现解析库时,再回到第 6..12 章逐字段阅读。

3.1 文档标记说明

本文后续表格使用以下标记:

标记 含义
RO Read Only,只读。主站只能通过 SDO 读取,写入无效或会被拒绝。
RW Read Write,读写。主站可通过 SDO 写入配置,也可读取回显或当前值。
WO Write Only,只写命令。主站写入触发动作,读取值不作为状态依据。
M2S Master to Slave,主站给从站。常见于 RxPDO/SM2 Output 或配置 SDO 写入。
S2M Slave to Master,从站给主站。常见于 TxPDO/SM3 Input 或状态/能力 SDO 读取。
CFG 配置或命令路径,通常通过 CoE SDO 完成,不属于周期 PDO 数据流。

PDO 表格中的 访问 指主站对过程数据的访问方式:RxPDO/SM2 为主站写,从站读;TxPDO/SM3 为从站写,主站读。SDO 表格中的 访问 指主站通过 CoE 对对象字典子项的访问属性。


4. 系统架构

text
EtherCAT Master
  |
  |  SM2 RxPDO: Fixed Header + FramePacketStream
  |  SM3 TxPDO: Fixed Header + FramePacketStream
  v
+------------------------------+
| ECAN-Lite EtherCAT Slave |
|  SSC + CoE + FoE             |
|  Dynamic PDO Parser/Packer   |
|  Byte Budget Scheduler       |
+-----+-----+-----+-----+------+
      |     |     |     |
     CAN0  CAN1  CAN2  CAN3

5. EtherCAT PDO 映射与大小

5.1 128B Chunk 映射

PDO 映射按 128B chunk 拼接。每个 chunk 在对象字典中拆成 8 个 STRING(16) 映射单元,以避免 PDO mapping entry 的 bit length 限制。

text
RxPDO chunk maps: 0x1600..0x1617
TxPDO chunk maps: 0x1A00..0x1A17
SM2 assignment:   0x1C12 选择前 N 个 RxPDO chunk
SM3 assignment:   0x1C13 选择前 N 个 TxPDO chunk

chunk 是 EtherCAT 映射和长度选择单位,不是协议解析层。FramePacketStream 可以跨 128B chunk 边界,接收端只按固定头部中的 payload_len 解析有效帧区。

5.1.1 多个 chunk 在主站侧如何拼接

主站侧不要把 0x1600..0x1617 / 0x1A00..0x1A17 当成多段独立协议解析。它们只是为了适配 EtherCAT PDO mapping 限制而拆出的 128B 映射块。应用层应把同一方向的前 N 个 chunk 按 assignment 顺序拼成一个连续 byte buffer:

text
RxPDO/SM2 output buffer:
  chunk0[128B] + chunk1[128B] + ... + chunkN-1[128B]
  其中 ... 表示省略中间连续 chunk,顺序和大小均按 128B 递推

TxPDO/SM3 input buffer:
  chunk0[128B] + chunk1[128B] + ... + chunkN-1[128B]
  其中 ... 表示省略中间连续 chunk,顺序和大小均按 128B 递推

每个 128B chunk 又由 8 个 STRING(16) 映射单元组成。主站如果把它们暴露成多个变量,应用需要按以下顺序复制:

text
for chunk = 0 .. N-1:
  for unit = 0 .. 7:
    dst_offset = chunk * 128 + unit * 16
    copy 16 bytes to/from process image entry

下面表格完整展开 chunk=0 的 8 个映射单元,并用省略行表示后续 chunk 按相同规律递推。完整关系以随后公式为准。

方向 数据流 主站访问 chunk unit PDO map 数据对象 连续 buffer offset
RxPDO / SM2 Output M2S Write 0 0 0x1600 0x7000 0
RxPDO / SM2 Output M2S Write 0 1 0x1600 0x7010 16
RxPDO / SM2 Output M2S Write 0 2 0x1600 0x7020 32
RxPDO / SM2 Output M2S Write 0 3 0x1600 0x7030 48
RxPDO / SM2 Output M2S Write 0 4 0x1600 0x7040 64
RxPDO / SM2 Output M2S Write 0 5 0x1600 0x7050 80
RxPDO / SM2 Output M2S Write 0 6 0x1600 0x7060 96
RxPDO / SM2 Output M2S Write 0 7 0x1600 0x7070 112
RxPDO / SM2 Output M2S Write 省略 省略 省略 省略 省略:后续 chunk 按相同规律递推
RxPDO / SM2 Output M2S Write 1 0 0x1601 0x7080 128
TxPDO / SM3 Input S2M Read 0 0 0x1A00 0x6000 0
TxPDO / SM3 Input S2M Read 0 1 0x1A00 0x6010 16
TxPDO / SM3 Input S2M Read 0 2 0x1A00 0x6020 32
TxPDO / SM3 Input S2M Read 0 3 0x1A00 0x6030 48
TxPDO / SM3 Input S2M Read 0 4 0x1A00 0x6040 64
TxPDO / SM3 Input S2M Read 0 5 0x1A00 0x6050 80
TxPDO / SM3 Input S2M Read 0 6 0x1A00 0x6060 96
TxPDO / SM3 Input S2M Read 0 7 0x1A00 0x6070 112
TxPDO / SM3 Input S2M Read 省略 省略 省略 省略 省略:后续 chunk 按相同规律递推
TxPDO / SM3 Input S2M Read 1 0 0x1A01 0x6080 128

完整映射规律:

方向 数据流 主站访问 chunk c unit u PDO map PDO map subindex 数据对象 连续 buffer offset
RxPDO / SM2 Output M2S Write 0..N-1 0..7 0x1600 + c u + 1 0x7000 + c * 0x80 + u * 0x10 c * 128 + u * 16
TxPDO / SM3 Input S2M Read 0..N-1 0..7 0x1A00 + c u + 1 0x6000 + c * 0x80 + u * 0x10 c * 128 + u * 16

通用公式:

text
unit_index = chunk * 8 + unit
offset     = unit_index * 16

RxPDO 数据对象 index = 0x7000 + unit_index * 0x10
TxPDO 数据对象 index = 0x6000 + unit_index * 0x10

因此 chunk=1 时并不只有 unit=0。例如 RxPDO 0x1601 实际包含 0x7080, 0x7090, ..., 0x70F0 八个 16B 单元,其中 ... 表示省略中间按 0x10 递增的对象;TxPDO 0x1A01 实际包含 0x6080, 0x6090, ..., 0x60F0 八个 16B 单元,其中 ... 同样表示省略中间按 0x10 递增的对象。

例如 N=3 时,每个方向的连续 buffer 为 384B:

text
chunk0: offset   0..127
chunk1: offset 128..255
chunk2: offset 256..383

固定 24B 头部位于连续 buffer 的 offset 0。帧封装区从 offset 24 开始,到 128*N-1 结束。CAN_FRAME / TX_RESULT 包允许跨 chunk 边界,主站解析时只应根据固定头部中的 payload_len 和 CRC 判断有效区域,不应在 128B 边界重新开始解析。

在 TwinCAT、CODESYS 或自研主站中,如果工具支持将 PDO 映射直接映射为连续 Byte Array,推荐直接建立 ARRAY[0..128*N-1] OF BYTE。如果工具只能把每个 STRING(16) 暴露为单独变量,则按上面的 offset 公式在应用层拼接和拆分。

5.2 PDO 大小倍数

text
ActivePDOBytes = 128 * PdoSizeMultiplier
ActiveFrameAreaBytes = ActivePDOBytes - 24
PdoSizeMultiplier: 1..24
N PDO 字节数 帧封装区 建议用途
1 128 104 最小 PDO,单通道低速诊断、少量 classic CAN
2 256 232 轻量 classic CAN 诊断
3 384 360 Classic CAN bring-up 推荐档,CiA402 demo 默认值
4 512 488 多路 classic CAN 或轻量 CAN FD
6 768 744 中等负载 classic CAN,轻量 CAN FD 过渡档
8 1024 1000 CAN FD 通用推荐起步值
12 1536 1512 高负载 CAN FD
16 2048 2024 高余量场景
24 3072 3048 最大突发余量

推荐值应按 CAN 模式和负载选择,而不是统一使用同一个 N:Classic CAN 单帧最多 8B,常规电机控制、CANopen/CiA402 和少量 classic CAN 收发建议从 N=3 起步;CAN FD 单帧最多 64B,四通道或存在突发时建议从 N=8 起步。N=1/N=2 适合验证最小 PDO 能力、单通道低速诊断或少量 classic CAN。最大值为 N=24,即 3072B/方向。

5.3 SII/EEPROM SyncManager 要求

当前产品 EEPROM/SII 应保持大 PDO 单缓冲布局:

SM 方向 数据流 主站访问 起始地址 默认大小 ControlByte
SM2 Outputs / RxPDO M2S Write 0x1100 3072 0x66
SM3 Inputs / TxPDO S2M Read 0x1D00 3072 0x22

主站实际使用的 PDO 长度由 0x1C12/0x1C13 assignment 选择前 N 个 chunk 决定,并必须与 0x8010/0x8011 的 active profile 保持一致。

5.4 不使用 IgH:第三方 EtherCAT 主站配置 PDO

如果客户不使用 IgH 示例包 demo,而是使用 TwinCAT、CODESYS、Acontis 或自研 EtherCAT 主站,需要在主站工程中显式完成 PDO assignment、PDO profile apply 和 MCAN 通道配置。IgH 示例包 demo 中的自动配置,本质上对应下面的通用 CoE 配置流程。

5.4.1 选择 PDO 大小

ECAN-Lite 的 PDO 长度由 128B chunk 数量 N 决定:

text
ActivePDOBytes = 128 * N
N = 1..24

主站必须为两个方向分别选择前 N 个 chunk:

方向 数据流 主站访问 SyncManager Assignment PDO map 范围 说明
RxPDO / Output M2S Write SM2 0x1C12 0x1600..0x1617 主站下发 CAN/CAN FD 发送请求
TxPDO / Input S2M Read SM3 0x1C13 0x1A00..0x1A17 从站上传 CAN/CAN FD 接收帧、发送结果和通道状态

示例:选择 N=3,即 SM2/SM3 均为 384B:

text
0x1C12:00 = 0
0x1C12:01 = 0x1600
0x1C12:02 = 0x1601
0x1C12:03 = 0x1602
0x1C12:00 = 3

0x1C13:00 = 0
0x1C13:01 = 0x1A00
0x1C13:02 = 0x1A01
0x1C13:03 = 0x1A02
0x1C13:00 = 3

示例:选择 N=8,即 SM2/SM3 均为 1024B:

text
0x1C12:00 = 0
0x1C12:01..08 = 0x1600..0x1607
0x1C12:00 = 8

0x1C13:00 = 0
0x1C13:01..08 = 0x1A00..0x1A07
0x1C13:00 = 8

这里的 01..080x1600..0x1607 / 0x1A00..0x1A07 表示连续范围,不是跳选;等价于逐项写入 :01:08 的 8 个 assignment 子项。

主站工程中的 SM2/SM3 过程数据长度应等于 128 * N。如果主站导入 ESI 后需要手动选择 PDO,请确保选择的是连续的前 N 个 chunk,不要跳选或重排 chunk。

5.4.2 应用固件 PDO profile

0x1C12/0x1C13 决定主站实际映射长度;0x8010/0x8011 决定固件内部 active profile。两边必须一致,否则固件会拒绝应用或继续保持旧 profile。

对象 控制方向 数据流 访问 关键子项
0x8010 TxPDO / Input / 从站上传方向 S2M RW/RO :03 PDO size multiplier:04 Channel mask:01 Apply command
0x8011 RxPDO / Output / 主站下发方向 M2S RW/RO :03 PDO size multiplier:04 Channel mask:01 Apply command

推荐 startup SDO 顺序:

text
1. 从站保持在 INIT/PREOP/SAFEOP,不要在 OP 中修改 PDO 大小
2. 配置 0x1C12/0x1C13,选择前 N 个 chunk
3. 写 0x8010:03 = N
4. 写 0x8011:03 = N
5. 写 0x8010:04 = tx_channel_mask
6. 写 0x8011:04 = rx_channel_mask
7. 写 0x8010:01 = 1,应用 TxPDO profile
8. 写 0x8011:01 = 1,应用 RxPDO profile
9. 读取 0x8010/0x8011 的 active readback,确认长度和 layout
10. 配置 0x8001..0x8004 MCAN 通道参数并 apply
11. 进入 OP,运行期通过 PDO 收发 CAN/CAN FD 帧

active readback 建议至少检查:

子项 预期
0x8010/0x8011:02 Status 0=OK
0x8010/0x8011:09 Active PDO bytes 128 * N
0x8010/0x8011:10 Active frame area bytes 128 * N - 24
0x8010/0x8011:11 Active layout CRC 主站解析库或工程记录的 layout CRC 一致
0x8010/0x8011:12 Active profile word 与期望的 N、channel mask、profile 组合一致

5.4.3 完整初始化流程示例:不使用 IgH / 第三方主站

本节给出一套可以直接移植到 TwinCAT Startup SDO、CODESYS 启动参数、Acontis 或自研主站的配置流程。示例目标为:

项目 示例值 作用
PDO 大小 Classic CAN 建议 N=3 起步;CAN FD 建议 N=8 起步 N=3 为每方向 384BN=8 为每方向 1024B
启用 CAN 通道 0x0F CAN0..CAN3 全部参与 PDO 收发
PDO profile 0 compact inline,variable DLC,无时间戳
预算策略 0 Balanced,默认通用策略
方向选项 0x00 不启用 TX_RESULT、4 字节对齐、STREAM_CRC32
CAN 模式 CAN FD ISO 仲裁段 1Mbps,数据段 5Mbps,BRS 由 CAN_FRAME 控制

如果只做保守 bring-up,建议把 N 改为 3,把 channel mask 改为 0x01,只启用 CAN0;若需要验证最小 PDO 能力,可使用 N=1

Option flags0x8010:07 (0x07) 和 0x8011:07 (0x07) 的按位配置值。常用值如下,完整 bit 表见第 9.1 节:

写入值 含义 常见用途
0x00 所有方向选项关闭 默认 bring-up,最少开销
0x01 TX_RESULT_ENABLE 仅用于 0x8010:07 (0x07),TxPDO 上传发送结果
0x02 ALIGN_4_ENABLE 帧包按 4 字节对齐
0x03 TX_RESULT + ALIGN4 仅 TxPDO 方向常用;RxPDO 不使用 TX_RESULT

阶段 A:读取设备能力,决定主站配置上限。

步骤 SDO 访问 示例判断 作用
A1 0xF000:02 (0x02) Channel count RO >= 4 确认通道数量
A2 0xF000:10 (0x0A) PDO size multiplier min RO <= 8 确认最小 N 支持
A3 0xF000:11 (0x0B) PDO size multiplier max RO >= 8 确认目标 N 支持
A4 0xF000:12 (0x0C) Encapsulation profile mask RO bit0 = 1 确认 profile 0 支持
A5 0xF000:15 (0x0F) PDO option flags mask RO 需要 ALIGN4 时检查 bit1 确认可开启的方向选项
A6 0xF000:17 (0x11) PDO size unit bytes RO 128 确认 chunk 单位
A7 0xF000:18 (0x12) PDO fixed header bytes RO 24 确认固定头部长度

阶段 B:配置 EtherCAT PDO assignment。主站在 PREOP/SAFEOP 阶段写入,选择连续前 N 个 PDO chunk。

步骤 SDO 写入值 作用
B1 0x1C12:00 (0x00) 0 清空 RxPDO / SM2 assignment
B2 0x1C12:01..08 (0x01..0x08) 0x1600..0x1607 选择前 8 个 RxPDO chunk
B3 0x1C12:00 (0x00) 8 生效 RxPDO / SM2 assignment
B4 0x1C13:00 (0x00) 0 清空 TxPDO / SM3 assignment
B5 0x1C13:01..08 (0x01..0x08) 0x1A00..0x1A07 选择前 8 个 TxPDO chunk
B6 0x1C13:00 (0x00) 8 生效 TxPDO / SM3 assignment

0x1C12:01..08 = 0x1600..0x1607 表示连续写入 8 个子项,不是一次写范围。若 N=3,则只写 :01=0x1600:02=0x1601:03=0x1602,最后 :00=3;TxPDO 同理写 0x1A00..0x1A02

阶段 C:配置固件 PDO profile。0x8010 控制 TxPDO/SM3 上传方向,0x8011 控制 RxPDO/SM2 下发方向。两边都要配置,且 PDO size multiplier 必须与阶段 B 的 assignment 数量一致。

步骤 SDO 写入值 作用
C1 0x8010:03 (0x03) 8 TxPDO active PDO 大小为 8 * 128B
C2 0x8010:04 (0x04) 0x0F TxPDO 上传 CAN0..CAN3 的接收帧和状态
C3 0x8010:05 (0x05) 0 TxPDO 使用 profile 0
C4 0x8010:06 (0x06) 0 TxPDO 使用 Balanced 预算
C5 0x8010:07 (0x07) 0x00 TxPDO 方向选项关闭
C6 0x8010:01 (0x01) 1 apply TxPDO profile
C7 0x8011:03 (0x03) 8 RxPDO active PDO 大小为 8 * 128B
C8 0x8011:04 (0x04) 0x0F RxPDO 允许主站向 CAN0..CAN3 下发 CAN 帧
C9 0x8011:05 (0x05) 0 RxPDO 使用 profile 0
C10 0x8011:06 (0x06) 0 RxPDO 使用 Balanced 预算
C11 0x8011:07 (0x07) 0x00 RxPDO 方向选项关闭
C12 0x8011:01 (0x01) 1 apply RxPDO profile

如果需要 4 字节对齐,把 0x8010:07 (0x07) 或 0x8011:07 (0x07) 写成 0x02 后再 apply;如果需要 TxPDO 发送结果包,把 0x8010:07 (0x07) bit0 置 1。

阶段 D:读取 profile 回显,确认固件已经按主站期望生效。

步骤 SDO 期望值 判断含义
D1 0x8010:02 (0x02) 0 TxPDO profile apply 成功
D2 0x8011:02 (0x02) 0 RxPDO profile apply 成功
D3 0x8010:09 (0x09) 1024 TxPDO active PDO bytes 正确
D4 0x8011:09 (0x09) 1024 RxPDO active PDO bytes 正确
D5 0x8010:10 (0x0A) 1000 TxPDO frame area bytes 正确
D6 0x8011:10 (0x0A) 1000 RxPDO frame area bytes 正确
D7 0x8010:12 (0x0C) 0x000001E7 TxPDO active profile word 正确
D8 0x8011:12 (0x0C) 0x000001E7 RxPDO active profile word 正确

示例中 active profile word 计算如下:

text
bits 0..4   = N - 1 = 7
bits 5..12  = channel_mask = 0x0F
bits 13..18 = profile = 0
bits 19..20 = budget = 0
bits 21..28 = option_flags = 0

ActiveProfileWord = 7 | (0x0F << 5) = 0x000001E7

因此上表 D7/D8 应按实际计算值检查:N=8, mask=0x0F, profile=0, budget=0, options=0 时为 0x000001E7。如果启用 ALIGN4,OptionFlags=0x02,active profile word 会额外包含 (0x02 << 21)

阶段 E:配置 MCAN 通道。下面示例把 CAN0 配成 CAN FD ISO,仲裁段 1Mbps,数据段 5Mbps,并使用 64B CAN FD Message RAM 布局。示例假设对端 CAN/CAN FD 设备的仲裁段和数据段采样点均为 87.5%,因此把采样点范围收敛为 875..875。CAN1..CAN3 分别使用 0x80020x80030x8004,子项完全相同。下表 SDO 冒号后的子项按十进制 SI 书写,并在括号中同步给出十六进制 SI;若主站软件使用十六进制显示,可以直接使用括号中的值。

步骤 SDO 写入值 作用
E1 0x8001:07 (0x07) 0 自动位时序模式,根据波特率和对端采样点约束求解
E2 0x8001:08 (0x08) 0 Normal 模式;调试 loopback/listen 时才改
E3 0x8001:09 (0x09) 0 ISO CAN FD;Non-ISO 模式关闭
E4 0x8001:15 (0x0F) 1 CAN0 启用 CAN FD;classic CAN 写 0
E5 0x8001:16 (0x10) 1 CAN0 启用 TDC;5Mbps 建议开启
E6 0x8001:19 (0x13) 1000000 CAN0 nominal bitrate,仲裁段 1Mbps
E7 0x8001:20 (0x14) 5000000 CAN0 data bitrate,数据段 5Mbps
E8 0x8001:21 (0x15) 875 仲裁段采样点下限,对端为 87.5% 时写 875
E9 0x8001:22 (0x16) 875 仲裁段采样点上限 87.5%
E10 0x8001:23 (0x17) 875 数据段采样点下限,对端为 87.5% 时写 875
E11 0x8001:24 (0x18) 875 数据段采样点上限 87.5%
E12 0x8001:33 (0x21) 0 TDC offset 自动计算
E13 0x8001:34 (0x22) 0 TDC filter 自动计算
E14 0x8001:36 (0x24) 0 标准帧未命中过滤器进入 RX FIFO0
E15 0x8001:37 (0x25) 0 扩展帧未命中过滤器进入 RX FIFO0
E16 0x8001:38 (0x26) 0 不拒绝标准远程帧;如不需要 RTR 可写 1
E17 0x8001:39 (0x27) 0 不拒绝扩展远程帧;如不需要 RTR 可写 1
E18 0x8001:61 (0x3D) 0 RX FIFO0 blocking 模式
E19 0x8001:62 (0x3E) 48 RX FIFO0 元素数
E20 0x8001:63 (0x3F) 0 RX FIFO1 blocking 模式
E21 0x8001:64 (0x40) 12 RX FIFO1 元素数
E22 0x8001:65 (0x41) 7 RX FIFO0 元素数据区 64B
E23 0x8001:66 (0x42) 7 RX FIFO1 元素数据区 64B
E24 0x8001:67 (0x43) 12 RX buffer 元素数
E25 0x8001:68 (0x44) 7 RX buffer 元素数据区 64B
E26 0x8001:69 (0x45) 0 TX 使用 FIFO 模式
E27 0x8001:70 (0x46) 32 TX FIFO 元素数
E28 0x8001:71 (0x47) 0 不使用 dedicated TX buffer
E29 0x8001:72 (0x48) 7 TX 元素数据区 64B
E30 0x8001:73 (0x49) 32 TX Event FIFO 元素数
E31 0x8001:01 (0x01) 1 apply CAN0 配置
E32 0x8001:02 (0x02) 0 读取确认 CAN0 apply OK

0x8001:21..24 不是为某个波特率指定固定采样点,而是用于约束自动位时序求解器,使本设备的采样点与对端 CAN/CAN FD 设备一致。若已知对端采样点,建议把 min 和 max 都写成对端目标值,例如对端仲裁段 80.0%、数据段 87.5% 时,写 0x8001:21=8000x8001:22=8000x8001:23=8750x8001:24=875。若对端采样点未知,应先参考对端驱动、工具或设备手册的推荐值,再通过错误计数和闭环收发验证。不建议在 CAN FD+BRS 的最终配置中保留过宽采样点范围,因为自动求解器可能选择一个合法但与对端不够匹配的时序。

若只启用 CAN0,仍建议只配置 0x8001,并把 0x8010/0x8011:04 写成 0x01。若使用 classic CAN,可把 0x8001:15=00x8001:20/23/24/33/34 保持默认或不写,并把 0x8001:65/66/68/72 设为 0(8B)以节省 Message RAM。

阶段 F:进入 OP 后,主站周期性写 RxPDO/SM2、读 TxPDO/SM3。若从站无法进入 OP,先检查阶段 B 的 SM2/SM3 长度和 assignment 数量;若进入 OP 但 CAN 不发送,优先检查阶段 C/E 的 channel mask 和通道 apply 状态。

5.4.4 PDO 打包与过程数据写入

主站最终操作的是 EtherCAT 过程数据中的连续 PDO buffer。以 N=8 为例:

方向 EtherCAT SM ESC 物理起始地址 主站过程数据 offset 主站动作 PDO buffer 长度 帧区
RxPDO / Output SM2 0x1100 0 主站写入 1024B offset 24..1023
TxPDO / Input SM3 0x1D00 0 主站读取 1024B offset 24..1023

一般主站程序操作的是 master process image 中的 RxPDO/TxPDO 起始指针,而不是直接写 ESC 物理地址。若调试工具直接暴露 ESC DPRAM 地址,则 RxPDO 固定头部位于 0x1100 + 0,RxPDO 第一帧位于 0x1100 + 24;TxPDO 固定头部位于 0x1D00 + 0,TxPDO 第一帧位于 0x1D00 + 24

如果使用 TwinCAT/CODESYS,工具可能把过程数据拆成多个 STRING(16) 变量;应用需要先按第 5.1.1 节拼成连续 buffer,再按下面的 offset 写入或解析。若主站提供连续 PDO 指针,则直接对该指针操作。

连续 PDO buffer 的通用布局如下。24B 固定头部只负责描述本周期的帧区状态;真正的 CAN_FRAME / TX_RESULT 包都从 offset 24 开始连续排列。

区域 Offset 长度 作用
固定 PDO 头部 0 24B 版本、序号提交、payload 长度、CRC、布局标识、通道状态
帧封装区 24 128 * N - 24 连续存放 CAN_FRAME、TX_RESULT 或扩展包
5.4.4.1 从零构建一帧 RxPDO 下发数据

下面以“主站通过 RxPDO/SM2 让 ECAN-Lite 的 CAN0 发送一帧标准 classic CAN 数据帧”为例。阅读顺序按实际写入动作组织:先写帧封装区,再计算本周期 payload,最后填写 24B 固定头部并提交。

本例假设 PDO 已配置为 N=8,RxPDO active channel mask 为 0x0F,未开启 TX_RESULT、ALIGN4 和预约时间戳。

第一步:在 offset 24 写入 CAN_FRAME。

字段 本例取值 字节位置 说明
Ctrl 0x0040 rxpdo[24..25] CH=0DLC=8IDE=0FDF=0BRS=0TSF=0KIND=0
StdIdField 0x0123 rxpdo[26..27] 11bit 标准 ID;高位保留和 ID_AUX 不使用时填 0
Data 11 22 33 44 55 66 77 88 rxpdo[28..35] classic CAN DLC=8 时写 8B

控制字 bit 组合:

text
ctrl = channel
     | (dlc << 3)
     | (ide << 7)
     | (fdf << 8)
     | (brs << 9)
     | (x << 10)
     | (tsf << 11)
     | (kind << 13)

本例中:

text
channel = 0
dlc     = 8
ide     = 0
fdf     = 0
brs     = 0
x       = 0
tsf     = 0
kind    = 0

ctrl = 0x0040
StdIdField = 0x0123
raw_packet_bytes = 2 + 2 + 8 = 12

因此 offset 24 开始的字节为:

text
40 00 23 01  11 22 33 44 55 66 77 88

第二步:计算本周期 payload 信息。

字段 本例取值 说明
payload_len 12 2B Ctrl + 2B StdIdField + 8B data
frame_count 1 本周期只有一个 CAN_FRAME
payload_crc16 crc16_ccitt_false(rxpdo[24..35]) CRC 范围只覆盖帧封装区,不包含 24B 固定头部
未使用帧区 全部填 0 从 offset 24 + payload_len 到 PDO 末尾建议清 0

CRC-16/CCITT-FALSE 参数为 poly=0x1021init=0xFFFFxorout=0x0000、不反射输入输出。

第三步:填写 24B 固定头部。主站下发 RxPDO 时,头部字段按下表写入;其中 seq_end 必须最后写。

Offset 字段 本例推荐值 说明
0 ver_ihl 0x16 version=1,ihl=6,表示固定头 24B
1 header_flags 0x00 普通下发无截断、无错误、无 TX_RESULT 时填 0
2 seq_begin seq 每发布一个 PDO image 递增一次
4 seq_end seq 必须最后写入,用作提交动作
6 payload_len 12 有效帧封装区字节数
8 payload_crc16 计算值 CRC-16/CCITT-FALSE
10 layout_id active profile 折叠值 与当前 PDO 配置一致,便于接收端发现布局变化
12 channel_mask 0x0F 应与 0x8011:04 (0x04) active channel mask 一致
13 frame_count 1 本周期 CAN_FRAME/TX_RESULT 包数量
14 overflow_sat 0 主站普通下发无溢出时填 0
15 crc_alg 1 当前固定为 CRC-16/CCITT-FALSE
16..23 channel_status[4] 全 0 RxPDO 方向从站不依赖该字段;TxPDO 方向由从站填写

layout_id 推荐计算方式:

text
layout_word = ((N - 1) & 0x1F)
            | ((channel_mask & 0xFF) << 5)
            | ((profile & 0x3F) << 13)
            | ((budget & 0x03) << 19)
            | ((option_flags & 0xFF) << 21)

layout_id = (layout_word ^ (layout_word >> 16)) & 0xFFFF

第四步:按提交顺序写入,避免从站读到半包。

text
1. 清零 RxPDO buffer,或至少清零未使用帧区。
2. 从 offset 24 开始写入所有 CAN_FRAME 包。
3. 计算 payload_len、frame_count 和 payload_crc16。
4. 写固定头部 offset 0..3、6..23。
5. 最后写 offset 4..5 的 seq_end,且 seq_end == seq_begin。

多帧打包时只重复第一步中的 CAN_FRAME 包:第一帧写在 offset 24,第二帧紧跟第一帧的 packet_bytes 后面,依次排列;payload_len 等于所有包长之和,frame_count 等于包数量。如果开启 ALIGN4,每个包的下一帧 offset 使用 align4(raw_packet_bytes) 前进,补齐字节必须为 0 并计入 payload_len

TxPDO 读取时按相反方向处理:

  1. 从 SM3/TxPDO 连续 buffer 的 offset 0 读取 24B 固定头部。
  2. 判断 seq_begin == seq_endcrc_alg == 1payload_len <= ActiveFrameAreaBytes
  3. 计算 offset [24, 24 + payload_len) 的 CRC16 并与 payload_crc16 比较。
  4. 从 offset 24 开始按 CAN_FRAME 包长逐包解析。
  5. 如果启用 ALIGN4,下一包 offset 使用 align4(raw_packet_bytes) 前进。
  6. overflow_sat != 0STREAM_TRUNCATED=1,本周期 TxPDO 数据可能不完整。

5.4.5 第三方主站常见配置方式

主站类型 推荐做法
TwinCAT 导入 ESI 后,在从站 PDO/SyncManager 页面选择前 N 个 RxPDO/TxPDO chunk;将 0x8010/0x80110x8001..0x8004 写入 Startup SDO。
CODESYS 在 EtherCAT 设备配置中固定 PDO mapping 和 SM 长度;将 profile apply 与 MCAN 参数放入启动参数列表。
Acontis / 自研主站 在进入 OP 前通过 CoE SDO 写 0x1C12/0x1C130x8010/0x8011 和 MCAN 配置;注册过程数据时按 128*N 连续 buffer 处理。

如果主站不支持在线修改 PDO mapping,应在工程配置阶段固定 N,并避免运行中切换 PDO 大小。运行期只更新 SM2/RxPDO 输出数据、读取 SM3/TxPDO 输入数据。

5.4.6 配置错误快速判断

现象 优先检查
从站无法进入 OP SM2/SM3 长度、0x1C12/0x1C13 assignment、ESI/SII 是否匹配
0x8010/0x8011:02 = 5 assignment chunk count 与 PDO size multiplier 不一致,需要重新加载主站 mapping
PDO 解析错误 固定头部 24B、payload_len、CRC16、layout CRC
CAN 不发送 主站是否写 SM2/RxPDO;0x8011 channel mask 是否启用目标通道;MCAN 通道参数是否 apply
CAN 接收不到 主站是否读取 SM3/TxPDO;0x8010 channel mask 是否启用目标通道;TxPDO payload_len 是否非 0

到这里为止,第 5 章已经说明了主站如何选择 PDO 大小、如何让固件应用 profile,以及如何写入一帧最小 RxPDO 数据。第 6..12 章开始拆解这些字节的正式协议定义:先讲 24B 固定头部,再讲通道状态、帧封装包、方向选项、TX_RESULT、CRC 和多通道预算。已经使用官方 IgH API 的读者可以快速浏览;需要自研解析库的读者应逐节实现。


6. PDO 固定头部

TxPDO 和 RxPDO 共用同一个 24B 固定头部。头部采用 little-endian 字段,ver_ihl 的高 4 bit 为 header version,低 4 bit 为 4B word 数;当前版本为 1ihl=6,因此帧封装区从 offset 24 开始。

固定头部不是 SDO 对象,没有 RO/RW 属性;它的主站访问方向跟随 PDO 方向:RxPDO 头部由主站写入并由从站解析,TxPDO 头部由从站写入并由主站解析。

Offset Size 字段 说明
0 1 ver_ihl version=1ihl=6,固定头部 24B
1 1 header_flags 溢出、错误、TX_RESULT、状态变化、序号回绕
2 2 seq_begin 发布起始序号
4 2 seq_end 发布完成序号,必须等于 seq_begin 才有效
6 2 payload_len 本周期帧封装区有效字节数
8 2 payload_crc16 帧封装区 CRC-16/CCITT-FALSE
10 2 layout_id 当前 PDO 布局标识,布局或 profile 改变时变化
12 1 channel_mask 本方向 active channel mask
13 1 frame_count 本周期帧封装包数量
14 1 overflow_sat 本周期溢出/截断计数,饱和
15 1 crc_alg 1=CRC-16/CCITT-FALSE
16 8 channel_status[4] 4 路 16bit 压缩状态

发布规则:发送端先构建完整帧封装区和头部字段,最后写 seq_end = seq_begin;接收端只有在 seq_begin == seq_endpayload_len <= ActiveFrameAreaBytescrc_alg=1 且 CRC 校验通过时才解析 payload。该设计用于避免主站或从站读到半更新 PDO。

6.1 关键字段解释与接收判断

seq_beginseq_endlayout_idcrc_algoverflow_sat 不是需要主站单独 SDO 配置的参数,它们是每个 PDO 周期中固定头部携带的运行态字段。主站在 RxPDO 下发方向需要按规则写入它们;主站在 TxPDO 上传方向需要按规则检查它们。

字段 发送端如何填写 接收端如何判断
seq_begin 每发布一次 PDO image 递增一次,16bit 回绕 seq_end 不相等时,说明正在更新或读到半包,本周期数据应丢弃
seq_end 所有 payload、CRC 和头部字段写完后,最后写成与 seq_begin 相同的值 只有 seq_begin == seq_end 才允许继续校验 CRC 和解析 payload
layout_id 根据 active PDO profile 生成的 16bit 布局短标识 连续运行中如果突然变化,说明 PDO 大小、通道掩码、profile 或 option flags 已变化,需要重新按 active profile 解析
crc_alg 当前固定写 1,表示 CRC-16/CCITT-FALSE 不等于 1 时不得解析 payload;当前产品不支持运行期切换为其他 CRC 算法
overflow_sat 本周期帧区不足、背压或截断时增加,最大饱和到 255 overflow_sat != 0STREAM_TRUNCATED=1 表示本周期数据不完整,应结合 SDO 计数器排查

说明:

  • layout_id 是 PDO 头部中的短标识,便于主站快速判断“当前 PDO 布局是否变过”。完整配置回显应读取 0x8010/0x8011:12 Active profile word:11 Active layout CRC
  • 文档或调试口径中如果出现 overflow_set,对应的是本头部字段 overflow_sat:它不是一个开关,而是“本周期发生溢出/截断后的饱和计数”。
  • payload_crc16 的计算范围是帧封装区,即 PDO offset [24, 24 + payload_len),不包含 24B 固定头部。
  • payload_len 是本周期实际有效帧封装字节数,不是 PDO 总长度。未使用的帧区必须填 0。

接收端推荐判断顺序:

text
1. 读取固定头部 A。
2. 检查 seq_begin == seq_end;不相等则忽略本周期 PDO。
3. 检查 crc_alg == 1。
4. 检查 payload_len <= ActiveFrameAreaBytes。
5. 对 offset 24 开始的 payload_len 字节计算 CRC-16/CCITT-FALSE。
6. 再读取固定头部 B;若 A 与 B 关键字段不一致,说明读期间 PDO 被更新,忽略本周期。
7. 解析 CAN_FRAME / TX_RESULT。
8. 若 overflow_sat != 0 或 STREAM_TRUNCATED=1,将本周期标记为数据不完整。

配置示例:主站希望 TxPDO/RxPDO 都使用 N=8、CAN0..CAN3、profile 0、Balanced、不开启方向选项时:

text
0x1C12 / 0x1C13: 选择前 8 个 128B chunk
0x8010:03 = 8     TxPDO PDO size multiplier
0x8010:04 = 0x0F  TxPDO channel mask
0x8010:05 = 0     TxPDO profile 0
0x8010:06 = 0     TxPDO Balanced budget
0x8010:07 = 0x00  TxPDO option flags
0x8010:01 = 1     apply TxPDO profile

0x8011:03 = 8     RxPDO PDO size multiplier
0x8011:04 = 0x0F  RxPDO channel mask
0x8011:05 = 0     RxPDO profile 0
0x8011:06 = 0     RxPDO Balanced budget
0x8011:07 = 0x00  RxPDO option flags
0x8011:01 = 1     apply RxPDO profile

apply 后读取 0x8010/0x8011:09..12。如果 Active PDO bytesActive frame area bytesActive layout CRCActive profile word 与预期一致,后续 PDO 头部中的 layout_id 应保持稳定。

header_flags

Bit 名称 说明
0 STREAM_TRUNCATED 本周期帧区不足,有帧未打包
1 ANY_CHANNEL_ERROR 任一通道处于错误、BusOff 或拥塞
2 TX_RESULT_PRESENT TxPDO 中包含发送结果包
3 STATUS_CHANGED 通道状态相比上一周期变化
4 SEQ_WRAP seq_begin 本周期回绕
5 OVERFLOW_SAT_VALID overflow_sat 有效
6 reserved 发送端写 0,接收端忽略
7 reserved 发送端写 0,接收端忽略

7. 通道状态字

每路通道状态压缩为 16bit,固定放在 PDO 头部。PDO 只承载快速状态,详细原因通过 SDO 读取。

Bits 字段 说明
0..2 state 0=disabled,1=init,2=run,3=busoff,4=error,5=listen
3 fd_enabled 当前通道启用 CAN FD
4 warn error warning / error passive / bus degraded 汇总
5 bus_off BusOff
6 rx_pressure RX FIFO 接近满或溢出
7 tx_pressure TX FIFO/Queue 拥塞
8 detail_pending SDO 中有新的详细快照
9 counter_sat pending 计数已饱和
10..12 rx_pending_sat RX pending 0..7 饱和
13..15 tx_pending_sat TX pending 0..7 饱和

warn/bus_off/rx_pressure/tx_pressure/detail_pending 置位时,主站应读取 0x9000..0x9003 获取详细寄存器和计数快照。若错误来自 PDO 封装层,应读取 0x8010/0x8011LastPDOError / PDOErrorCounter / PDOOverflowCounter


8. 帧封装包

每个帧封装包从 2B 控制字开始,控制字决定后续 CAN ID、时间戳和 data 的长度。

帧封装包跟随 PDO 方向:RxPDO 中的 CAN_FRAME 是主站请求从站发送到 CAN 总线;TxPDO 中的 CAN_FRAME 是从站从 CAN 总线收到后上传给主站;TxPDO 中的 TX_RESULT 是从站对 RxPDO 下发帧的发送结果回传。

除特别说明外,PDO 固定头部、帧封装包、TX_RESULT 和 SDO 中的多字节数值均使用 little-endian。主站侧不要按主机字节序直接强转未对齐结构体,建议按字节流显式读取。

text
Byte0:
  bit0..2  CH       CAN channel id,当前使用 0..3
  bit3..6  DLC      原始 CAN DLC,0..15
  bit7     IDE      0=11bit standard id,1=29bit extended id

Byte1:
  bit0     FDF      0=classic CAN,1=CAN FD
  bit1     BRS      CAN FD bit rate switch
  bit2     X        FDF=0 时为 RTR,FDF=1 时为 ESI
  bit3..4  TSF      0=no timestamp,1=delta16,2=delta32,3=full64
  bit5..6  KIND     0=CAN_FRAME,1=TX_RESULT,2=STREAM_META,3=reserved
  bit7     D64      0=data length by DLC,1=fixed 64B data window

当前主流程使用 KIND=0 CAN_FRAMEKIND=1 TX_RESULT 由 TxPDO 可选生成。KIND=2 STREAM_META 保留给 whole-stream CRC 等扩展能力。KIND=3 当前必须视为非法。

8.1 CAN_FRAME 格式

text
Standard ID:
  Ctrl[2] + StdIdField[2] + Timestamp[0/2/4/8] + Data[0..64] + Padding

Extended ID:
  Ctrl[2] + ExtIdField[4] + Timestamp[0/2/4/8] + Data[0..64] + Padding

StdIdField

Bits 说明
0..10 11bit STD_ID
11..13 ID_AUX
14 reserved,必须为 0
15 reserved,必须为 0

ExtIdField

Bits 说明
0..28 29bit EXT_ID
29..31 ID_AUX

ID_AUX 建议语义:

方向 建议
TxPDO / CAN RX 0=FIFO0,1=FIFO1,2=RXBUF,3=HPMS/high priority
RxPDO / CAN TX 0=normal,1=high priority,2=dedicated buffer,3=queue hint

未使用时发送端必须写 0,接收端忽略。

8.2 DLC 与数据长度

DLC 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Bytes 0 1 2 3 4 5 6 7 8 12 16 20 24 32 48 64

classic CAN 中 DLC<=8BRS=0D64=0。若 FDF=0 && X=1,该帧为 RTR,data length 必须为 0。CAN FD 中 X 表示 ESI,不存在 RTR。

8.3 包长度计算

text
id_bytes = IDE ? 4 : 2
ts_bytes = TSF == 0 ? 0 : (TSF == 1 ? 2 : (TSF == 2 ? 4 : 8))
data_bytes = (FDF == 0 && X == 1) ? 0 :
             (D64 ? 64 : can_dlc_to_len(DLC))
raw_packet_bytes = 2 + id_bytes + ts_bytes + data_bytes
packet_bytes = ALIGN_4_ENABLE ? align4(raw_packet_bytes) : raw_packet_bytes

未使用帧区必须填 0。若开启 4 字节对齐,padding 字节必须为 0 并计入 payload_len

8.3.1 开启 4 字节对齐

4 字节对齐由方向选项 ALIGN_4_ENABLE 控制,不是 0xF000 只读能力对象直接开启。0xF000:15 (0x0F) 用于确认设备是否声明支持该能力;真正的开关在 0x8010/0x8011:07 (0x07) Option flags bit1。

方向 控制对象 bit1 含义
TxPDO / SM3 Input / 从站上传 0x8010:07 (0x07) 从站上传的每个帧包按 4 字节补齐,主站解析时按对齐后长度跳到下一包
RxPDO / SM2 Output / 主站下发 0x8011:07 (0x07) 主站下发的每个帧包必须按 4 字节补齐,从站按对齐后长度解析下一包

开启步骤:

text
1. 读取 0xF000:15,确认 bit1 ALIGN4 option mask 为 1。
   也可读取 0xF000:16,确认 bit5 ALIGN4 feature 为 1。
2. 在 PREOP/SAFEOP 中写入 0x8010/0x8011 requested profile。
3. 将目标方向的 0x8010:07 或 0x8011:07 bit1 置 1。
4. 写 0x8010:01 = 1 或 0x8011:01 = 1 apply。
5. 读取 0x8010/0x8011:02,确认 Status = 0。
6. 读取 0x8010/0x8011:12,确认 Active profile word 中 OptionFlags 的 bit1 已生效。

示例:保持其他方向选项不变,只打开 RxPDO 4 字节对齐:

text
old = read_u8(0x8011:07)
write_u8(0x8011:07, old | 0x02)
write_u8(0x8011:01, 1)
check read_u8(0x8011:02) == 0

示例:关闭 TxPDO 4 字节对齐:

text
old = read_u8(0x8010:07)
write_u8(0x8010:07, old & ~0x02)
write_u8(0x8010:01, 1)
check read_u8(0x8010:02) == 0

开启后,发送端必须把每个帧包补齐到 4 字节边界,padding 字节必须写 0,并且 padding 字节计入固定头部 payload_len。接收端解析下一包时也必须使用对齐后的 packet_bytes,不能只按原始 CAN 数据长度前进。

长度示例:

CAN_FRAME raw_packet_bytes ALIGN4 后 packet_bytes payload_len 计入
标准帧、DLC=8、无时间戳 2 + 2 + 8 = 12 12 12
扩展帧、DLC=8、无时间戳 2 + 4 + 8 = 14 16 16,末尾 2B padding 必须为 0
标准 CAN FD、DLC=15、无时间戳 2 + 2 + 64 = 68 68 68
扩展 CAN FD、DLC=15、delta16 2 + 4 + 2 + 64 = 72 72 72

8.4 时间戳字段

TSF 决定 CAN_FRAME 中是否携带时间戳字段。普通 TxPDO 上传方向中,时间戳用于描述从站接收 CAN 帧的时间;RxPDO 下发方向中,TSF_NONE 表示立即发送,TSF_FULL64 可被预约发送格式复用。

TSF 字节数 普通语义 说明
0 0 无时间戳 默认模式,开销最低
1 2 delta16 相对同一 PDO 周期内参考时间的低 16 bit 差值,适合短周期压缩时间戳
2 4 delta32 相对参考时间的低 32 bit 差值;能力位存在但当前默认 profile 不主动启用
3 8 full64 64 bit 完整时间戳,或 RxPDO 预约发送扩展格式

TxPDO 中同一 Packet sequence 内的 delta16/delta32 以该周期首个可用时间基准为参考。主站用于排序和诊断时应按无符号差值处理 wrap。若主站不需要时间戳,建议使用 profile 0/4,减少每帧开销。

RxPDO 预约发送只使用 TSF_FULL64 的 8B 字段,并要求格式如下:

text
format:u8 = 1
flags:u8 = 0
tag:u16
offset_ns:u32

offset_ns 表示相对下一次 SYNC0 周期起点的目标相位。该格式不是绝对时间戳;如果目标相位已经错过,固件不会把帧延迟到下一个周期补发,主站应预留足够相位余量。


9. 封装 Profile 与方向选项

0x8010 控制 TxPDO profile,0x8011 控制 RxPDO profile。当前出厂支持以下 profile:

Profile 默认状态 说明
0 默认开启 compact inline,variable DLC,无时间戳
1 默认关闭,需配置 compact inline,variable DLC,允许 delta16 时间戳
4 默认关闭,需配置 compact inline,允许 D64,无时间戳
5 默认关闭,需配置 compact inline,允许 D64,允许 delta16 时间戳

方向选项由 0x8010/0x8011:07 Option flags 控制。0x8010 作用于 TxPDO/SM3/Input 上传方向,0x8011 作用于 RxPDO/SM2/Output 下发方向。

9.1 Option flags bit 表

Option flags 是一个 8 bit 位图。主站写 requested value 后,必须再写 0x8010:01=10x8011:01=1 apply,读取 0x8010/0x8011:02=0:12 Active profile word 才表示真正生效。

Bit 掩码值 名称 适用方向 默认状态 说明
0 0x01 TX_RESULT_ENABLE TxPDO / 0x8010:07 (0x07) 关闭 从站在 TxPDO 中上传 RxPDO 下发帧的发送结果包;0x8011:07 (0x07) bit0 不用于 RxPDO
1 0x02 ALIGN_4_ENABLE TxPDO / RxPDO 关闭 每个 CAN_FRAME/TX_RESULT 包按 4 字节边界补齐;padding 必须为 0 并计入 payload_len
2 0x04 NO_CRC16_ENABLE TxPDO / RxPDO 关闭 关闭固定头部 payload_crc16,PDO 头部使用 crc_alg=0payload_crc16=0,用于性能隔离测试
3 0x08 APP_BYPASS_ENABLE TxPDO / RxPDO 关闭 在 PDO 入口快速旁路真实 MCAN 应用层收发链路;TxPDO 仅返回最小合法动态头,RxPDO 不进入 AB 缓冲
4 0x10 PAYLOAD_ONLY_ENABLE TxPDO / RxPDO 关闭 稳定 layout 下只更新 24 字节头和有效 payload;payload_len 之外旧数据必须忽略
5..7 0xE0 reserved 保留 关闭 主站必须写 0;写 1 会被视为 unsupported option

常用写入值:

写入值 作用 典型场景
0x00 所有方向选项关闭 默认 bring-up,最少开销
0x01 开启 TX_RESULT 0x8010:07 (0x07),需要逐帧发送结果时使用
0x02 开启 4 字节对齐 0x8010:07 (0x07) 或 0x8011:07 (0x07),客户主站希望帧包天然 32bit 对齐
0x03 TX_RESULT + 4 字节对齐 0x8010:07 (0x07),同时要发送结果和对齐
0x04 关闭 CRC16 0x8010:07 (0x07) 和 0x8011:07 (0x07) 同步配置,用于测 CRC16 开销
0x08 旁路应用层 0x8010:07 (0x07) 和 0x8011:07 (0x07) 同步配置,用于测无 MCAN 应用链路开销

能力判断:

能力对象 判断方式 说明
0xF000:15 PDO option flags mask 检查对应 bit 是否为 1 表示该 option flag 可以被写入 0x8010/0x8011:07
0xF000:16 PDO feature flags 检查对应 feature bit 表示设备协议能力,例如 ALIGN4、预约发送等

当前能力掩码以 0xF000 为准。主站应先读取能力对象,再选择 profile 和 option flags。

9.2 不配置时的默认开关状态

如果主站不写 0x8010/0x8011 的 profile 相关 SDO,设备对象字典中的 requested 默认值如下。注意:0xF000 表示“支持能力”,不表示默认启用;真正启用状态由 0x8010/0x8011 的 requested profile 和 apply 后的 active readback 决定。

功能 控制对象 默认值 不配置时状态 备注
PDO size multiplier 0x8010/0x8011:03 8 默认请求 1024B/方向 主站 mapping 也必须选择前 8 个 chunk,否则 apply 会返回 mapping reload required
Channel mask 0x8010/0x8011:04 0x0F CAN0..CAN3 默认请求启用 关闭通道需显式改 mask 并 apply
Encapsulation profile 0x8010/0x8011:05 0 profile 0 开启 variable DLC,无时间戳
Budget policy 0x8010/0x8011:06 0 Balanced 开启 每启用通道保留最小预算,剩余空间共享
TX_RESULT 0x8010:07 bit0 0 关闭 需要逐帧发送结果时显式打开;0x8011 bit0 不用于 RxPDO
4 字节对齐 0x8010/0x8011:07 bit1 0 关闭 支持但默认不补齐,打开后 padding 计入 payload_len
关闭 CRC16 0x8010/0x8011:07 bit2 0 关闭 默认使用固定头部 payload_crc16;打开后 crc_alg=0
应用层旁路 0x8010/0x8011:07 bit3 0 关闭 默认走真实 MCAN 链路;打开后仅做协议栈效率测试
delta16 时间戳 0x8010/0x8011:05=1/5 0 关闭 选择 profile 1 或 5 后才启用
D64 data window 0x8010/0x8011:05=4/5 0 关闭 选择 profile 4 或 5 后才启用
RxPDO 预约发送 RxPDO CAN_FRAME TSF_FULL64 format=1 无普通默认帧 关闭 主站必须主动按预约格式下发帧,且建议先确认 0xF000:16 bit8
CAN FD 0x8001..0x8004:15 1 开启 每路 MCAN 默认按 CAN FD 配置;classic CAN 需写 0 并 apply
TDC 0x8001..0x8004:16 1 开启 数据段 5M 及以上即使写 0 也会强制开启

推荐主站不要依赖“隐式默认已经生效”的假设。启动时应显式配置 0x1C12/0x1C13、写入 0x8010/0x8011:03..07,再写 0x8010/0x8011:01=1 apply,并读取 :09..12 确认 active 状态。


10. TX_RESULT

TX_RESULT 是可选帧包,用于在 TxPDO 中回传 RxPDO 下发帧的发送结果。

text
TX_RESULT:
  Ctrl[2] + RefPacketSeq[2] + RefFrameIndex[1] + ResultCode[1]

CtrlKIND=1CH 表示结果对应的 CAN 通道。RefPacketSeq 对应主站下发 RxPDO 固定头部中的发布序号,也就是 seq_begin == seq_end 后提交的那个序号;RefFrameIndex 对应该 RxPDO payload 中解析到的第几个 KIND=0 CAN_FRAME,从 0 开始计数。这样主站可以把 TX_RESULT 和原始下发帧建立一一对应关系。

ResultCode

说明
0 OK
1 queued
2 bus busy
3 invalid channel
4 tx fifo full
5 bus off

TX_RESULT 只表示从站把该帧交给 MCAN 发送路径的结果,不等价于目标 CAN 节点已经完成业务处理。若使用 TX FIFO/Queue,queued 表示已经进入本地发送队列,实际总线发送仍受仲裁、bus off、TX FIFO 空间影响。

如果主站不需要逐帧 ACK,可关闭 TX_RESULT,只通过 PDO 头部通道状态和 SDO 计数器观察拥塞。


11. CRC 与完整性策略

默认不为每个 CAN_FRAME 添加 CRC32。

原因:

  • CAN/CAN FD 总线本身已有 CAN CRC。
  • EtherCAT 帧已有链路 FCS 和 working counter。
  • per-frame CRC32 会增加 4B/帧,classic 8B 标准帧开销从 12B 增加到 16B,约 33%。
  • 逐帧 CRC32 会增加 1ms 周期中的小包计算抖动。

默认使用 ActiveLayoutCrc 校验 PDO layout 合约,该 CRC 只在 profile apply 时计算。运行期每个 PDO 周期使用固定头部中的 payload_crc16 保护 FramePacketStream,算法为 CRC-16/CCITT-FALSE;它用于识别半更新或错误 payload,不是 CAN 帧级业务 CRC。若未来确实需要运行期额外完整性检查,应使用能力位声明的 STREAM_CRC32_ENABLE,并以 STREAM_META 包承载 whole-stream CRC32,而不是给每个 CAN_FRAME 加 CRC。


12. 多通道共享预算

PDO 不再给每路 CAN 固定槽位。调度器按帧区字节预算工作:

text
frame_area = ActivePDOBytes - 24
reserved_bytes = enabled_channel_count * policy_reserved_bytes
shared_bytes = frame_area - reserved_bytes

预算策略:

名称 说明
0 Balanced 每启用通道保留最小包预算,剩余空间共享竞争;默认
1 SharedOnly 不做通道保留,所有帧共享竞争
2 Deterministic 按启用通道平均分配预算,通道间不借用
3 Reserved 保留

一条 CAN_FRAME 必须整体放入本周期帧区,不允许跨周期拆分。如果空间不足,设备设置 STREAM_TRUNCATED,增加 overflow_sat 和 SDO PDOOverflowCounter


13. SDO 对象字典

前面的章节描述周期 PDO 数据,也就是 OP 运行后每个 EtherCAT 周期会交换的字节。SDO 对象字典是配置和诊断入口:进入 OP 前用它设置 PDO profile 和 MCAN 参数,运行中用它读取能力、错误计数和详细状态。读者如果只需要查对象,可以直接从本章按对象号定位;如果正在做 bring-up,建议先看 13.1、13.2、13.4、13.8。

本章所有 SDO 子项表均给出“类型”列。类型采用 EtherCAT CoE 常用标记:U8 为 unsigned 8 bit,U16 为 unsigned 16 bit,U32 为 unsigned 32 bit;若后续出现有符号 32 bit,可标为 D32/I32。当前 ECAN-Lite 对象字典主要使用 U8/U16/U32

13.1 对象总览

对象 名称 访问概览 方向/用途 说明
0x8000 System Config RW/RO CFG 系统时钟、重启、CAN pin rotation
0x8001..0x8004 MCAN Channel Config RW/RO CFG 每路 CAN/CAN FD 配置
0x8010 TxPDO Profile Control RW/RO S2M profile 从站上传方向 PDO profile
0x8011 RxPDO Profile Control RW/RO M2S profile 主站下发方向 PDO profile
0x8020 Data Path Global Control RW/RO CFG/runtime 数据面全局控制、兼容模式和服务预算
0x8021..0x8024 MCAN Data Path Control RW/RO CFG/runtime 每路 MCAN 的 RX/TX cache、预算、丢弃和恢复策略
0x8030 PDO Diagnostic Test Control RW/RO diagnostic 细分 bypass、CRC 和 payload-only 测试控制
0x9000..0x9003 MCAN Channel Information RO S2M status 每路 CAN 只读状态详情
0x9011 Cycle Performance Diagnostics RO/RW diagnostic 周期、中断、Mapping 和服务耗时统计
0x9020..0x9023 MCAN Data Path Diagnostics RO diagnostic 每路 MCAN 数据面 cache/drop/恢复统计
0xA000..0xA003 MCAN Register Service RW/RO CFG/diagnostic 每路 MCAN 寄存器调试访问
0xB000 Device Maintenance RW/RO CFG/maintenance 维护、持久化、FoE 状态
0xF000 Device Objects RO S2M capability 能力、版本、上限只读对象

13.2 0x8010/0x8011 PDO Profile Control

0x8010 控制 TxPDO/Input 方向,数据流为 S2M0x8011 控制 RxPDO/Output 方向,数据流为 M2SSI1/3/4/5/6/7/8 为主站写入的 requested 配置或命令,SI2/9..16 为从站返回的状态和 active readback。

SI 名称 类型 访问 默认 说明
1 Apply command U8 RW 0 写 1 应用 requested profile
2 Status U8 RO 0 apply/parser 状态
3 PDO size multiplier U8 RW 8 ActivePDOBytes=128*N,N=1..24
4 Channel mask U8 RW 0x0F bit0..7 对应 CAN0..CAN7
5 Encapsulation profile U8 RW 0 封装 profile;默认 profile 0,无时间戳、variable DLC
6 Budget policy U8 RW 0 预算策略;默认 Balanced
7 Option flags U8 RW 0 方向选项;默认 TX_RESULT、ALIGN4、STREAM_CRC32 均关闭
8 Command U8 RW 0 bit0 reset session,bit1 clear errors
9 Active PDO bytes U16 RO 0 当前 PDO 字节数
10 Active frame area bytes U16 RO 0 当前帧区字节数
11 Active layout CRC U32 RO 0 layout 合约 CRC
12 Active profile word U32 RO 0 active profile 打包回显
13 Packet sequence U16 RO 0 最近方向序号
14 Last PDO error U16 RO 0 最近封装层错误
15 PDO error counter U32 RO 0 封装层错误计数
16 PDO overflow counter U32 RO 0 溢出/背压计数

Status 常用值:

说明
0 OK
1 invalid state,通常为 OP 中尝试改变布局
2 invalid PDO size multiplier
3 invalid channel mask
4 invalid encapsulation profile
5 master mapping reload required
7 PDO encapsulation error
8 PDO overflow/backpressure
9 requested profile pending apply
10 unsupported option flag

Active profile word 打包格式:

Bits 字段 说明
0..4 PDOSizeMultiplier - 1 N=1..24,实际 PDO 字节数为 128 * N
5..12 ChannelMask bit0..3 对应 CAN0..CAN3,当前产品只使用低 4 bit
13..18 EncapsulationProfile 见第 9 章 profile 表
19..20 BudgetPolicy 见第 12 章预算策略
21..28 OptionFlags 方向选项,见第 9 章
29 reserved 保留为 0
30 reserved 保留为 0
31 reserved 保留为 0

Command 位定义:

Bit 名称 说明
0 reset session 清理该方向运行态序号、错误状态和临时会话信息
1 clear errors 清理 LastPDOErrorPDOErrorCounterPDOOverflowCounter
2 reserved 必须为 0
3 reserved 必须为 0
4 reserved 必须为 0
5 reserved 必须为 0
6 reserved 必须为 0
7 reserved 必须为 0

Last PDO error 常用值:

名称 说明
0 OK 无错误
2 frame overrun 单帧超过当前 profile 支持的封装能力
3 packet overrun 帧包超过本周期 frame area
4 unknown kind KIND 非法或当前不支持
5 invalid DLC DLC 与 classic CAN/CAN FD 规则不匹配
6 invalid channel 通道号超过能力范围或未在 channel mask 中启用
7 invalid TSF 时间戳格式不被当前 profile 或方向支持
8 truncated payload 长度不足,帧包被截断
9 unsupported profile EncapsulationProfile 不在能力掩码中
10 duplicate sequence 收到重复 RxPDO 镜像,通常作为幂等 no-op 处理
11 unsupported option option flags 含未支持位
12 active area active PDO/frame area 与主站 mapping 不一致
13 reserved bit 控制字或固定头部保留位非 0
14 bad header 固定头部版本、长度或字段非法
15 bad CRC payload_crc16 校验失败
16 bad schedule 预约发送格式非法或能力不支持

PDO error counter 统计解析、CRC、非法字段等封装层错误;PDO overflow counter 统计本周期帧区不足、TX/RX 背压导致的溢出或丢弃。现场排查时先看 Status,再看 LastPDOError 和两个计数器是否持续增加。

13.2.1 0x8020 Data Path Global Control

0x8020 是数据面全局控制对象。它不改变 EtherCAT SM/PDO 映射长度,主要用于运行期兼容策略、诊断开关和服务预算。写入后通过 Apply command=1 生效,Apply status=0 表示接受。

SI 名称 类型 访问 默认 说明
1 Control format U16 RO 1 控制对象格式版本
2 Apply command U8 RW 0 0=no-op,1=应用当前全局控制
3 Apply status U8 RO 0 最近一次 apply 结果,0=OK
4 Compat mode U16 RW 3 兼容模式位,保留给旧策略和新对象并存
5 Runtime option flags U32 RW 0 运行选项;当前能力掩码为 0,必须保持 0
6 Diagnostic option flags U32 RW 0 诊断选项;当前能力掩码为 0,必须保持 0
7 Max service budget us U16 RW 1000 数据面单次服务预算上限,允许 0..1000;0 表示使用固件默认
8 Reserved0 U16 RO 0 保留
9 Reserved1 U32 RO 0 保留
10 Reserved2 U32 RO 0 保留

13.2.2 0x8021..0x8024 MCAN Data Path Control

0x8021..0x8024 分别对应 MCAN0..MCAN3。该对象把每路 MCAN 的数据面策略从 legacy policy word 拆成独立字段,便于产品界面、脚本和客户主站做精确配置。它不改变 MCAN 位时序、过滤器或 Message RAM;这些仍由 0x8001..0x8004 管理。

对象 通道
0x8021 MCAN0
0x8022 MCAN1
0x8023 MCAN2
0x8024 MCAN3
SI 名称 类型 访问 默认 说明
1 Enable U8 RW 1 0=关闭该通道数据面策略,1=启用
2 Apply command U8 RW 0 0=no-op,1=应用当前通道策略到运行时
3 Apply status U8 RO 0 最近一次 apply 结果,0=OK
4 RX drain budget min U8 RW 0 每周期从 MCAN RX cache 取帧的最小预算,0..8
5 RX drain budget max U8 RW 2 每周期从 MCAN RX cache 取帧的最大预算,0..8
6 RX budget policy U8 RW 1 RX 预算策略,见下表
7 RX cache depth U8 RW 2 RX cache 深度,接受 legacy 枚举 0..3 或显式 8/16/24/32
8 RX overflow policy U8 RW 1 RX cache 满时的丢弃策略,见下表
9 Critical frame policy U16 RW 1 关键帧保护策略,见下表
10 CAN ID priority policy U16 RW 0 CAN ID 优先级策略,当前保留
11 TX budget min U8 RW 0 每周期 TX 服务最小预算,0..8
12 TX budget max U8 RW 4 每周期 TX 服务最大预算,0..8
13 TX overflow policy U8 RW 1 TX cache 满时策略,见下表
14 Bus-off recovery policy U8 RW 1 bus-off 恢复策略,见下表
15 Backoff base cycles U16 RW 2 TX 背压后的基础退避周期数
16 Degraded threshold U16 RW 64 进入 degraded 状态的阈值
17 Reserved0 U32 RW 0 预留扩展
18 Reserved1 U32 RW 0 预留扩展
19 Reserved2 U32 RW 0 预留扩展
20 Active control word U32 RO 0 固件把生效策略打包后的只读回显

RX budget policy

名称 说明
0 balanced 使用默认保守预算
1 limited 使用 RX drain budget min/max 限制每周期读取量
2 performance 性能模式,允许在上限内更积极 drain
3 adaptive 根据 cache 压力和周期预算自适应

RX cache depth

写入值 实际深度
0 或 32 32
1 或 8 8
2 或 16 16
3 或 24 24

RX overflow policy

名称 说明
0 drop oldest 满时丢旧帧,保最新反馈
1 drop newest 满时丢新帧,保留已有顺序
2 preserve critical 尽量保护 emergency、heartbeat、CANopen 关键帧
3 degraded 溢出后进入 degraded 诊断状态

Critical frame policy

名称 说明
0 none 不做关键帧特殊保护
1 CANopen safety 保护常见 CANopen 安全/状态帧
2 CANopen all 对 CANopen 控制与状态类帧使用更保守策略

TX overflow policy

名称 说明
0 drop newest TX cache 满时丢弃新帧
1 drop oldest TX cache 满时丢弃旧帧,优先发送最新控制
2 backoff 背压退避,降低同通道发送尝试
3 degraded 持续拥塞后进入 degraded 状态

Bus-off recovery policy

名称 说明
0 manual 只记录 bus-off,等待上位机处理
1 auto 自动恢复,默认推荐
2 aggressive 更积极恢复,适合测试环境
3 degraded bus-off 后保持 degraded,避免反复扰动总线

Active control word 打包格式:

Bits 字段
0 Enable
4..7 RX drain budget min
8..11 RX drain budget max
12..13 RX budget policy
14..15 RX cache depth legacy 枚举
16..17 RX overflow policy
18..19 Critical frame policy
20..23 TX budget min
24..27 TX budget max
28..29 TX overflow policy
30..31 Bus-off recovery policy

13.2.3 0x8030 PDO Diagnostic Test Control

0x8030 是研发和现场性能定位对象,不建议客户产品长期打开。除写 0 外,修改测试策略前必须先写 Test enable key = 0x4543414E(ASCII ECAN)。如果 key 为 0,所有测试策略也必须为 0,否则写入会被拒绝。

SI 名称 类型 访问 默认 说明
1 Test enable key U32 RW 0 0=关闭测试;0x4543414E=允许修改测试位
2 TxPDO bypass flags U32 RW 0 TxPDO 方向细分 bypass 位,合法位见下表
3 RxPDO bypass flags U32 RW 0 RxPDO 方向细分 bypass 位,合法位见下表
4 CRC test policy U8 RW 0 0=跟随 PDO option,1=强制 CRC16,2=强制 no CRC16
5 Payload only policy U8 RW 0 0=off,1=Tx,2=Rx,3=Tx+Rx
6 App link bypass policy U8 RW 0 0=off,1=Tx,2=Rx,3=Tx+Rx
7 ReservedPad U8 RO 0 保留
8 Legal combination mask U32 RO 0x1F 当前固件允许的诊断能力位
9 Last reject reason U32 RO 0 最近一次非法组合拒绝原因
10 Reserved0 U32 RO 0 保留

TxPDO bypass flags

Bit 名称 说明
2 MCAN_READ 跳过从 MCAN/RX cache 读取真实帧
3 BUILD 跳过 TxPDO 动态帧构建
4 COPY 跳过 TxPDO copy/发布路径

RxPDO bypass flags

Bit 名称 说明
2 STAGE 跳过 RxPDO stage
3 PARSE 跳过 RxPDO payload 解析
4 TX_RING 跳过写入发送 ring
5 MCAN_WRITE 跳过真实 MCAN 发送

Legal combination mask

Bit 能力 说明
0 TX_BYPASS 支持 TxPDO 细分 bypass
1 RX_BYPASS 支持 RxPDO 细分 bypass
2 CRC_POLICY 支持 CRC16/no-CRC16 测试策略
3 PAYLOAD_ONLY 支持 payload-only 测试策略
4 APP_BYPASS 支持应用链路 bypass 策略

13.2.4 0x9011 Cycle Performance Diagnostics

0x9011 用于观察周期稳定性和固件热路径耗时。除 Clear command 外均为只读。周期数单位是 CPU cycle,换算时间时可用 0x8000:4 CPU clock hz

SI 名称 类型 访问 说明
1 PDI IRQ count U32 RO PDI 中断计数
2 Sync0 IRQ count U32 RO Sync0 中断计数
3 Sync1 IRQ count U32 RO Sync1 中断计数
4 PDI to Sync0 phase min I32 RO PDI 到 Sync0 相位差最小值
5 PDI to Sync0 phase max I32 RO PDI 到 Sync0 相位差最大值
6 APPL OutputMapping max cycles U32 RO RxPDO/OutputMapping 最大耗时
7 APPL InputMapping max cycles U32 RO TxPDO/InputMapping 最大耗时
8 MCAN PDO service max cycles U32 RO 主循环 MCAN PDO service 最大耗时
9 TxPDO shadow max cycles U32 RO TxPDO shadow 发布最大耗时
10 RxPDO parse max cycles U32 RO RxPDO 解析最大耗时
11 ESC read max cycles U32 RO ESC 读路径最大耗时
12 ESC write max cycles U32 RO ESC 写路径最大耗时
13 Schedule service max cycles U32 RO 预约发送服务最大耗时
14 Clear command U8 RW 写 1 清空本对象统计和相关运行统计
15 ReservedPad U8 RO 保留
16 Reserved0 U32 RO 保留扩展
17 Reserved1 U32 RO 保留扩展
18 Reserved2 U32 RO 保留扩展
19 Reserved3 U32 RO 保留扩展
20 Reserved4 U32 RO 保留扩展
21 Reserved5 U32 RO 保留扩展
22 Reserved6 U32 RO 保留扩展
23 Reserved7 U32 RO 保留扩展
24 Reserved8 U32 RO 保留扩展

13.2.5 0x9020..0x9023 MCAN Data Path Diagnostics

0x9020..0x9023 分别对应 MCAN0..MCAN3。它们用于把 0x8021..0x8024 的策略执行结果可视化,帮助判断问题来自 CAN 侧输入过多、PDO 空间不足、TX FIFO 背压、bus-off 还是服务预算过小。

对象 通道
0x9020 MCAN0
0x9021 MCAN1
0x9022 MCAN2
0x9023 MCAN3
SI 名称 类型 访问 说明
1 RX cache count U16 RO 当前 RX cache 中等待打包的帧数
2 RX cache high watermark U16 RO RX cache 历史最高水位
3 RX drain last U16 RO 最近一次服务实际 drain 的 RX 帧数
4 RX drain max U16 RO 历史单次服务最大 drain 帧数
5 RX dropped total U32 RO RX 丢弃总数
6 RX dropped old U32 RO 因保新帧而丢弃旧帧的次数
7 RX dropped new U32 RO 因保旧帧而丢弃新帧的次数
8 RX dropped critical U32 RO 关键帧保护相关丢弃计数
9 TxPDO consumed last U16 RO 最近一次 TxPDO 打包消费的帧数
10 TxPDO consumed max U16 RO 历史单周期 TxPDO 最大消费帧数
11 TX fifo full count U32 RO MCAN TX FIFO/Queue 满或不可写计数
12 TX stale dropped U32 RO 过期待发送帧丢弃计数
13 Bus off count U32 RO bus-off 次数
14 Recovery attempts U16 RO 自动恢复尝试次数
15 Degraded state U16 RO 0=正常,非 0=降级或保护状态
16 Last error U32 RO 最近一次数据面错误码或底层返回码
17 Service max cycles U32 RO 本通道服务最大耗时
18 Service last cycles U32 RO 本通道最近一次服务耗时
19 Reserved0 U32 RO 保留
20 Reserved1 U32 RO 保留

13.3 0x8000 System Config

SI 名称 类型 访问 默认 说明
1 Reboot command U8 WO 0 写 1 请求软件重启
3 CPU voltage U16 RW 1275 CPU 电压配置值,单位 mV;当前固件启动时由板级代码设置,SDO 写入仅作为配置值回显
4 CPU clock hz U32 RO 400000000 CPU 主频
5 BUS clock hz U32 RO 200000000 系统总线频率
6 MCAN0 clock hz U32 RO 80000000 MCAN0 源时钟
7 MCAN1 clock hz U32 RO 80000000 MCAN1 源时钟
8 MCAN2 clock hz U32 RO 80000000 MCAN2 源时钟
9 MCAN3 clock hz U32 RO 80000000 MCAN3 源时钟
10 Config version U32 RW 0 主站配置版本回显
11 Last apply result U32 RO 0 最近系统配置应用结果
12 CAN pin rotation U8 RW 0 逻辑 CAN 通道到固定引脚组的旋转
13 Active CAN pin rotation U8 RO 0 当前生效 rotation
14 CAN pin rotation mask U8 RO 0x0F 支持的 rotation bit mask
15 CAN pin apply status U8 RO 0 最近 pin rotation 应用状态

CAN pin rotation 只允许在芯片/板级固定 CAN 引脚组之间旋转逻辑通道,不提供任意 GPIO 复用配置。

13.4 0x8001..0x8004 MCAN Channel Config

每路通道结构相同,0x8001 对应 CAN0,0x8004 对应 CAN3。

对象完整子项按功能分组如下。普通客户通常只需要配置 SI15/16/19/20 和必要的 FIFO/Queue 参数;滤波器、TSU、Timeout 属于高级配置。

SI 名称 类型 访问 默认 说明
1 Apply command U8 WO 0 写 1 应用通道配置
2 Apply status U8 RO 0 最近 apply 结果
3 Flash command U8 WO 0 bit0 save,bit1 load,bit2 factory reset
4 Flash status U8 RO 0 最近 flash 命令结果
5 Command sequence U32 RO 0 命令完成序号
6 Command Pad0 U32 RO 0 保留
7 Bit timing mode U8 RW 0 0=自动波特率求解,1=手动 bit timing
8 Node mode U8 RW 0 Normal / Loopback / Listen
9 Non-ISO enable U8 RW 0 CAN FD Non-ISO 模式
10 Transmit pause U8 RW 0 MCAN transmit pause
11 Edge filter enable U8 RW 0 边沿过滤
12 Protocol exception disable U8 RW 0 禁止 protocol exception
13 Wide message marker enable U8 RW 0 扩展 message marker
14 External timestamp use U8 RW 0 使用外部时间戳源
15 FD enable U8 RW 1 1=CAN FD,0=classic CAN
16 TDC enable U8 RW 1 CAN FD 传输延迟补偿
17 Restricted mode disable U8 RW 0 restricted operation mode 控制
18 Disable auto retransmission U8 RW 0 1=关闭 MCAN 自动重发
19 Nominal bitrate U32 RW 500000 仲裁段波特率
20 Data bitrate U32 RW 5000000 CAN FD 数据段波特率
21 Nominal SP min U16 RW 750 仲裁段采样点下限,单位 0.1%;已知对端采样点时建议写成对端目标值
22 Nominal SP max U16 RW 875 仲裁段采样点上限,单位 0.1%;已知对端采样点时建议写成对端目标值
23 Data SP min U16 RW 750 CAN FD 数据段采样点下限,单位 0.1%;已知对端采样点时建议写成对端目标值
24 Data SP max U16 RW 875 CAN FD 数据段采样点上限,单位 0.1%;已知对端采样点时建议写成对端目标值
25 Nominal BRP U16 RW 0 手动仲裁段 prescaler,仅 SI7=1 生效
26 Nominal TSEG1 U8 RW 0 手动仲裁段 TSEG1,仅 SI7=1 生效
27 Nominal TSEG2 U8 RW 0 手动仲裁段 TSEG2,仅 SI7=1 生效
28 Nominal SJW U8 RW 0 手动仲裁段 SJW,仅 SI7=1 生效
29 Data BRP U16 RW 0 手动 CAN FD 数据段 prescaler,仅 SI7=1 生效
30 Data TSEG1 U8 RW 0 手动 CAN FD 数据段 TSEG1,仅 SI7=1 生效
31 Data TSEG2 U8 RW 0 手动 CAN FD 数据段 TSEG2,仅 SI7=1 生效
32 Data SJW U8 RW 0 手动 CAN FD 数据段 SJW,仅 SI7=1 生效
33 TDC offset U8 RW 0 0=自动,非 0=手动 TDCO
34 TDC filter U8 RW 0 0=自动,非 0=手动 TDCF
36 Accept non-match std U8 RW 0 标准帧未命中过滤器时的处理策略
37 Accept non-match ext U8 RW 0 扩展帧未命中过滤器时的处理策略
38 Reject remote std U8 RW 0 是否拒绝标准远程帧
39 Reject remote ext U8 RW 0 是否拒绝扩展远程帧
40 Ext ID mask U32 RW 0x1FFFFFFF 扩展 ID 全局 AND mask
41 Std list max U8 RO 64 标准过滤器最大条数
42 Ext list max U8 RO 24 扩展过滤器最大条数
43 Std current index U8 RW 0 当前编辑的标准过滤器索引
44 Ext current index U8 RW 0 当前编辑的扩展过滤器索引
45 Std entry cmd U8 RW 0 标准过滤器编辑命令
46 Ext entry cmd U8 RW 0 扩展过滤器编辑命令
47 Std entry status U8 RO 0 标准过滤器命令执行结果
48 Ext entry status U8 RO 0 扩展过滤器命令执行结果
49 Std filter count U8 RW 0 标准过滤器有效条数
50 Std filter type U8 RW 0 标准过滤器类型
51 Std filter action U8 RW 0 标准帧命中后的处理动作
52 Std filter sync U8 RW 0 标准帧 sync message 标记
53 Std ID1 U32 RW 0 标准过滤器 ID1
54 Std ID2 U32 RW 0 标准过滤器 ID2
55 Ext filter count U8 RW 0 扩展过滤器有效条数
56 Ext filter type U8 RW 0 扩展过滤器类型
57 Ext filter action U8 RW 0 扩展帧命中后的处理动作
58 Ext filter sync U8 RW 0 扩展帧 sync message 标记
59 Ext ID1 U32 RW 0 扩展过滤器 ID1
60 Ext ID2 U32 RW 0 扩展过滤器 ID2
61 RX FIFO0 op mode U8 RW 0 FIFO0 操作模式
62 RX FIFO0 size U8 RW 48 FIFO0 元素数量
63 RX FIFO1 op mode U8 RW 0 FIFO1 操作模式
64 RX FIFO1 size U8 RW 12 FIFO1 元素数量
65 RX FIFO0 data size U8 RW 7 FIFO0 元素数据区大小枚举
66 RX FIFO1 data size U8 RW 7 FIFO1 元素数据区大小枚举
67 RX buffer count U8 RW 12 RX buffer 元素数量
68 RX buffer data size U8 RW 7 RX buffer 元素数据区大小枚举
69 TX FIFO queue mode U8 RW 0 0=FIFO,1=Queue
70 TX FIFO queue size U8 RW 32 TX FIFO/Queue 元素数量
71 TX dedicated buffer count U8 RW 0 dedicated TX buffer 数量
72 TX buffer data size U8 RW 7 TX 元素数据区大小枚举
73 TX event FIFO size U8 RW 32 TX Event FIFO 元素数量
74 Timestamp selection U8 RW 0 MCAN 时间戳选择
75 Timestamp prescaler U8 RW 0 MCAN timestamp prescaler
76 TSU enable U8 RW 0 启用 TSU
77 TSU use external timebase U8 RW 0 使用外部时间基
78 TSU capture on SOF U8 RW 0 SOF 捕获
79 TSU enable 64-bit U8 RW 0 64 bit TSU
80 Pad2 U8 RO 0 保留
81 TSU prescaler U16 RW 1 TSU prescaler,最小 1
82 TSU external timebase source U8 RW 0 外部时间基来源
83 TSU TBSEL option U8 RW 0 TBSEL 选项
84 Timeout enable U8 RW 0 启用 MCAN timeout
85 Timeout select U8 RW 0 timeout 选择,0..3
86 Pad3 U16 RO 0 保留
87 Timeout period U16 RW 0 timeout 周期

通道命令与状态:

字段 说明
Apply command 0 no-op
Apply command 1 应用当前 SDO 配置到运行时 MCAN 通道
Apply status / Flash status 0 OK
Apply status / Flash status 1 fail
Apply status / Flash status 3 build fail,配置转换失败
Apply status / Flash status 4 apply runtime fail,MCAN 重启或驱动应用失败
Flash command bit0 1 保存当前通道配置到 Flash
Flash command bit1 1 从 Flash 加载通道配置
Flash command bit2 1 恢复该通道出厂默认配置

Node mode 取值:

说明
0 Normal,正常收发
1 Restricted/monitor 类调试模式,按芯片驱动支持生效
2 Internal loopback,内部回环测试
3 External loopback/listen 类调试模式,按芯片驱动支持生效

手动 bit timing 仅在 SI7 Bit timing mode = 1 时生效。自动模式下主站配置 Nominal/Data bitrate 和采样点范围,固件根据 MCAN 源时钟求解 BRP/TSEG/SJW。采样点范围应按对端设备配置:已知对端采样点时建议把 min/max 都写成目标采样点;未知时先按对端文档推荐值配置并验证收发质量。手动模式下使用 SI25..32

滤波器全局字段:

SI 名称 类型 访问 说明
36 Accept non-match std U8 RW 标准帧未命中过滤器时的处理策略
37 Accept non-match ext U8 RW 扩展帧未命中过滤器时的处理策略
38 Reject remote std U8 RW 是否拒绝标准远程帧
39 Reject remote ext U8 RW 是否拒绝扩展远程帧
40 Ext ID mask U32 RW 扩展 ID 全局 mask
41 Std list max U8 RO 标准过滤器最大条数,当前 64
42 Ext list max U8 RO 扩展过滤器最大条数,当前 24

滤波器编辑窗口:

SI 名称 类型 访问 说明
43 Std current index U8 RW 当前编辑的标准过滤器索引
44 Ext current index U8 RW 当前编辑的扩展过滤器索引
45 Std entry cmd U8 RW 对当前标准过滤器索引执行命令
46 Ext entry cmd U8 RW 对当前扩展过滤器索引执行命令
47 Std entry status U8 RO 标准过滤器命令执行结果
48 Ext entry status U8 RO 扩展过滤器命令执行结果
49 Std filter count U8 RW 有效标准过滤器数量
50 Std filter type U8 RW 标准过滤器类型
51 Std filter action U8 RW 标准帧命中后的处理动作
52 Std filter sync U8 RW 标准帧 sync message 标记
53 Std ID1 U32 RW 标准过滤器 ID1
54 Std ID2 U32 RW 标准过滤器 ID2
55 Ext filter count U8 RW 有效扩展过滤器数量
56 Ext filter type U8 RW 扩展过滤器类型
57 Ext filter action U8 RW 扩展帧命中后的处理动作
58 Ext filter sync U8 RW 扩展帧 sync message 标记
59 Ext ID1 U32 RW 扩展过滤器 ID1
60 Ext ID2 U32 RW 扩展过滤器 ID2

Entry cmd

说明
0 no-op
1 load current,将当前索引条目读入编辑窗口
2 save current,将编辑窗口写入当前索引
3 clear current,禁用当前索引条目
4 flash current,预留;当前建议使用通道 Flash command 统一保存

Entry status

说明
0 OK
1 index 无效
2 command 无效

典型过滤器配置流程:

  1. 读取 Std list max / Ext list max,确认容量。
  2. Std filter countExt filter count
  3. current index
  4. filter type/action/sync/id1/id2
  5. entry cmd = 2 保存当前索引。
  6. 重复配置多个条目。
  7. Apply command = 1 让通道配置生效。
  8. 如需掉电保存,写 Flash command bit0 = 1

RAM/FIFO/Buffer 字段:

注意:表中的 SI 是十进制子项号;很多主站界面会用十六进制显示。用户常说的 0x41/0x42/0x44 分别就是十进制 65/66/68,对应 RX FIFO0、RX FIFO1、RX Buffer 的元素数据区大小。它们只决定 MCAN Message RAM 里每个元素可容纳的最大数据字节数,不决定 PDO 中单帧 CAN FD 的 DLC;实际 DLC 仍由 RxPDO/TxPDO 帧包里的 DLC 字段决定。

SI 十进制 SI 十六进制 名称 类型 访问 推荐默认 说明
61 0x3D RX FIFO0 op mode U8 RW 0 FIFO0 操作模式,0=blocking;FIFO 满时新帧不覆盖旧帧,错误通过诊断计数观察
62 0x3E RX FIFO0 size U8 RW 48 FIFO0 元素数量;通常承载普通接收帧
63 0x3F RX FIFO1 op mode U8 RW 0 FIFO1 操作模式,0=blocking
64 0x40 RX FIFO1 size U8 RW 12 FIFO1 元素数量;可配合过滤器承载指定帧
65 0x41 RX FIFO0 data size U8 RW 7 FIFO0 每个元素的数据区枚举;CAN FD 64B 使用 7
66 0x42 RX FIFO1 data size U8 RW 7 FIFO1 每个元素的数据区枚举;CAN FD 64B 使用 7
67 0x43 RX buffer count U8 RW 12 RX buffer 元素数量;只有过滤器动作选择 RXBUF 时才直接使用
68 0x44 RX buffer data size U8 RW 7 RX buffer 每个元素的数据区枚举;CAN FD 64B 使用 7
69 0x45 TX FIFO queue mode U8 RW 0 0=FIFO,1=Queue;Queue 按 CAN ID 仲裁优先级排序
70 0x46 TX FIFO queue size U8 RW 32 TX FIFO/Queue 元素数量;当前推荐全部 TX 资源走 FIFO
71 0x47 TX dedicated buffer count U8 RW 0 dedicated TX buffer 数量;当前推荐 0,避免与 FIFO 路径混用
72 0x48 TX buffer data size U8 RW 7 TX FIFO/Buffer 每个元素的数据区枚举;CAN FD 64B 使用 7
73 0x49 TX event FIFO size U8 RW 32 TX Event FIFO 数量;建议不小于 TX FIFO/Queue 元素数

data size 使用 HPM MCAN 驱动枚举,不是字节数本身。常用枚举如下:

枚举值 最大数据字节数 典型用途
0 8B classic CAN,或只需要 8B CAN FD 的极小 RAM 配置
1 12B CAN FD 12B
2 16B CAN FD 16B
3 20B CAN FD 20B
4 24B CAN FD 24B
5 32B CAN FD 32B
6 48B CAN FD 48B
7 64B CAN FD 64B,当前推荐默认

Message RAM 预算由元素数量和 data size 共同决定。CAN FD 通用默认建议 RXFIFO0=48, RXFIFO1=12, RXBUF=12, TXFIFO=32, TXBUF=0, TXEVENT=32, data size=7;classic CAN 可把 data size 降到 0,以节省 RAM 给更多元素。配置非法或超过通道 Message RAM 预算时,Apply status 会返回错误,运行配置不会切换到新值。

Timestamp/TSU/Timeout 字段:

SI 名称 类型 访问 说明
74 Timestamp selection U8 RW MCAN 时间戳选择,0..2
75 Timestamp prescaler U8 RW MCAN timestamp prescaler
76 TSU enable U8 RW 启用 TSU
77 TSU use external timebase U8 RW 使用外部时间基
78 TSU capture on SOF U8 RW SOF 捕获
79 TSU enable 64-bit U8 RW 64 bit TSU
80 Pad2 U8 RO 保留
81 TSU prescaler U16 RW TSU prescaler,最小 1
82 TSU external timebase source U8 RW 外部时间基来源
83 TSU TBSEL option U8 RW TBSEL 选项
84 Timeout enable U8 RW 启用 MCAN timeout
85 Timeout select U8 RW timeout 选择,0..3
86 Pad3 U16 RO 保留
87 Timeout period U16 RW timeout 周期

TDC 策略:

  • CAN FD 默认 TDC enable=1
  • 数据段低于 5M 时,主站可通过 SDO 关闭 TDC。
  • 数据段达到 5M 及以上时,固件忽略 TDC enable=0 并强制开启 TDC。
  • TDC offset/filter 默认 0,表示由 HPM MCAN 驱动按实际数据段时序自动计算。
  • 非 0 的 TDC offset/filter 仍被固件保留并下发给 MCAN 驱动,供现场专家调试使用。
  • 手动覆盖时建议 offset/filter 成对配置。

13.5 0x9000..0x9003 MCAN Channel Information

该对象为 RO,方向为 S2M,用于主站按需读取通道详细状态。

SI 名称 类型 访问 说明
1 ECR raw U32 RO 错误计数寄存器
2 PSR raw U32 RO 协议状态寄存器
3 IR raw U32 RO 中断位快照
4 RXF0S raw U32 RO RX FIFO0 状态
5 RXF1S raw U32 RO RX FIFO1 状态
6 TXFQS raw U32 RO TX FIFO/Queue 状态
7 TXEFS raw U32 RO TX Event FIFO 状态
8 HPMS raw U32 RO 高优先级消息状态
9 PDO channel status U16 RO 与 PDO 头部同语义的状态字
10 RX pending count U16 RO 未饱和 RX pending
11 TX pending count U16 RO 未饱和 TX pending
12 Channel event flags U16 RO latched warning/busoff/pressure/state-change
13 RX dropped counter U32 RO PDO 打包前丢帧计数
14 TX backpressure counter U32 RO TX 队列满/背压计数
15 Bus off counter U32 RO BusOff 迁移计数
16 Detail sequence U32 RO 详情快照变化序号

13.6 0xA000..0xA003 MCAN Register Service

0xA000..0xA003 分别对应 MCAN0..MCAN3 的寄存器访问服务。该对象用于现场诊断和专家调试,不建议普通应用周期性访问。写寄存器会受白名单保护,避免误写关键地址导致总线异常。

对象 通道
0xA000 MCAN0
0xA001 MCAN1
0xA002 MCAN2
0xA003 MCAN3
SI 名称 类型 访问 说明
1 Offset U32 RW MCAN 寄存器偏移,允许范围 0x0004..0x0404
2 Command U8 RW 0=no-op,1=read,2=write
3 Status U8 RO 最近一次命令结果
4 Write value U32 RW 写命令使用的值
5 Read value U32 RO 读命令返回的值
6 Timestamp low U32 RO 命令执行时间戳低 32 bit
7 Timestamp high U32 RO 命令执行时间戳高 32 bit

Status

说明
0 OK
1 offset invalid,偏移不在允许范围或非 32 bit 对齐
2 write denied,该寄存器不在写白名单
3 busy,服务忙
4 access denied,当前状态或权限不允许访问

写白名单偏移:

Offset 寄存器 说明
0x000C DBTP Data bit timing and prescaler
0x0010 TEST Test register
0x0014 RWD RAM watchdog
0x0018 CCCR CC control
0x001C NBTP Nominal bit timing and prescaler
0x0048 TDCR Transmitter delay compensation
0x0050 IR Interrupt flags,写 1 清除
0x0054 IE Interrupt enable
0x0058 ILS Interrupt line select
0x005C ILE Interrupt line enable
0x0080 GFC Global filter configuration
0x0090 XIDAM Extended ID AND mask
0x00A8 RXF0A RX FIFO0 acknowledge
0x00B8 RXF1A RX FIFO1 acknowledge
0x00D0 TXBAR TX buffer add request
0x00D4 TXBCR TX buffer cancellation request
0x00F8 TXEFA TX event FIFO acknowledge

读寄存器流程:

  1. Offset
  2. Command = 1
  3. 读取 Status,为 0 时读取 Read value

写寄存器流程:

  1. 确认设备处于允许调试访问的状态。
  2. OffsetWrite value
  3. Command = 2
  4. 读取 Status,若为 2 表示该寄存器只允许读或不建议通过 SDO 写。

13.7 0xB000 Device Maintenance

SI 名称 类型 访问 说明
1 Access mode request U8 RW 0=run,1=engineering,2=factory
2 Access status U8 RO 当前访问状态
3 Access timeout s U16 RW 工程/工厂模式超时
4 Maintenance command U8 WO save/load/factory reset/FoE validate/FoE activate/clear diag/EEPROM rebuild
5 Maintenance status U8 RO OK/busy/denied/crc error/image invalid/flash error
6 Legacy maintenance diag flags U16 RO 兼容诊断标志位,见下表
7 Active config CRC32 U32 RO 当前配置镜像 CRC32
8 Stored config CRC32 U32 RO 已保存配置镜像 CRC32
9 FoE image size U32 RO 最近 FoE 镜像大小
10 FoE image CRC32 U32 RO 最近 FoE CRC32
11 FoE status code U32 RO 设备 FoE 状态
12 Maintenance sequence U32 RO 维护命令序号

Access mode request/status

模式 说明
0 run 默认运行模式
1 engineering 工程调试模式,可开放部分维护功能
2 factory 工厂维护模式

Maintenance command 是 bit mask。bit0..4 是传统维护命令;bit5/bit6 是独立命令,写入时必须单独写该 bit,不能与其他 bit 合并。

Bit 说明
0 保存当前配置到 Flash
1 从 Flash 加载配置
2 恢复出厂默认配置
3 FoE 镜像 validate
4 FoE 镜像 activate
5 清空运行诊断计数和 legacy 诊断标志
6 擦除 ESC EEPROM emulation 区并触发重启,重启后由固件按当前对象字典重建 EEPROM

Legacy maintenance diag flags

Bit 名称 说明
0 SHADOW_FALLBACK TxPDO shadow 安全发布进入 fallback
1 SHADOW_COPY_RETRY TxPDO shadow copy 发生 retry
2 SHADOW_SIZE_CHANGE TxPDO shadow 发布时检测到大小变化
3 RXPDO_STAGE_DROP RxPDO stage 丢弃
4 TX_RING_DROP TX ring 丢弃
5 TX_FIFO_FULL MCAN TX FIFO/Queue 满或不可写
6 SCHED_LATE_DROP 预约发送因超过相位而丢弃
7 SCHED_QUEUE_FULL 预约发送队列满
8 SCHED_TX_FAIL 预约发送下发 MCAN 失败
9 SCHED_TIMER_MISS 预约定时服务 miss

Maintenance status 常用值:

说明
0 OK
2 denied,当前访问模式或状态不允许执行

维护命令完成后 Maintenance sequence 增加。主站执行维护命令时,应先记录旧 sequence,写命令后轮询 sequence 变化和 status。

13.8 0xF000 Device Objects

主站必须读取 0xF000 能力对象后再选择 PDO profile。

该对象为 RO,方向为 S2M,用于主站识别设备能力、版本和协议上限。

SI 名称 类型 访问 默认 说明
1 Device type U8 RO runtime OTA 打包头 device[31:24],用于区分产品/设备类型:0=ECAN-Lite,非 0 为定制版本
2 Channel count U8 RO 4 MCAN 通道数
3 Capability version U16 RO 0x0001 能力对象版本
4 Hardware revision U32 RO runtime OTP word 73;仅当 OTP word 72 为 0x4543414E (ECAN) 时有效,否则为 0
5 Firmware version major U16 RO runtime OTA 打包头 version[31:16],高 8 bit 为 major,低 8 bit 为 minor
6 Firmware version minor U16 RO runtime OTA 打包头 version[15:0],完整保留 build/date 低 16 bit
7 Serial number low U32 RO runtime OTP word 74;仅当 OTP word 72 为 0x4543414E (ECAN) 时有效,否则为 0
8 Serial number high U32 RO runtime OTP word 75;仅当 OTP word 72 为 0x4543414E (ECAN) 时有效,否则为 0
9 PDO header version mask U16 RO 0x0002 支持 header version 1

PDO 能力与上限:

SI 名称 类型 访问 默认 说明
10 PDO size multiplier min U8 RO 1 最小 N
11 PDO size multiplier max U8 RO 24 最大 N
12 Encapsulation profile mask U32 RO 0x00000033 支持 profile 0/1/4/5
13 Max PDO bytes U16 RO 3072 单方向最大 PDO
14 Max CAN channels U8 RO 4 最大 CAN 通道数
15 PDO option flags mask U8 RO 0x1F 支持 TX_RESULT、ALIGN4、NO_CRC16、APP_BYPASS、PAYLOAD_ONLY
16 PDO feature flags U32 RO 0x00001F3B 支持 TX_RESULT、delta16、full64、D64、ALIGN4、RxPDO TSF 预约发送、NO_CRC16、APP_BYPASS、PAYLOAD_ONLY、FINE_BYPASS
17 PDO size unit bytes U16 RO 128 PDO 粒度
18 PDO fixed header bytes U16 RO 24 固定头部长度
19 Device service flags U32 RO 0x15 FoE、persistent parameters、access levels
20 Object extension set U16 RO 1 对象扩展集版本
21 Data path extension set U16 RO 1 数据面扩展集版本
22 Diagnostic extension set U16 RO 1 诊断扩展集版本
23 Reserved capability pad U16 RO 0 保留
24 Data path feature flags U32 RO 0x0000001F 支持 0x8030 中的 TX/RX bypass、CRC policy、payload-only、app bypass 诊断能力
25 Diagnostic feature flags U32 RO 0x0000001F 诊断测试能力位,含义同 data path feature flags
26 Runtime option flags mask U32 RO 0x00000000 运行选项掩码;当前无公开运行开关
27 Diagnostic option flags mask U32 RO 0x00000000 诊断选项掩码;当前无公开诊断开关
28 MCAN RX cache max depth U16 RO 32 固件 RX cache 最大深度
29 MCAN TX cache max depth U16 RO 64 固件 TX cache 最大深度
30 Max service budget us U16 RO 1000 数据面服务预算上限
31 Reserved capability0 U16 RO 0 保留
32 Reserved capability1 U32 RO 0 保留

Encapsulation profile mask

Bit Profile 说明
0 0 compact inline,variable DLC,无时间戳
1 1 compact inline,variable DLC,允许 delta16
4 4 compact inline,允许 D64,无时间戳
5 5 compact inline,允许 D64,允许 delta16

PDO option flags mask

Bit 名称 说明
0 TX_RESULT_ENABLE TxPDO 可生成发送结果包
1 ALIGN_4_ENABLE 帧包按 4 字节对齐
2 NO_CRC16_ENABLE 关闭固定头部 CRC16,用于性能隔离测试
3 APP_BYPASS_ENABLE 旁路真实 MCAN 应用链路,用于协议栈/PDI效率测试
4 PAYLOAD_ONLY_ENABLE 稳定 layout 下减少整包清零,只更新头部和有效 payload

PDO feature flags

Bit 名称 说明
0 TX_RESULT 支持 TX_RESULT 帧包
1 TSF_DELTA16 支持 16 bit delta 时间戳
2 TSF_DELTA32 能力位定义保留;当前默认能力值未置位
3 TSF_FULL64 支持 64 bit 时间戳字段
4 D64 支持固定 64B data window
5 ALIGN4 支持 4 字节对齐
6 STREAM_CRC32 扩展 whole-stream CRC32 能力;当前默认能力值未置位
8 RX_TSF_SCHEDULE_TX 支持 RxPDO TSF_FULL64 format=1 预约发送
9 NO_CRC16 支持关闭固定头 payload CRC16
10 APP_BYPASS 支持 PDO 应用链路旁路
11 PAYLOAD_ONLY 支持稳定 layout 下 payload-only 更新
12 FINE_BYPASS 支持细分旁路测试位,用于定位 RxPDO/TxPDO/MCAN 子链路开销

Device service flags

Bit 说明
0 支持 FoE 固件更新
2 支持配置持久化保存/加载
4 支持访问级别/工程模式控制

RxPDO 预约发送复用动态帧 TSF_FULL64 字段,不改变普通 CAN frame 包结构:

text
format:u8 = 1
flags:u8 = 0
tag:u16
offset_ns:u32

TSF_NONE 仍为立即发送;TSF_FULL64 format=1 表示预约到下一次 SYNC0 周期的 offset_ns 相位发送。同一相位按 PDO 帧顺序排队。

预约发送实现约束:

  • 主站必须先确认 0xF000:16 (0x10) 中的 RxPDO TSF 预约发送能力位。
  • offset_ns 以当前 EtherCAT DC/SYNC0 周期为参考,推荐先使用 100000ns 或更大的保守相位做 bring-up。
  • 设备按 SYNC0 相位调度预约帧;已超过目标相位的帧不会跨周期补发,主站应预留足够的 offset_ns 余量。
  • 预约发送与直接发送共用 CAN 发送路径;当通道拥塞或发送异常时,通过 PDO 状态和 SDO 诊断计数反馈。
  • 当主站停止后,ESC 过程数据区可能保持最后一帧 RxPDO 镜像;固件将完全相同的重复镜像作为幂等 no-op,不记为真实解析错误。

13.9 预约发送与直接发送实时性对比

预约发送效果依赖主站周期本身的确定性。若主站应用使用普通 usleep() 相对延时,1ms/2ms 周期会累积应用执行时间和 Linux 唤醒抖动,CAN 侧抓包会出现长尾。IgH 示例 igh_mcan_gateway_tx_probe 已改为绝对时间周期,并支持:

text
--rt-priority 80 --spin-us 100

其中 --rt-priority 将周期线程设为 SCHED_FIFO--spin-us 表示睡眠到 deadline 前 N 微秒后短自旋对齐目标时间。示例结束时会输出 master_period,应先确认主站周期稳定,再评估 CAN 侧实时性。

以下数据来自实验室参考测试:Linux IgH 物理主机,ECAN-Lite 单从站单 MCAN 通道接 CAN 分析仪,PDO=3 即 384B,CAN FD+BRS,payload 16B,发送 1000 帧,CAN 分析仪保存前 1200 帧时间戳。

模式 主站周期统计 CAN 接收数量 CAN 周期 min/max p95 p99 错误
1ms 直接发送,RT+100us spin min/max 944.384/1055.631us,max error 55.631us 999/1000 209/1859us 1036us 1570us order 1
1ms 预约 100us,RT+100us spin min/max 999.929/1000.070us,max error 0.071us 1000/1000 944/1032us 1009us 1012us 0
2ms 直接发送,RT+100us spin min/max 1983.681/2016.318us,max error 16.319us 1000/1000 1579/2493us 2016us 2081us 0
2ms 预约 100us,RT+100us spin min/max 1995.795/2004.197us,max error 4.205us 1000/1000 1986/2014us 2009us 2012us 0

结论:直接发送适合普通功能测试,CAN 发送时刻会跟随 PDO 到达和固件处理时刻;当主站周期收敛后,预约 100us 能把 CAN 释放相位稳定到 SYNC0 后固定窗口。需要稳定实时输出时,建议使用预约发送,并同时记录主站 master_period 和 CAN 分析仪时间戳。


14. 配置流程

14.1 推荐启动流程

  1. 主站进入 PREOP/SAFEOP。
  2. 读取 0xF000 能力对象。
  3. 配置 0x1C12/0x1C13,选择前 N 个 128B chunk。
  4. 0x8010/0x8011 requested profile。
  5. 0x8010:1 = 10x8011:1 = 1 应用 profile。
  6. 读取 ActivePDOBytes / ActiveFrameAreaBytes / ActiveLayoutCrc / ActiveProfileWord
  7. 对每个启用通道写 0x8001..0x8004 CAN 参数并 Apply command=1
  8. 进入 OP。
  9. OP 中只通过 PDO 收发数据;遇到错误再按需读取 SDO 详情。

14.2 切换 PDO 大小

PDO 大小影响 SM2/SM3 长度,必须在 INIT/PREOP/SAFEOP 完成。OP 中不允许改变 active PDO size、channel mask、profile、budget 或 option flags。

text
1. 从 OP 退回 SAFEOP/PREOP
2. 修改 0x1C12/0x1C13 assignment chunk count
3. 写 0x8010/0x8011 PDO size multiplier
4. Apply profile
5. 校验 active readback
6. 重新进入 OP

若 assignment chunk count 与 PdoSizeMultiplier 不一致,设备返回 Status=5 master mapping reload required,并保持旧 active profile。

14.3 CAN FD 5M 配置建议

text
FD enable       = 1
Nominal bitrate= 1000000
Data bitrate   = 5000000
TDC enable     = 1
TDC offset     = 0
TDC filter     = 0
RX/TX data size= 64B
Apply command  = 1

IgH demo 默认对 CAN FD 通道写入 TDCEnable=1, TDCOffset=0, TDCFilter=0。5M 及以上即使主站写 TDCEnable=0,固件也会强制开启。


15. IgH 主站集成指导

IgH 主站示例包可直接复用 PDO 协议层,也可以运行 10 轴 CiA402 demo 做系统 bring-up。示例命令均以进入解压后的 IgH 示例包目录后的相对路径为准。

15.1 代码层级

IgH 示例包按职责拆成三层。客户应用通常只需要选择一个最高层入口,低层由库内部继续复用。

层级 文件 适合场景 说明
Adapter include/igh_adapter.hsrc/igh_adapter.c 只需要 EtherCAT raw PDO 或自定义协议 负责 master/per-slave domain、PDO 注册、启动 SDO、DC Sync0 和 OP 状态
MCAN Port include/igh_mcan_port.hsrc/igh_mcan_port.c EtherCAT 转 CAN/CAN FD 通用应用 负责 MCAN 配置、PDO 封装解析、CAN/CAN FD 立即发送和预约发送
CiA402 Protocol include/igh_cia402_protocol.hsrc/igh_cia402_protocol.c CANopen/CiA402 电机控制 在 MCAN Port 上封装 NMT、SDO、RPDO、TPDO、SYNC 和 CSP bring-up
公共定义 include/igh_ecan_common.h 全部层级 统一返回值、默认周期、PDO 常量、MCAN 通道枚举
API 文档 API.md 二次开发 给出推荐入口、最小流程和必要函数表

示例程序只用于 bring-up 和回归测试,不建议客户业务程序直接复制 demo 主函数。推荐复用库接口:

示例 作用
examples/simple_loop.c MCAN Port 最小 CAN 收发骨架
examples/cia402_single_axis_demo.c 单轴 CiA402 bring-up
examples/cia402_10axis_demo.c 多轴 CiA402 和多从站压力验证

15.2 Linux 环境准备

推荐在物理 Linux 主机上运行 IgH。若使用虚拟机,只建议用于早期枚举和功能 bring-up;稳定周期和 DC 行为应以物理机结果为准。

基础依赖:

sh
sudo apt update
sudo apt install -y git build-essential cmake autoconf automake libtool \
  pkg-config linux-headers-$(uname -r)

IgH EtherCAT master 需要启用 generic 驱动和 hrtimer:

sh
git clone https://gitlab.com/etherlab.org/ethercat.git
cd ethercat
./bootstrap
./configure --prefix=../ethercat-install \
  --sysconfdir=../ethercat-install/conf \
  --enable-generic \
  --enable-hrtimer
make -j$(nproc) all modules
sudo make modules_install install
sudo depmod

按 IgH 安装说明配置 EtherCAT 专用网口,例如将 master0 绑定到 enp4s0,并使用 generic 驱动模块。配置完成后重启 master 并确认从站可枚举:

sh
sudo systemctl restart ethercat
sudo ethercat slaves

15.3 构建 IgH 示例包

基础构建命令:

sh
cmake -S . -B build
cmake --build build

默认 ECAN_IGH_BUILD_DEMO=AUTO。如果 CMake 找到 ecrt.hlibethercat,会生成 libecan_mcan_host.alibecan_igh_host.aigh_simple_loopigh_canopen_sdo_probeigh_cia402_single_axis_demoigh_cia402_10axis_demo;如果未找到 IgH 开发文件,则只构建 ecan_mcan_host 协议静态库,配置过程不会失败。

若使用本地 IgH 构建目录:

sh
cmake -S . -B build \
  -DECRT_INCLUDE_DIR=../ethercat/include \
  -DECRT_LIBRARY=../ethercat/lib/.libs/libethercat.so
cmake --build build -j$(nproc)

如果只需要协议静态库,不构建 IgH demo:

sh
cmake -S . -B build -DECAN_IGH_BUILD_DEMO=OFF
cmake --build build

如果需要强制构建 demo:

sh
cmake -S . -B build -DECAN_IGH_BUILD_DEMO=ON
cmake --build build

15.3.1 使用 IgH FoE OTA 更新固件

ECAN-Lite 支持 EtherCAT FoE 写入打包后的应用固件。设备侧 FoE 目标文件名固定为 ecan_lite_app,密码默认为 0。主站使用 IgH 自带 ethercat 命令即可完成更新,不依赖本目录 demo。

准备条件:

项目 要求
固件文件 使用打包后的 ecan_lite_v*.bin,不是裸 app bin
FoE 文件名 ecan_lite_app
FoE password 0
从站位置 示例默认更新当前 IgH 命令选中的从站,单从站系统通常为 position 0
EtherCAT 状态 建议从站在线且 mailbox 可用,通常 PREOP/SAFEOP/OP 均可发起 FoE

更新前先读取当前版本:

sh
sudo /opt/etherlab/bin/ethercat upload -p 0 0x100A 0 --type string
sudo /opt/etherlab/bin/ethercat upload -p 0 0xF000 5 --type uint16
sudo /opt/etherlab/bin/ethercat upload -p 0 0xF000 6 --type uint16

写入固件:

sh
sudo /opt/etherlab/bin/ethercat foe_write \
  -p 0 \
  -o ecan_lite_app \
  /tmp/ecan_lite_v140494.bin

上面命令中的 -p 0 是 FoE password,-o ecan_lite_app 是设备侧目标文件名。如果现场 IgH 工具版本对从站 position、password 或远端文件名使用不同选项,应以 ethercat foe_write --help 为准;核心参数保持不变:目标从站、password=0、远端文件名 ecan_lite_app、本地打包固件路径。

常见错误:

现象 原因与处理
Password invalid password 不是 0,或命令参数把 position/password 混淆
FoE OTA verify failed 固件不是打包格式、header 校验失败、版本/签名/CRC 不匹配
file write fail Flash 擦写或写入失败,检查供电、从站状态和固件空间
写入后版本未变化 从站尚未复位或主站未重新扫描,等待设备自动复位后重读版本

更新成功后,固件会写入空闲 APP 分区并请求复位。等待从站重新上线后,重新扫描并确认版本:

sh
sudo systemctl restart ethercat
sudo /opt/etherlab/bin/ethercat slaves
sudo /opt/etherlab/bin/ethercat upload -p 0 0x100A 0 --type string
sudo /opt/etherlab/bin/ethercat upload -p 0 0xF000 5 --type uint16
sudo /opt/etherlab/bin/ethercat upload -p 0 0xF000 6 --type uint16

15.4 二次开发接口

二次开发时先选择抽象层,不要把全部函数都暴露给业务代码。完整说明见示例包内 API.md

应用目标 推荐入口 业务侧需要关心
只操作 EtherCAT 过程数据 Adapter 从站数量、PDO 大小、raw RxPDO/TxPDO buffer
普通 CAN/CAN FD 收发 MCAN Port 通道、CAN ID、DLC、数据、立即发送或预约发送
CANopen/CiA402 电机 CiA402 Protocol 轴表、NodeID、启动流程、目标位置和状态

常规 CAN/CAN FD 网关应用优先使用 MCAN Port 层。业务代码应优先调用扁平接口 igh_mcan_port_send_can()igh_mcan_port_send_canfd()igh_mcan_port_schedule_can()igh_mcan_port_receive(),不需要先构造 igh_mcan_tx_frame_t。这样调用链最短,用户数据只在写入 RxPDO 帧区时拷贝一次,同时 PDO header、CRC、帧边界、TxPDO 解析错误等细节仍由库封装:

c
igh_mcan_tx_frame_t tx;
igh_mcan_rx_frame_t rx[32];
size_t rx_count = 0;
uint8_t data[8] = {0, 1, 2, 3, 4, 5, 6, 7};

igh_mcan_tx_frame_set_can(&tx, 0, 0, 0x123, 0, data, sizeof(data));
igh_mcan_port_exchange(&mcan, &tx, 1, rx, 32, &rx_count);

需要周期实时控制时,推荐使用 igh_mcan_port_cycle_begin()igh_mcan_port_receive()igh_mcan_port_send_can/canfd()igh_mcan_port_schedule_can/canfd()igh_mcan_port_cycle_end() 组成固定周期。igh_mcan_tx_frame_set_*()igh_mcan_port_send()igh_mcan_port_exchange() 只保留给批量发送、bring-up、测试脚本或旧代码兼容。

最小 CAN 收发示例:

sh
sudo ./build/igh_simple_loop

CANopen SDO 探测示例:

sh
sudo ./build/igh_canopen_sdo_probe \
  --node 1 \
  --index 0x1000 \
  --sub 0 \
  --bitrate 1000000

15.5 不使用 demo 的 IgH 集成流程

如果客户不运行 igh_simple_loopigh_cia402_*_demo,而是在自己的主站程序中集成 ECAN-Lite,推荐仍复用 IgH 示例包中的三层接口。demo 只是一份可运行样例,真正需要移植到客户程序里的流程应拆成“主站配置、MCAN 通道配置、周期收发、业务协议处理”四部分。

15.5.1 推荐接入方式

接入方式 适用场景 说明
MCAN Port API 常规 EtherCAT 转 CAN/CAN FD 应用 推荐方式。应用只配置从站数量、PDO 大小、通道、波特率,然后使用 igh_mcan_port_send_can()igh_mcan_port_receive() 收发 CAN 帧。
CiA402 Protocol API EtherCAT 转 CANopen 控制电机 在 MCAN Port API 上继续复用 igh_cia402_protocol,应用负责轴表和运动策略,不需要自己拼 NMT、SDO、RPDO、SYNC 报文。
Raw PDO API 客户需要完全自定义 PDO payload 高级方式。应用直接拿到 RxPDO/TxPDO byte buffer,自行按第 5 章 PDO 格式封装和解析。

常规项目优先选择 MCAN Port API。这样即使不使用 demo,也可以避免把 demo 的长流程复制到业务代码中。

15.5.2 从零配置一个 IgH 应用

步骤 1:扫描 EtherCAT 拓扑,确认 ECAN-Lite 的从站位置。

sh
sudo ethercat slaves

步骤 2:选择 PDO 大小、周期和通道。首次调试建议从 1 个从站、1 个 MCAN 通道、cycle_us=10000 开始;classic CAN 或 CiA402/CANopen 电机场景从 pdo-n=3 起步,CAN FD 尤其是 64B 载荷或多通道突发场景从 pdo-n=8 起步;确认 OP 和 CAN 收发稳定后,再增加从站、通道和周期压力。

步骤 3:创建 IgH 通用配置。

c
ecan_igh_config_t igh_config;
ecan_igh_default_config(&igh_config);
ecan_igh_config_set_slave_count(&igh_config, 1);
ecan_igh_config_set_cycle_us(&igh_config, 10000);
ecan_igh_config_set_pdo_multiplier(&igh_config, 3); /* 3 * 128B */

多从站且 PDO 大小不同时,使用 ecan_igh_config_set_slave_pdo_multiplier() 分别配置。例如前两个从站使用 N=6,第三个从站只启用两路 MCAN 时可使用 N=3

步骤 4:创建 MCAN 通道配置,并写入启动 SDO 队列。

c
igh_mcan_port_config_t mcan_config;
igh_mcan_port_default_config(&mcan_config);
igh_mcan_port_set_channel_mask(&mcan_config, 0, 0x01, 0x00);
igh_mcan_port_set_classic_channel(&mcan_config, 0, 0, 1000000);
igh_mcan_port_apply_config(&igh_config, &mcan_config);

IgH 通用层会按 PDO 倍数注册前 N 个 PDO chunk,并配置 0x1C12/0x1C13igh_mcan_port_apply_config() 会追加 ECAN-Lite 运行所需的启动 SDO,包括 0x8010/0x8011 的 PDO profile、通道掩码、PDO 长度,以及 0x8001..0x8004 的 MCAN 波特率和 CAN FD 参数。

步骤 5:初始化主站、MCAN Port,并等待从站进入 OP。

c
ecan_igh_context_t igh;
igh_mcan_port_t mcan;

ecan_igh_init(&igh, &igh_config);
igh_mcan_port_init(&mcan, &igh, &mcan_config);
ecan_igh_wait_op_timeout(&igh, 10000);

步骤 6:在应用周期中完成一次 EtherCAT/CAN 交换。

c
uint8_t data[8] = {0};
igh_mcan_rx_frame_t rx[32];
size_t rx_count = 0;

igh_mcan_port_cycle_begin(&mcan);
igh_mcan_port_receive(&mcan, rx, 32, &rx_count);
igh_mcan_port_send_can(&mcan, 0, 0, 0x123, 0, data, sizeof(data));
igh_mcan_port_cycle_end(&mcan);

步骤 7:给周期线程增加实时配置。Linux 上建议至少设置 SCHED_FIFOmlockall()、固定运行 CPU,并把 IgH 主服务和网卡中断放在规划好的 RT 核心上。周期可以先使用 5ms 或 2ms,稳定后再评估 1ms。

步骤 8:增加运行时检查。每个周期应监控 domain working counter、ecan_igh_domain_is_complete()、从站 OP 状态、MCAN Port 解析错误和 TxPDO header。出现 domain_complete=0 时不要继续推进运动目标,应保持上一周期输出或进入安全停发逻辑。

15.5.3 不使用 MCAN Port API 时的手动配置

Raw PDO 方式下,应用需要自行完成两类工作:

  1. PDO 映射选择:按第 5 章规则,把 RxPDO/TxPDO 的 chunk 加入 0x1C12/0x1C13。每个 chunk 是 128B,pdo-n=N 表示选择 0x1600..0x160(N-1)0x1A00..0x1A(N-1)

  2. ECAN-Lite 运行参数:写入 0x8010/0x80110x8001..0x8004。最小配置应包含通道掩码、PDO 长度、profile 和每个 MCAN 通道的 nominal/data bitrate。配置完成后,通过 0x8010:02 (0x02)、0x8011:02 (0x02) 或 0x9000 读取 active profile 和状态,确认固件已经按预期生效。

Raw PDO 周期交换时,使用以下接口拿到 buffer:

c
uint8_t *rxpdo = NULL;
const uint8_t *txpdo = NULL;
size_t rxpdo_size = 0;
size_t txpdo_size = 0;

ecan_igh_get_rxpdo_buffer(&igh, slave_index, &rxpdo, &rxpdo_size);
ecan_igh_get_txpdo_buffer(&igh, slave_index, &txpdo, &txpdo_size);

rxpdo 是主站输出到 ECAN-Lite 的数据,txpdo 是 ECAN-Lite 返回给主站的数据。建议仍使用 igh_mcan_pdo_writer_*igh_mcan_pdo_parse_frames_ex() 辅助封装/解析,避免客户应用重复实现 PDO header、CRC、offset 和帧边界处理。

15.5.4 不使用 CiA402 demo 控制电机

电机项目也不必直接运行 igh_cia402_single_axis_demoigh_cia402_10axis_demo。客户应用可以复用协议层:

  1. 先按 15.5.2 完成 IgH 和 MCAN Port 初始化。
  2. 使用 igh_cia402_axis_init() 建立轴表,描述每个电机所在的从站、MCAN 通道、NodeID 和目标步进。
  3. 使用 igh_cia402_context_init() 绑定 MCAN Port 与轴表。
  4. 启动阶段调用 igh_cia402_send_nmt_all()igh_cia402_configure_csp_all_timeout()igh_cia402_request_actual_position_all_timeout()igh_cia402_enable_all() 完成 NMT、CSP 映射、实际位置读取和 CiA402 使能。
  5. 运动周期中调用 igh_cia402_process_rx() 处理 TPDO/SDO/heartbeat,再调用 igh_cia402_send_targets_all()igh_cia402_send_target_step() 发送目标位置。
  6. 如果需要预约发送,先启用 DC Sync0,再调用 igh_cia402_set_scheduled_tx();RPDO 目标和 SYNC 可以独立预约。

这样 demo 只作为 bring-up 和回归测试工具,客户自己的程序仍然可以沿用相同的启动、收发、诊断和预约能力。

15.6 运行 CiA402 demo

单电机 bring-up 示例默认使用从站 0、MCAN0、NodeID 1、1Mbps;首次 bring-up 建议显式使用 --step 0,避免主动运动:

sh
sudo ./build/igh_cia402_single_axis_demo \
  --bitrate 1000000 \
  --cycle-us 10000 \
  --cycles 20 \
  --step 0

单板 CAN FD 或全量容量 bring-up 可显式使用 1024B PDO、较长周期和 1 个从站;classic CAN/CiA402 bring-up 通常保持 --pdo-n 3

sh
sudo ./build/igh_cia402_10axis_demo \
  --slaves 1 \
  --pdo-n 8 \
  --cycle-us 10000 \
  --cycles 10000

系统稳定后再缩短周期,例如 1ms:

sh
sudo ./build/igh_cia402_10axis_demo \
  --slaves 1 \
  --pdo-n 3 \
  --cycle-us 1000 \
  --cycles 10000 \
  --dc-sync0 \
  --dc-cycle-us 1000 \
  --dc-shift-us 700

常用参数:

参数 说明
--slaves N 参与 demo 的 ECAN-Lite 从站数量,默认 3
--pdo-n 1..24 PDO 大小倍数,总字节数为 128*N;CiA402/classic CAN 建议从 3 起步,CAN FD 建议从 8 起步
--cycle-us N EtherCAT 过程数据周期
--cycles N demo 运行周期数
--motion-div N 10 轴 demo 目标帧发送降频;默认 1,即每个 EtherCAT 周期发送一次,设置 2 时 CAN 目标帧周期为 EtherCAT 周期的 2 倍
--profile N PDO 封装 profile
--align4 帧包按 4 字节对齐
--skip-sdo-config 跳过启动 SDO 配置,适合重复调试
--dc-sync0 启用 DC Sync0
--dc-cycle-us N DC Sync0 周期;默认跟随 --cycle-us
--dc-shift-us N DC Sync0 shift;物理机上需结合 OP 稳定性调整

启动阶段 demo 会写入 PDO profile、通道配置和 CAN FD TDC 默认值。TDCOffset=0TDCFilter=0 表示固件按数据段时序自动计算;数据段达到 5M 及以上时固件强制启用 TDC。

15.6.1 IgH 三从站参考稳定点

以下为当前产品化 IgH adapter(per-slave domain)、三从站、CRC16 默认开启、base 模式、root + SCHED_FIFO + 绑核条件下的参考长测点。短测结果只用于筛选相位,产品配置应以 2 分钟或更长长测为准。

模式 周期 PDO 配置 推荐 shift 结论
SM/free 1ms 384B / 512B / 640B 无 DC shift 2 分钟稳定点
SM/free 2ms 768B / 1280B 无 DC shift 2 分钟稳定点
DC Sync0 1ms 384B 700us 或 800us 2 分钟稳定点
DC Sync0 1ms 512B 0us 2 分钟稳定点
DC Sync0 1ms 640B 450us / 650us / 800us 2 分钟稳定点
DC Sync0 2ms 768B 600us 2 分钟稳定点
DC Sync0 2ms 1280B 1600us 2 分钟稳定点

以上结果是参考边界,不等同于所有主机、网卡和线缆组合的保证值。若扩展到更大 PDO 或更多真实 CAN 负载,应同时观察 WKC、OP 状态、TxPDO header、0x9011 周期诊断和 0x9020..0x9023 每通道数据面诊断。

15.7 SII/EEPROM 与 SM 布局检查

设备 EEPROM/SII 必须保持大 PDO 单缓冲布局,否则 IgH OP/DC 运行会被错误 SM 配置干扰:

项目 要求
SM2 Outputs 起始 0x1100,大小 3072,ControlByte 0x66
SM3 Inputs 起始 0x1D00,大小 3072,ControlByte 0x22
PDO chunk 0x1C12/0x1C13 选择前 N 个 128B chunk

可用脚本手动检查:

sh
sudo scripts/ecan_sii_sm_layout.sh check \
  --ethercat ../ethercat-install/bin/ethercat \
  --position 0 \
  --pdo-bytes 3072

需要修复时必须人工确认后再执行:

sh
sudo scripts/ecan_sii_sm_layout.sh fix \
  --ethercat ../ethercat-install/bin/ethercat \
  --position 0 \
  --pdo-bytes 3072

16. 调试与诊断

16.1 OP 异常

优先检查:

  • EEPROM/SII 中 SM2/SM3 是否为 0x1100/0x1D00、3072B、0x66/0x22
  • 0x1C12/0x1C13 assignment 数量是否与 0x8010/0x8011 PDO size multiplier 一致。
  • IgH adapter 是否使用 per-slave domain/FMMU 分段策略;旧示例或旧 master 再考虑大 PDO/FMMU 补丁。
  • DC shift 是否过小;输出数据未赶在 Sync0 前到达会造成 WC miss 或掉 OP。

16.2 PDO 解析错误

查看:

  • 0x8010/0x8011 Status
  • LastPDOError
  • PDOErrorCounter
  • PDOOverflowCounter
  • IgH 协议层 parse_diag,包含 offset、packet_end、ctrl、seq、payload_len、payload_crc16、layout_id、ch、dlc、tsf、kind。

16.3 CAN 总线异常

查看:

  • PDO header 中 channel_status
  • 0x9000..0x9003 的 ECR/PSR/IR/RXF0S/RXF1S/TXFQS/TXEFS
  • 外部 CAN 工具的错误计数和终端电阻状态
  • 波特率、采样点、TDC、CAN FD BRS 是否与对端一致

17. 验证结果数据

验证环境:

项目
主站 Ubuntu 26.04 物理机
EtherCAT 口 enp4s0
IgH 1.6.9
从站 ECAN-Lite,1 台
项目 结果数据
PDO 配置 TxPDO/RxPDO 均为 1024B
EtherCAT 周期 10ms
CAN FD 配置 仲裁段 1Mbps,数据段 5Mbps,BRS 开启
双向 CAN FD 通信 通过
PDO 解析错误 0
发送丢弃 0
双向数据错误 0
设备恢复状态 正常

18. 技术规格

参数 规格
主控 HPMicro HPM5E00 系列 RISC-V MCU
EtherCAT 2 端口,100Mbps,CoE/FoE
CAN 4 路 MCAN
CAN 协议 CAN 2.0A/B,CAN FD ISO
CAN FD 数据域 最大 64B
推荐 PDO Classic CAN 384B/方向起步;CAN FD 1024B/方向起步
最大 PDO 3072B/方向
PDO 粒度 128B
PDO 固定头部 24B
PDO 封装 2B 控制字 + CAN ID + 可选时间戳 + Data
标准 ID 字段 2B
扩展 ID 字段 4B
时间戳/预约封装 off / delta16,delta32/full64;RxPDO full64 format=1 用于 SYNC0 相位预约
TDC 默认开启,5M 及以上强制开启
参数持久化 Flash 配置镜像,CRC32
固件维护 FoE 支持
CPU / mchtmr CPU 400MHz,mchtmr 24MHz

19. 修订历史

版本 日期 说明
V2.2 2026-05 增加 SYNC0 预约发送说明、直接/预约发送实时性对比、板级时钟和配置默认值说明
V2.1 2026-04 增加 IgH 主站集成指导、PDF 生成说明和 CANFD 双向数据核对记录
V2.0 2026-04 重写为动态 PDO 两层封装协议,移除旧固定槽说明

Copyright (c) 2026 LanMotion.