首页 / 驱动算法 / EtherCAT专题

EtherCAT EEPROM 作用详解:从站 SII 的"灵魂芯片"

从站三件套里的 SII(Slave Information Interface)就是接在 ESC 上的一颗串行 EEPROM——没有它,ESC 不知道自己是什么接口、主站认不出你是谁、过程数据也没有默认映射。本文拆解 EEPROM 在从站里的完整作用:上电那一刻 ESC 硬件如何加载配置字、SII 的类别布局(F0~FF)每一段存了什么、厂商身份/PDO 默认值/DC 能力为什么都放这里、主站通过 0x0500 寄存器组怎么读写,最后给出可编译的 SII 读写 C 模块与量产避坑清单。

1. EEPROM 在从站里的位置:SII 的载体

一个 EtherCAT 从站的硬件三件套:ESC(EtherCAT Slave Controller,通信芯片)、MCU(跑应用固件)、SII(Slave Information Interface,从站信息接口)。SII 不是一块独立电路,它的物理载体就是一颗 I²C 串行 EEPROM(24Cxx 系列,容量 1~8 KB),挂在 ESC 的 EEPROM 接口上:

部件角色关键点
ESC硬件级"飞读飞写":处理 EtherCAT 帧、SM/FMMU/DC复位后自动读 EEPROM,不需要 MCU 参与
MCU跑应用固件:对象字典、FOC、IO 逻辑通过 PDI 接口(SPI/并行/数字IO)与 ESC 交换过程数据
EEPROM(SII)存"我是谁、我是什么接口、我默认怎么收发"掉电保持;主站可远程改写;容量 1~8 KB 足够

为什么要用外部 EEPROM而不是 MCU 内部 Flash?三个硬理由:

  • ESC 独立于 MCU 启动:上电时 ESC 先于(甚至不依赖)MCU 固件运行,它需要自己就能读到的配置——EEPROM 是 ESC 的私有只读存储器;
  • 掉电保持 + 可远程改写:主站通过 EtherCAT 帧就能改 EEPROM 内容(改默认 PDO、改名字),固件烧死做不到;
  • 解耦:换 MCU/换固件不动 EEPROM,量产一台从站只要烧一次 EEPROM + 一次固件,两份内容各自独立演进。

2. 上电那一刻:ESC 为什么必须先读 EEPROM

ESC 上电/复位后的第一步不是联网,而是从 EEPROM 读取前 8 字节(4 个 word)的"ESC 配置字",用它配置内部结构。这 8 个字节定义了从站的"物理人格":

地址内容含义
Word 0(0x0000)PDI 类型与控制bit0-3:PDI 接口类型(0=数字IO、1=SPI、2/4/5/6=并行/复用 μC 接口);bit4-7:PDI 控制
Word 1(0x0002)SM / FMMU / DC 数量bit0-3:同步管理器 SM 数量;bit4-7:FMMU 数量;bit8-11:分布时钟配置
Word 2(0x0004)PDI 中断配置bit0-7:中断掩码(过程数据/邮箱/状态中断使能)
Word 3(0x0006)PDI 详细配置与 PDI 类型相关(如 SPI 的片选极性、数字IO 的输入输出长度)

典型的 SPI 接口从站配置字:Word0=0x0001(PDI=SPI)、Word1=0x0034(SM×4、FMMU×3)、Word2=0x0007(三类中断全开)、Word3=0x0000。

⚠️ EEPROM 没写对 = 从站"脑瘫"

ESC 配置字写错或不写,从站会用默认/错误模式启动:PDI 接口对不上(MCU 用 SPI 收、ESC 按数字IO 发)、SM 数量不够(邮箱+过程数据塞不下)、中断不触发——主站能连上但数据全是错的,这是从站开发里最难查的一类问题。所以 EEPROM 的作用第一条就是:它是 ESC 的"BIOS",上电读错一步,后面全白搭。

3. SII 布局:地址空间与类别编码

前 8 字节之后,EEPROM 剩余空间存的是SII 类别(category)流——一段段"带标签的数据块",从地址 0x0008 开始按顺序排,直到结束标记。每段的头部固定两个 word:

SII 类别段头部(word 级)

word0 = 类别码(0xF0xx ~ 0xFFxx) | word1 = 本段长度(字节,含头部)

数据从第 3 个 word 开始。主站/工具按头部逐段跳读,跳过不认识的类别——这是 SII"向后兼容"的结构基础

类别码内容谁在读
F0h以太网端口信息:端口数量、每端口物理类型(100BASE-TX / FX / E-Bus LVDS)主站:判断拓扑能力、环网/端口数
F1hESC 配置:SM 数量、FMMU 数量、中断掩码等(与前 8 字节互补)主站/从站栈:核对 ESC 能力
F2h字符串:厂商名、产品名、序列号(UTF-8)主站:显示与匹配
F3h制造商信息:厂商 ID、产品代码、版本号(各 4 字节)主站:识别设备 → 加载 ESI
F4h请求的 TxPDO 配置(从站 → 主站的过程数据默认映射)主站:初始化时建输入过程数据
F5h请求的 RxPDO 配置(主站 → 从站)主站:初始化时建输出过程数据
F8h附加信息:DC 分布式时钟支持等能力位主站:判断同步方案
F9h附加制造商信息(自定义扩展区)厂商私有
FChSII 信息:SII 版本/兼容性标记工具:校验
FDh备份信息工具:恢复
FEhE-Bus 供电能力主站:供电预算计算
FFh结束标记:SII 读到此处为止所有读方

布局顺序上,规范允许从 F0h 或 FCh 起头,之后任意顺序排段,FFh 收尾。具体偏移以所选 ESC 手册和从站栈工具(SSC)生成的布局为准——结构是标准化的,内容是自己家的。

4. 身份三件套:主站凭什么认出你(F3 + F2)

主站上电扫描从站时,第一件事就是读 EEPROM 里的身份信息:

字段大小示例用途
厂商 ID4 字节0x00000001(倍福)区分厂商,主站据此找驱动
产品代码4 字节0x12345678区分同厂商的不同型号
版本号4 字节0x00010001固件/硬件版本,兼容性判断
厂商名 / 产品名 / 序列号字符串(F2)"GPIO Motion" / "YWD-60" / SN123显示、资产登记、日志可读
✅ 主站识别流程

读 F3 厂商 ID + 产品码 + 版本 → 在 ESI 文件库(厂商提供的 XML 设备描述文件)里查匹配项 → 找到后加载该 ESI 的 SM 配置、PDO 映射、DC 参数 → 按 ESI 把从站拉进配置。所以:EEPROM 里写什么,直接决定主站用哪套配置伺候你。改产品码而没改 ESI,主站会"认不出";版本号不一致会导致驱动告警。

5. 端口、ESC 配置与 DC 能力(F0 / F1 / F8)

类别存什么为什么重要
F0 端口信息端口数 + 每端口物理类型(TX/FX/LVDS)与状态主站据此判断:这是几个口的从站、能不能进环网、两线制能不能用
F1 ESC 配置SM/FMMU 数量、中断掩码、PDI 控制字(与前 8 字节冗余互补)核对 ESC 实际能力,防止固件/配置超卖
F8 附加信息DC 支持位、是否支持分布式时钟、同步单元数量主站决定用 DC 同步还是帧同步(SM 事件);多轴应用没它就没法同步

这几段决定了主站对你"能力天花板"的认知:说你有 2 个端口、结果板上只有一个 PHY,主站组环网时会失败;说你不支持 DC,多轴同步只能退回帧同步,精度掉一个数量级。EEPROM 在这里的作用是:如实申报硬件能力。

6. F4 / F5 请求 PDO:过程数据默认值为什么也放 EEPROM

从站出厂支持的输入/输出过程数据(Tx/Rx PDO)映射,默认值就写在 EEPROM 的 F4/F5 段里。主站上电初始化时先按它建过程数据,然后才轮到 CoE 的 PDO 分配(0x1C10/0x1C11)覆盖:

  • 默认映射:EEPROM 里存了"请求的 PDO"——比如一个伺服默认输出 0x6041 状态字 + 0x6064 实际位置(TxPDO),输入 0x6040 控制字 + 0x607A 目标位置(RxPDO);
  • 可覆盖:主站运行中可经 CoE 改 PDO 映射(重新分配 0x1A00/0x1600 系列),改完从站按新映射收发光;
  • 为什么放 EEPROM 而不烧死在固件里:默认值要"开箱即用"且可被主站改、可被工具重写——EEPROM 正是主站能碰、固件不依赖的公共约定区(详见本站《EtherCAT PDO 详解》第 9 篇,两者配合看更完整)。

7. 主站怎么访问 EEPROM:0x0500 寄存器组与 I²C 时序

主站读从站 EEPROM 不是直接去拨 I²C,而是通过 ESC 的SII 访问寄存器(相对 ESC 基地址的偏移):

偏移名称作用
0x0500SII 控制 / 状态写命令位:读请求/写请求/重载;读状态位:忙、错误、加载完成
0x0504SII 地址要访问的 EEPROM 地址(word 或字节,取决于模式)
0x0508SII 数据读出的数据(写模式先写数据再发写命令)
一次读操作的寄存器序列

① 写 0x0504 目标地址 → ② 写 0x0500 读请求位 → ③ 轮询 0x0500 忙标志清零 → ④ 读 0x0508 得到数据

写操作:① 写 0x0504 地址 → ② 写 0x0508 数据 → ③ 写 0x0500 写请求位 → ④ 轮询完成。具体位定义以 ESC 手册为准(ET1100/LAN9252/AX58100 略有差异)

主站工具(TwinCAT、EC-Engineer、开源 IgH/SOEM 的 sii 工具)都封装了这套时序;从站调试时也可以用 I²C 编程器直接离线读写 EEPROM 验证内容。

8. 交互演示:EEPROM 前 8 字节位域分解

点击下面的 bit 开关,看 ESC 配置字如何决定从站"人格"——默认是典型 SPI 从站(Word0=0x0001 · Word1=0x0034 · Word2=0x0007):

ESC 配置字位域分解(EEPROM 前 8 字节,点击 bit 翻转)
PDI 类型:SPI(1)· SM 数量:4 · FMMU 数量:3 · 中断掩码:0x07(过程数据+邮箱+状态)

观察要点:

  • 改 Word0 的 bit0-3:从站 PDI 从 SPI 变成数字 IO/并行接口——MCU 侧的接线与固件必须同步换;
  • 改 Word1 的 SM 数量:少于 4 个时邮箱(SM0/1)+过程数据(SM2/3)会挤占,主站配置会报"SM 不足";
  • 改 Word2 中断掩码:关掉过程数据中断,MCU 只能靠轮询收数据,实时性下降。

9. 代码实现(C语言,可编译模块)

SII 读写就是"寄存器三步走",下面是精简版模块(按 ET1100 风格寄存器偏移,其他 ESC 只改基址宏):

/* sii.c — EtherCAT 从站 EEPROM(SII) 读写模块(精简) */ #include <stdint.h> #include <stddef.h> typedef struct { volatile uint16_t* base; /* ESC 寄存器基地址 */ } esc_t; /* ESC 寄存器偏移 */ #define ESC_SII_CTL 0x0500u /* 控制/状态 */ #define ESC_SII_ADDR 0x0504u /* 地址 */ #define ESC_SII_DATA 0x0508u /* 数据 */ #define SII_CMD_READ 0x0001u /* 读请求位(以手册为准) */ #define SII_CMD_WRITE 0x0002u /* 写请求位 */ #define SII_STAT_BUSY 0x0800u /* 忙标志 */ static inline uint16_t esc_rd(const esc_t* e, uint16_t off) { return e->base[off / 2]; } static inline void esc_wr(esc_t* e, uint16_t off, uint16_t v) { e->base[off / 2] = v; } /* 读一个 word;返回 0=成功 */ int sii_read_word(esc_t* e, uint16_t addr, uint16_t* out) { esc_wr(e, ESC_SII_ADDR, addr); esc_wr(e, ESC_SII_CTL, SII_CMD_READ); uint16_t ctl; for (int i = 0; i < 1000; i++) { ctl = esc_rd(e, ESC_SII_CTL); if (!(ctl & SII_STAT_BUSY)) break; } if (ctl & SII_STAT_BUSY) return -1; /* 超时 */ *out = esc_rd(e, ESC_SII_DATA); return 0; } /* 写一个 word;返回 0=成功 */ int sii_write_word(esc_t* e, uint16_t addr, uint16_t v) { esc_wr(e, ESC_SII_ADDR, addr); esc_wr(e, ESC_SII_DATA, v); esc_wr(e, ESC_SII_CTL, SII_CMD_WRITE); uint16_t ctl; for (int i = 0; i < 1000; i++) { ctl = esc_rd(e, ESC_SII_CTL); if (!(ctl & SII_STAT_BUSY)) break; } if (ctl & SII_STAT_BUSY) return -1; return 0; } /* 上电读取 ESC 配置字(前 8 字节 → 4 word) */ int sii_load_esc_config(esc_t* e, uint16_t cfg[4]) { for (int i = 0; i < 4; i++) if (sii_read_word(e, (uint16_t)(i * 2), &cfg[i])) return -1; return 0; }

应用侧检查:Word1 的 SM 数量 = cfg[1] & 0x000F,FMMU 数量 = (cfg[1] >> 4) & 0x000F,与从站栈初始化参数比对,不一致直接报错拒绝启动——把"EEPROM 写错"挡在开发期。

10. 写坏、恢复与量产避坑清单

EEPROM 是主站可写的——意味着调试时也可能被写坏。经典症状:从站上电主站"认不出"、型号显示为 0x00000000、或配置到一半报 SM/PDO 错误。恢复路径按优先级:

手段适用说明
主站工具重写从站还能被识别TwinCAT 的 SII 编辑器 / IgH sii_tool 重新烧录备份文件
I²C 编程器直烧彻底认不出/ESC 报错拆下 EEPROM(或在线)用编程器写入备份 bin;注意 24Cxx 器件型号别选错
出厂默认恢复开发板有恢复位部分 ESC 支持"EEPROM 加载失败用默认配置"开关,配合重写
坑现象对策
前 8 字节配置字写错PDI 对不上 / SM 不足 / 中断不触发用 SSC/评估工具生成配置字模板,别手写
F3 身份与 ESI 不匹配主站认不出或加载错驱动厂商 ID/产品码/版本三件套与 ESI 文件逐字段核对
类别段长度/结束标记缺失SII 读到乱码、后续类别失效每段头部 word1 长度含头部 4 字节;FFh 收尾必须存在
EEPROM 容量选小F4/F5 或字符串存不下、写入溢出字符串多/PDO 多选 32/64 Kbit;SSC 会给出最小容量建议
量产烧录不一致同型号从站行为不同EEPROM 内容固化为 bin 归档 + CRC 校验 + 批量工具统一烧
调试中反复写 EEPROM器件寿命/数据损坏24Cxx 擦写寿命约百万次,调试期尽量用"内存仿真"(部分主站支持运行时覆盖不落盘)

一句话收尾:EEPROM 在 EtherCAT 从站里不是"存点参数的附件",而是ESC 的启动配置 + 主站的身份认知 + 过程数据的出厂默认值三位一体——从站能不能被正确配置、稳定运行、批量复现,一半的答案在这颗 24Cxx 里。