第1章:EEPROM数据结构解析
各位同学,今天我们来聊聊EtherCAT从站EEPROM的数据结构。说实话,这块内容我当年刚接触时也绕了不少弯路。EEPROM看似简单,但里面的门道真不少。你想想看,一个只有几KB的存储空间,要承载从站所有的配置信息,这布局设计得有多精巧。
1.1 EEPROM总体布局
EEPROM的存储空间,说白了就是一张精心规划的地图。从0x0000地址开始,一直到0xFFFF结束(有些从站可能只有4KB或8KB)。我习惯把这张地图分成几个区域:
- ESC寄存器配置区(0x0000-0x003F):64字节,这是硬性规定
- 标准配置区(0x0040-0x007F):也是64字节,存放基础参数
- 字符串区(0x0080开始):产品名称、厂商信息等文本
- SII配置区:同步管理器、FMMU等核心配置
- 供应商信息区:厂商自定义数据
核心要点:EEPROM的前128字节(0x0000-0x007F)是强制保留的,任何从站都不能随意修改。我曾经见过一个项目,有人把供应商ID写错了位置,结果从站死活连不上主站。
1.2 ESC寄存器配置区(0x0000-0x003F)
这个区域存放的是ESC(EtherCAT从站控制器)的硬件配置参数。嗯,这里要注意,这些数据在从站上电时会被ESC自动加载。
| 地址偏移 | 内容 | 说明 |
|---|---|---|
| 0x0000-0x0007 | PDI配置 | 过程数据接口类型(SPI、8位并行、16位并行等) |
| 0x0008-0x000F | 看门狗配置 | PDI看门狗和过程数据看门狗的超时时间 |
| 0x0010-0x0017 | 同步信号配置 | SYNC0/SYNC1的周期和偏移 |
| 0x0018-0x003F | 保留/扩展 | 留给ESC厂商使用 |
我记得有一次调试一个从站,发现看门狗老是超时。查了半天,原来是EEPROM里的看门狗配置写成了0xFFFF。你想想看,这个值意味着看门狗几乎不工作,一有异常就卡死了。
1.3 标准配置区(0x0040-0x007F)
这个区域存放的是从站的"身份证"信息。说白了,主站就是靠这些数据来识别你的从站。
// 标准配置区的典型布局
0x0040-0x0041: 供应商ID(如 Beckhoff = 0x0002)
0x0042-0x0043: 产品代码
0x0044-0x0045: 版本号
0x0046-0x0047: 序列号
0x0048-0x004F: 保留
0x0050-0x0051: 引导状态机配置
0x0052-0x005F: 保留
0x0060-0x0061: 当前配置的FMMU数量
0x0062-0x0063: 当前配置的SyncManager数量
0x0064-0x007F: 保留
我的经验:供应商ID一定要向EtherCAT技术协会(ETG)申请。我见过有人随便写了个0x0001,结果和Beckhoff的ID冲突了,调试时主站一直报错。后来花了整整两天才找到原因。
1.4 字符串区(0x0080开始)
字符串区存放的是人类可读的信息,比如产品名称、硬件版本、软件版本等。每个字符串以0x00结尾,长度不限,但建议控制在64字节以内。
我习惯这样组织字符串区:
- 0x0080: 产品名称(如"EtherCAT Servo Drive")
- 0x00C0: 硬件版本(如"Rev 1.0")
- 0x0100: 软件版本(如"FW 2.3.1")
- 0x0140: 序列号(如"SN20240301")
注意:字符串区不要写中文!EtherCAT协议规定字符串必须是ASCII编码。我曾经有个同事把产品名写成了中文,结果在TwinCAT里显示乱码,排查了半天才发现是编码问题。
1.5 SII配置区
SII(从站信息接口)配置区是从站的核心配置区域。它定义了从站如何与主站交换数据。这里存放的是同步管理器(SyncManager)和FMMU(现场总线内存管理单元)的配置。
典型的SII配置区结构:
// 每个SyncManager占用8字节
typedef struct {
uint16_t physical_start_addr; // 物理起始地址
uint16_t length; // 数据长度
uint8_t control_register; // 控制寄存器
uint8_t status_register; // 状态寄存器
uint16_t enable; // 使能标志
} SyncManager_t;
// 每个FMMU占用16字节
typedef struct {
uint32_t logical_start_addr; // 逻辑起始地址
uint16_t length; // 数据长度
uint16_t reserved;
uint8_t control_register; // 控制寄存器
uint8_t status_register; // 状态寄存器
uint32_t physical_start_addr; // 物理起始地址
} FMMU_t;
说实话,SII配置区是最容易出错的地方。我遇到过最典型的问题:SyncManager的物理起始地址和实际硬件地址不匹配,导致主站读写数据时总是偏移了几个字节。这种问题用示波器都很难抓,只能靠逐字节比对EEPROM内容。
1.6 供应商信息区
供应商信息区是留给厂商自由发挥的空间。你可以在这里存放校准参数、生产日期、测试数据等。EtherCAT协议对这个区域没有强制要求,但建议遵循以下规范:
- 使用0xFFFF作为区域结束标记
- 每个数据块前加2字节的类型标识
- 数据块长度建议不超过256字节
避坑指南:我曾经在一个项目中,把校准参数写在了供应商信息区。结果固件升级时,不小心把整个EEPROM擦除了,所有校准数据都丢了。后来我学乖了,把关键参数单独放在EEPROM的高地址区域,并且做了备份。
知识体系总览
下面这张图展示了EEPROM数据结构的整体框架,我建议你把它打印出来贴在工位上:
这张图把EEPROM的五个核心区域都标出来了。你注意看,前128字节是强制保留的,后面的区域可以根据实际需求灵活调整。我建议你在设计新从站时,先画一张类似的布局图,再开始写EEPROM内容。
实用技巧:用SOEM的ethercat config命令可以读取从站的EEPROM内容。我经常用这个命令来验证配置是否正确。命令格式:ethercat config -p [从站地址]
好了,EEPROM的数据结构就讲到这里。记住,这块内容虽然基础,但却是EtherCAT从站开发的基石。下一章我们会深入讲解如何用SOEM库来读写EEPROM,到时候我会分享一些实际项目中的调试技巧。