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。
ESC 配置字写错或不写,从站会用默认/错误模式启动:PDI 接口对不上(MCU 用 SPI 收、ESC 按数字IO 发)、SM 数量不够(邮箱+过程数据塞不下)、中断不触发——主站能连上但数据全是错的,这是从站开发里最难查的一类问题。所以 EEPROM 的作用第一条就是:它是 ESC 的"BIOS",上电读错一步,后面全白搭。
3. SII 布局:地址空间与类别编码
前 8 字节之后,EEPROM 剩余空间存的是SII 类别(category)流——一段段"带标签的数据块",从地址 0x0008 开始按顺序排,直到结束标记。每段的头部固定两个 word:
word0 = 类别码(0xF0xx ~ 0xFFxx) | word1 = 本段长度(字节,含头部)
数据从第 3 个 word 开始。主站/工具按头部逐段跳读,跳过不认识的类别——这是 SII"向后兼容"的结构基础
| 类别码 | 内容 | 谁在读 |
|---|---|---|
| F0h | 以太网端口信息:端口数量、每端口物理类型(100BASE-TX / FX / E-Bus LVDS) | 主站:判断拓扑能力、环网/端口数 |
| F1h | ESC 配置:SM 数量、FMMU 数量、中断掩码等(与前 8 字节互补) | 主站/从站栈:核对 ESC 能力 |
| F2h | 字符串:厂商名、产品名、序列号(UTF-8) | 主站:显示与匹配 |
| F3h | 制造商信息:厂商 ID、产品代码、版本号(各 4 字节) | 主站:识别设备 → 加载 ESI |
| F4h | 请求的 TxPDO 配置(从站 → 主站的过程数据默认映射) | 主站:初始化时建输入过程数据 |
| F5h | 请求的 RxPDO 配置(主站 → 从站) | 主站:初始化时建输出过程数据 |
| F8h | 附加信息:DC 分布式时钟支持等能力位 | 主站:判断同步方案 |
| F9h | 附加制造商信息(自定义扩展区) | 厂商私有 |
| FCh | SII 信息:SII 版本/兼容性标记 | 工具:校验 |
| FDh | 备份信息 | 工具:恢复 |
| FEh | E-Bus 供电能力 | 主站:供电预算计算 |
| FFh | 结束标记:SII 读到此处为止 | 所有读方 |
布局顺序上,规范允许从 F0h 或 FCh 起头,之后任意顺序排段,FFh 收尾。具体偏移以所选 ESC 手册和从站栈工具(SSC)生成的布局为准——结构是标准化的,内容是自己家的。
4. 身份三件套:主站凭什么认出你(F3 + F2)
主站上电扫描从站时,第一件事就是读 EEPROM 里的身份信息:
| 字段 | 大小 | 示例 | 用途 |
|---|---|---|---|
| 厂商 ID | 4 字节 | 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 基地址的偏移):
| 偏移 | 名称 | 作用 |
|---|---|---|
| 0x0500 | SII 控制 / 状态 | 写命令位:读请求/写请求/重载;读状态位:忙、错误、加载完成 |
| 0x0504 | SII 地址 | 要访问的 EEPROM 地址(word 或字节,取决于模式) |
| 0x0508 | SII 数据 | 读出的数据(写模式先写数据再发写命令) |
① 写 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):
观察要点:
- 改 Word0 的 bit0-3:从站 PDI 从 SPI 变成数字 IO/并行接口——MCU 侧的接线与固件必须同步换;
- 改 Word1 的 SM 数量:少于 4 个时邮箱(SM0/1)+过程数据(SM2/3)会挤占,主站配置会报"SM 不足";
- 改 Word2 中断掩码:关掉过程数据中断,MCU 只能靠轮询收数据,实时性下降。
9. 代码实现(C语言,可编译模块)
SII 读写就是"寄存器三步走",下面是精简版模块(按 ET1100 风格寄存器偏移,其他 ESC 只改基址宏):
应用侧检查: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 里。