【原创】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

命令执行流程:

  1. 解析命令行参数(从站位置 -p、文件名、密码、输出文件名 -o
  2. 打开固件文件,读取全部内容到内存缓冲区
  3. 创建 ec_foe_request_t 结构体,设置文件名、密码、数据指针和数据长度
  4. 通过 ioctl 发送 EC_IOCTL_FOE_WRITE 命令到内核主站模块
  5. 内核侧创建 FoE 请求对象,加入目标从站的请求队列
  6. 从站的 FSM 在其循环中检测到 FoE 请求,启动 FoE FSM 执行写入握手
  7. FoE FSM 执行完整的 WRQ → DATA → ACK 循环,直到所有数据传输完毕
  8. 完成后通过 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 确认

深入了解

posted @ 2026-04-15 08:14  沐多  阅读(428)  评论(0)    收藏  举报