首页 / 资讯中心 / 文章详情

把 EtherCAT 初始化从 FPGA 搬到 ARM:命令通道的接口设计与11个坑

把 EtherCAT 初始化从 FPGA 搬到 ARM:命令通道的接口设计与11个坑 ★ FEATURED ARTICLE
把 EtherCAT 初始化从 FPGA 搬到 ARM命令通道的接口设计与避坑摘要在 ARMFPGA 架构的 EtherCAT 主站中把从站初始化序列从 FPGA 状态机搬到 ARM是换伺服不用重综合的关键一步。但这不等于可以拆掉 FPGA 侧的帧传输逻辑。本文讲清楚搬迁之后 FPGA 还剩什么职责、命令通道的接口该怎么设计、以及实践中容易踩的坑。本文不贴源码只讲设计思路与接口约定。一、为什么要搬状态机 模板 ROM 的困境一种常见的 EtherCAT 主站 FPGA 实现初始化部分长这样一个庞大的状态机每个状态对应一条配置命令一个报文模板 ROM把每条命令的字节预先烧进去一套逐轴递推逻辑遍历链路上的所有从站一个仲裁器决定现在该发初始化帧还是周期帧这套设计能用但有个硬伤从站型号相关的信息被烧进了 FPGA。换个品牌的伺服PDO 映射内容变了、邮箱缓冲地址变了、SDO 序列变了、SM/FMMU 配置值变了——全在 ROM 和状态机里。结果就是换一次伺服重综合一次 FPGA。于是很自然的想法是把这些语义搬到 ARM用 C 常量表描述FPGA 只保留通用的传输能力。二、搬走之后FPGA 还剩什么这是最容易想岔的地方。搬走初始化流程不等于搬走帧传输。ARM 手里握着配置流程但它离 MII 引脚之间还隔着五个物理上绕不过去的坎#职责为什么 ARM 做不到1字节序列化ARM 通过外部总线写一次寄存器的耗时也在 几十 ns 量级。光喂字节就吃掉大量的 CPU2CRC32必须逐字节在 FPGA 时钟域流水线计算3帧序号生命周期序号要与应答配对且必须钳在安全区间4微秒级超时ARM 软件定时通常只到毫秒级且漏检帧根本没回来这种最需要重试的情况5与周期帧争总线帧级互斥ARM 不应感知总线占用状态这五条与谁实现配置流程完全无关。FPGA 侧保留的模块本质上是一个网卡驱动——ARM 是应用程序决定发什么包驱动负责把包送上线路。它明确不管的事不知道某个寄存器偏移代表什么、不实现设备行规状态机、不数轴数、不参与周期过程数据帧生成、不做 CRC、不加前导码。三、帧格式先把字节位置搞清楚接口时序建立在一个基准上发送组装模块有一个字节计数器逐字节驱动发送。计数器区间内容前 7 个前导码第 8 个帧起始定界符 SFD接下来 12 个MAC点对点直连时通常不校验再 2 个EtherType再 2 个EtherCAT 帧头含长度字段之后数据报datagram区具体工程中 datagram 的起始计数值、接收侧计数器的换算关系需要用逻辑分析仪实测确认。建议把这类数字全部做成参数实测后改一个数字即可不用改 RTL。3.1 周期帧里的固定开销周期帧长度公式里通常有一项固定开销指的是几条固定 datagram一条空操作、一条用于 DC 时间心跳的地址映射写、一条用于读取错误计数。它们的长度与轴数无关每轴再挂一条逻辑读写 datagram。3.2 两个长度别混这是最容易出错的概念。以一条写 2 字节数据的配置命令为例概念决定什么发送字节数CRC 起点、实际吐多少字节长度字段帧头里填的值ESC 用它判断帧边界发送字节数来自以太网最小帧约束MAC EtherType 载荷 FCS 至少 64 字节反推载荷下限。所以短命令也要补零凑够。而长度字段按规范应是真实数据报长度头部 数据 工作计数占位。填含填充的值也能工作ESC 把填充区当空操作解析但会多花解析时间。建议做成参数可切换用抓包实测确认哪种能通过从站校验。四、接口设计上下游信号命令通道模块的定位是与周期帧数据源并列挂在发送组装模块的多路选择器上不直连发送模块。4.1 上游谁驱动它来源信号类别说明ARM模式选择参数模式FPGA 拼帧/ 原始模式ARM 填字节ARM命令码EtherCAT 命令码原样透传不做译码ARM站地址 / 寄存器偏移均为小端ARM数据长度 / 数据参数模式下有字节数上限ARM触发信号置位触发完成后必须清除仲裁器授权信号本帧获准发送发送模块字节计数 / 发送使能当前发到第几个字节接收模块接收字节流与有效指示用于捕获应答4.2 下游它驱动谁目的信号类别说明仲裁器发送请求 / 预计占用时间供调度判断能否插入发送模块数据字节流 / CRC 起点与同步帧字节流同级进选择器接收模块帧序号应答配对标签ARM忙 / 完成 / 工作计数 / 数据握手与结果4.3 两种模式的分工模式谁组装帧覆盖场景参数模式FPGA状态切换、DC 配置、单条同步管理器配置、FMMU 配置等高频短写原始模式ARM 填字节FPGA 只覆写帧序号邮箱长帧、一帧多数据报、非标长度为什么参数模式的数据上限要能容纳一个完整 FMMU 条目FMMU 配置条目在 ESC 里占 16 个连续字节逻辑起始地址 4 映射长度 2 起始位 1 结束位 1 物理起始地址 2 物理起始位 1 类型 1 激活 1 保留 3。这是设备行规的硬规定。如果数据寄存器只开 8 字节FMMU 配不了从站进不了安全运行态。原始模式存在的意义是兜底参数模式的上限是从现有配置序列反推的不是协议上限。换一个型号若冒出超长配置写参数模式直接废掉只能回炉重综合。原始模式是那张底牌成本只是一些触发器。五、仲裁两个时间域之间的隔离层只有一条以太网、一个 PHY同一时刻只能发一帧。而两个请求源活在完全不同的时间观里周期节拍发生器命令通道时间观绝对时间域算好的发帧时刻事件域ARM 什么时候写寄存器节奏严格等间隔完全异步被打断的后果参考时钟不刷新超时后同步告警只是慢一点仲裁器的核心价值不是公平分配带宽而是透明性——让周期发生器完全不知道命令帧的存在。不做的后果按隐蔽程度排序两路同时驱动选择器→ 乱码帧但 CRC 是对的实时算的。从站收到自洽但内容错误的帧工作计数异常但不报错。这是最难查的故障类型。请求脉冲丢失→ 请求是单周期脉冲命令帧在途时没人接整个周期被吞掉。命令帧的应答去驱动了周期帧的完成信号→ 节拍发生器以为自己的帧回来了下次发帧时刻推进错乱表现为周期抖动、锁定反复丢失。核心逻辑只有三件事帧级互斥不可抢占、请求脉冲锁存、完成回执的正确路由。顺带一提如果被推迟会不会造成周期累积漂移取决于周期发生器的实现。若它用上次目标时刻 周期累加则推迟只影响一拍、不累积若用当前时刻 周期则每次推迟都带来偏移。前者才能让简单的帧级互斥成立动手前先看清楚。六、实践中容易踩的坑坑 1接收侧偏移换算多算一轮接收侧的计数器与数据报内偏移之间只有一个换算基准。常见错误是把数据域起点和数据报内偏移叠加使用等于把报头长度数了两遍。后果极隐蔽工作计数抓到填充区的零ARM 读到工作计数等于 0判定命令没执行——每条命令都报失败但从站其实执行成功了。对策确立唯一换算基准用几个已知锚点如帧序号位置、数据域起点交叉验证一遍。坑 2脉冲型完成信号在状态切换中丢失若仲裁器是收到应答后才释放总线的设计那么应答脉冲必然发生在发送状态期间。而状态机在发送态只看总线释放不看应答脉冲——等进入等待态时脉冲早已消失。后果数据其实抓到了但 ARM 看到的是超时 工作计数为零。对策把脉冲锁存成电平状态机在请求/发送/等待任一状态都能看到。坑 3应答没有按帧序号过滤周期帧一直在跑若接收侧只判断帧结束就捕获数据周期帧的字节会混进命令的结果寄存器。对策模块自己在接收流里比对接受到的帧序号不匹配就不写入。这样接收模块一行都不用改。坑 4结果寄存器跨命令残留新命令开始时若不清空结果寄存器本帧没抓到工作计数时ARM 读到的是上一条命令的值——把失败判成成功。对策在触发的那一拍清空而不是在空闲态每拍清后者会让 ARM 先撤触发再读数据时读到全零。坑 5帧序号必须钳位周期帧的序号通常占用高段区间。命令帧的序号若越过边界就会撞进周期帧区间——周期帧的应答会被误判成命令应答。多轴场景下命令总数达数千单字节序号必然回绕钳位是必须的。建议加仿真断言防越界。坑 6完成信号只维持一个时钟若完成标志只拉高一个时钟就清零而 ARM 读一次外部总线要好几个时钟永远读不到。更糟的连带后果ARM 读不到完成标志就不撤触发信号模块回到空闲态后立即重新触发帧一帧发下去忙标志永久为 1ARM 彻底挂死。对策完成态停在原地等 ARM 撤触发信号形成完整握手。坑 7帧头长度字段不该由 ARM 生成最硬的理由周期帧根本没有 ARM 参与——长度取决于上电时测出的从站个数还会随从站进入运行态逐个增长。这条路必须 FPGA 算。次级理由是避免两处真相源长度是数据报长度的派生量让 ARM 再算一遍写进另一个寄存器两者可能不一致表现为某些命令偶发整帧丢失。对策由 FPGA 从已锁存的数据报长度派生两者物理上不可能不一致。坑 8周期配置的单位陷阱节拍发生器的周期输入单位可能是纳秒而旧设计的周期寄存器可能是时钟计数值。沿用旧值会让节拍差一个时钟周期对应的倍数。写入前确认单位。坑 9周期发生器的复位时机若周期发生器在 DC 同步完成前就开始跑而参考时间恒为零超过阈值会锁存一个同步告警。而帧有效标志的条件里通常包含无告警——即使后来同步好了帧有效标志仍可能保持无效只能靠软件清告警。更硬的周期发生器一跑起来就发请求会与同步帧抢同一个选择器直接打断同步过程。对策接同步完成后才放开的复位不要接全局复位。代价只是预热晚一点。坑 10结果寄存器、同步管理器地址的字节序同步管理器地址常以 16 位整体拼进报文高字节先出而 EtherCAT 地址字段是小端。填反的表现是初始化卡在同步管理器配置步或进不了运行态。坑 11M 位与多数据报数据报头里有一位表示后面还有数据报。单数据报必须清零周期帧有多条数据报这一位要正确串联最后一条清掉。原始模式多数据报时只有第一个数据报的序号由 FPGA 托管它是应答配对的会话标签且必须钳位后续数据报的序号和 M 位由 ARM 自己填。七、诚实的能力边界这个架构能实现什么、不能实现什么必须说清楚维度举例归谁重综合从站品牌/型号换品牌、改 PDO 映射内容、改邮箱地址、改 SDO 序列C 常量表不用拓扑/规模PDO 总长度变了、轴数超上限FPGA 参数要第一维是这个架构真正的收益FPGA 里不再有任何一条某个牌子特有的信息。第二维做不到因为周期帧结构压根不在命令通道里而在发送组装模块。PDO 长度是编译期常量同时决定周期帧长度、每轴数据报布局、接收侧解析偏移。一个好消息逻辑地址步长通常留有余量比如步长 32 而实际只用到十几字节所以PDO 长度小幅增长时逻辑地址不用动改动集中在发送模块的帧长计算与接收模块的解析偏移两处。把 PDO 长度做成寄存器即可一次改到位。轴数倒是自动识别的——硬件通过广播写的工作计数数出从站个数加几个轴 FPGA 一行不用改。真正的上限来自内部位宽要扩到更大规模时注意计数器位宽其中某个窄位宽计数器在接满时可能读出零表现为上电完全无反应。容量也要算帧长 MAC EtherType 帧头 数据报区 FCS轴数多、PDO 长时会逼近 MTU。建议软件初始化时算一次帧长超了就报配置错误别让它静默失败。八、总结回看整个设计正确的分工是ARM 拥有帧的全部语义命令、地址、数据、几个数据报、多长 FPGA 拥有字节上线路、CRC 起点、帧序号、超时、与周期帧交错最后给一条上板建议先做影子验证。保留原状态机不动新模块的输出只接逻辑分析仪让 ARM 发几条典型命令与硬件状态机同一步的帧逐字节比对。确认帧偏移、CRC 起点、工作计数位置这几个参数后再切换选择器。这三个数都做成参数的话实测后改一个数字就行。本文整理自一个 ARMFPGA EtherCAT 主站项目的重构实践。文中所有字节偏移、计数器基准、缓冲区尺寸等均为示意需根据具体工程实测确认。
阅读完成 · 觉得有帮助?
咨询建站