【原创】IgH EtherCAT主站详解(二十四)--FoE固件升级操作指南
从站固件升级实操
8.5 — FoE 固件升级完整操作指南
概览
什么是 FoE?
FoE (File Access over EtherCAT) 是 EtherCAT 协议中用于文件传输的子协议,类似于 TFTP(简单文件传输协议)。它的主要用途是从站固件升级:将固件二进制文件从主站传输到从站的非易失性存储器(Flash)。
在 IgH EtherCAT Master 1.5.2 中,进行固件升级的核心命令行工具是 ethercat foe_write,它封装了完整的 FoE 写入握手流程。
危险: 变砖风险
不兼容固件可能导致变砖:写入错误的固件文件(型号不匹配、版本不兼容、文件损坏)可能导致从站无法启动。请务必在升级前确认固件来源正确,并做好 EEPROM 备份。
操作前请确保:
1. 固件文件来自从站厂商官方渠道
2. 固件型号与从站硬件版本完全匹配
3. 已备份从站 EEPROM 数据 (ethercat sii_read)
警告: 确保不断电
升级期间确保不断电:固件写入过程中如果断电,从站 Flash 中可能只写入了部分数据,导致固件不完整、从站无法正常启动。建议使用 UPS 不间断电源,并在升级前确认供电稳定。
建议: 备份 EEPROM
升级前备份 EEPROM:使用 ethercat sii_read 命令备份从站的 SII (Slave Information Interface) 数据。如果升级后从站异常,可通过 ethercat sii_write 恢复。ethercat sii_read -p N > slave_N_eeprom_backup.bin
技术详情
固件升级完整流程图
以下流程图展示了从升级前检查到升级后验证的完整操作步骤:
[流程图 - 结构化描述]
| 步骤 | 描述 |
|---|---|
| 1 | Step 1 升级前检查 ethercat slaves / upload |
| 2 | Step 2 准备固件文件 确认型号、校验和 |
| 3 | Step 3 备份 EEPROM ethercat sii_read -p N |
| 4 | Step 4 执行固件升级 ethercat foe_write -p N |
| 5 | 传输是否成功? |
| 6 | Step 5 等待从站重启 sleep 5 ~ 30s |
| 7 | Step 6 错误恢复 检查错误码 |
| 8 | Step 5 重新扫描总线 ethercat rescan |
| 9 | Step 5 验证固件版本 ethercat upload 0x1008 |
| 10 | 版本是否正确? |
| 11 | 升级完成 |
| 12 | 是否可重试? |
| 13 | 尝试恢复 EEPROM ethercat sii_write |
Step 1: 升级前检查
在执行固件升级前,必须确认当前从站状态并记录现有配置信息:
# 1. 检查从站状态 — 确认从站在总线上的位置和当前状态
ethercat slaves
# 预期输出:
# 0 0:0 PREOP + EK1100 EtherCAT Coupler (2A E-Bus)
# 1 0:1 PREOP + EL3102 2Ch. Ana. Input
# 2. 查看当前固件版本 (SDO 0x1008:00 — 厂商设备名称/版本)
# 注意: 0x1008 是标准的 "Device name" 对象,具体含义因厂商而异
ethercat upload -p N 0x1008 0x00 -t string
# 3. 记录从站完整配置信息 (升级后用于对比)
ethercat config -p N -v
Step 2: 准备固件文件
固件文件的准备工作至关重要,请务必确认以下几点:
| 检查项 | 说明 | 验证方法 |
|---|---|---|
| 固件来源 | 从设备厂商官方渠道获取,确保文件未被篡改 | 核对厂商提供的 SHA256/MD5 校验和 |
| 型号匹配 | 固件必须与从站硬件型号完全匹配(含硬件版本号) | 对照从站标签上的型号与固件发布说明 |
| 文件格式 | 确认文件格式符合从站要求 (.bin, .hex, .fw 等) | 查阅从站文档,确认 FoE 支持的格式 |
| 文件完整性 | 下载后验证文件校验和 | sha256sum firmware_v2.bin |
注意: 文件格式
不同厂商的从站对固件文件格式要求不同。常见格式包括:.bin(原始二进制)、.hex(Intel HEX)、.fw(厂商自定义格式)。写入前务必查阅从站文档确认 FoE 接受的文件格式。
Step 3: 执行固件升级
使用 ethercat foe_write 命令将固件文件写入从站。以下是各种使用场景:
# 写入固件到从站 N
# -p N: 指定从站位置 (从 0 开始)
sudo ethercat foe_write -p N firmware_v2.bin
# 部分 ESC 芯片需要密码才能写入
# 密码作为第二个参数传递
sudo ethercat foe_write -p N firmware_v2.bin 12345
# -o 参数: 指定从站端保存的文件名
# 如果不指定 -o, 默认使用本地文件名
sudo ethercat foe_write -p N my_fw.bin -o firmware.bin
# 从 stdin 读取固件数据 (管道方式)
cat firmware.bin | sudo ethercat foe_write -p N - -o firmware.bin
Step 4: 监控升级进度
固件写入过程中,ethercat foe_write 会显示传输进度。传输时间取决于以下因素:
| 固件大小 | 总线速度 (100 Mbps) | 总线速度 (1 Gbps) | 说明 |
|---|---|---|---|
| 64 KB | ~2-5 秒 | <1 秒 | 小型从站固件 |
| 256 KB | ~8-20 秒 | ~2-5 秒 | 中等规模固件 |
| 1 MB | ~30-90 秒 | ~5-15 秒 | 大型固件(含文件系统) |
如果传输过程中出现错误,命令会输出 FoE 错误码。参见下方 FoE 错误码表 进行排查。
Step 5: 升级后验证
固件写入完成后,需要等待从站重启并验证新固件版本:
# 1. 等待从站重启 (时间因设备而异, 通常 5-30 秒)
sleep 5
# 2. 重新扫描总线 (让主站重新枚举从站)
ethercat rescan
# 3. 验证新固件版本
ethercat upload -p N 0x1008 0x00 -t string
# 输出应显示新版本号
# 4. 检查从站状态 — 确认从站已恢复正常
ethercat slaves
# 所有从站应处于 PREOP 或更高状态
Step 6: 升级失败的恢复
如果升级后从站异常(卡在 INIT 或 BOOT 状态),可尝试以下恢复步骤:
# 1. 检查从站当前状态
ethercat slaves -v
# 2. 尝试强制状态切换 (从 BOOT → INIT → PREOP)
ethercat states -p N INIT
sleep 2
ethercat states -p N PREOP
# 3. 如果从站仍无响应, 尝试重新写入固件
sudo ethercat foe_write -p N firmware_recovery.bin
# 4. 如果固件写入也失败, 可能需要恢复 EEPROM
# 使用之前备份的 EEPROM 数据:
ethercat sii_write -p N < slave_N_eeprom_backup.bin
# 5. 恢复后重新扫描总线
ethercat rescan
ethercat slaves
危险: EEPROM 恢复
ethercat sii_write 会直接覆盖从站的 EEPROM 内容。如果写入了错误的 EEPROM 数据,从站可能完全无法被主站识别。请仅在确认备份文件正确的情况下执行恢复操作。
FoE 错误码表
当 FoE 传输失败时,从站会返回错误码。以下是常见错误码及其含义:
| 错误码 | 名称 | 含义 | 排查方向 |
|---|---|---|---|
0x0001 |
Not Found | 请求的文件在从站上未找到 | 检查文件名是否正确;确认从站存储中是否存在该文件 |
0x0002 |
Access Denied | 访问被拒绝 | 检查密码是否正确;确认从站未处于写保护状态 |
0x0003 |
Out of Memory | 从站存储空间不足 | 确认固件大小未超过从站 Flash 容量;删除从站上旧固件 |
0x0004 |
Invalid Checksum | 固件校验和不正确 | 重新下载固件文件;确认文件传输过程中未损坏 |
0x0005 |
Invalid Password | 密码错误 | 确认密码正确;部分从站默认密码为 0 |
0x0006 |
Invalid Filename | 文件名无效 | 检查文件名格式;确认从站支持该文件名(长度、字符) |
0x0007 |
Invalid Data | 数据内容无效 | 固件格式可能不正确;确认文件格式与从站期望一致 |
0x0008 |
Program Error | 从站内部编程错误 | 从站 Flash 写入失败;可能需要从站厂商技术支持 |
源码分析
FoE 协议握手流程
固件写入的核心是 FoE 协议的请求-确认握手。完整流程为:WRQ (Write Request) → DATA → ACK → DATA → ACK → ... → 最后一个 DATA (长度 < MTU) → ACK → 完成。
[时序图 - 参与者]
| 标识 | 名称 |
|---|---|
| TOOL | ethercat foe_write |
| MST | ec_master (内核) |
| FSM | FoE FSM |
| SLAVE | 从站 ESC |
ethercat foe_write 命令实现
源文件: tool/CommandFoeWrite.cpp
命令执行流程:
- 解析命令行参数(从站位置
-p、文件名、密码、输出文件名-o) - 打开固件文件,读取全部内容到内存缓冲区
- 创建
ec_foe_request_t结构体,设置文件名、密码、数据指针和数据长度 - 通过 ioctl 发送
EC_IOCTL_FOE_WRITE命令到内核主站模块 - 内核侧创建 FoE 请求对象,加入目标从站的请求队列
- 从站的 FSM 在其循环中检测到 FoE 请求,启动 FoE FSM 执行写入握手
- FoE FSM 执行完整的 WRQ → DATA → ACK 循环,直到所有数据传输完毕
- 完成后通过 ioctl 返回结果(成功或错误码)给用户空间
FoE FSM 状态机 (内核侧)
源文件: master/fsm_foe.c, master/fsm_foe.h
写操作的状态转换如下:
[图示内容 - 请参考原文档查看完整图表]
关键状态函数
| 状态函数 | 源文件 | 职责 |
|---|---|---|
ec_fsm_foe_write_start() |
master/fsm_foe.c |
初始化 FoE 写入,发送 WRQ 帧(携带密码和文件名) |
ec_fsm_foe_state_wrq_sent() |
master/fsm_foe.c |
WRQ 发送后等待从站 ACK 或 ERROR 响应 |
ec_fsm_foe_state_ack_check() |
master/fsm_foe.c |
检查 ACK 帧头部,发起读取完整 ACK |
ec_fsm_foe_state_ack_read() |
master/fsm_foe.c |
读取完整 ACK 响应数据 |
ec_fsm_foe_state_ack_read_data() |
master/fsm_foe.c |
解析 ACK 内容,获取下一个期望的 BlockNumber |
ec_fsm_foe_state_data_sent() |
master/fsm_foe.c |
Data 帧发送后,等待从站 ACK 确认 |
深入了解
- 固件升级 (FoE) 工作流 — FoE 协议帧格式、OpCode 定义和完整状态机分析
- FoE FSM 模块 — FoE 有限状态机的源码级分析
- 从零搭建 EtherCAT 主站 — 基础环境搭建教程

浙公网安备 33010602011771号