第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数据结构总览 ESC寄存器配置区 0x0000 - 0x003F (64字节) PDI配置 · 看门狗 · 同步信号 标准配置区 0x0040 - 0x007F (64字节) 供应商ID · 产品代码 · 版本号 字符串区 0x0080 开始 (可变长度) 产品名称 · 硬件版本 · 软件版本 SII配置区 SyncManager + FMMU配置 数据交换的核心配置 供应商信息区 厂商自定义数据 (0xFFFF结束标记) 校准参数 · 生产日期 · 测试数据 前128字节为强制保留区,后续区域可根据实际需求调整大小

这张图把EEPROM的五个核心区域都标出来了。你注意看,前128字节是强制保留的,后面的区域可以根据实际需求灵活调整。我建议你在设计新从站时,先画一张类似的布局图,再开始写EEPROM内容。

实用技巧:用SOEM的ethercat config命令可以读取从站的EEPROM内容。我经常用这个命令来验证配置是否正确。命令格式:ethercat config -p [从站地址]

好了,EEPROM的数据结构就讲到这里。记住,这块内容虽然基础,但却是EtherCAT从站开发的基石。下一章我们会深入讲解如何用SOEM库来读写EEPROM,到时候我会分享一些实际项目中的调试技巧。

专注资料整理