☰
FPGA复刻EtherCAT从站控制器:ET1100国产替代完整实战复盘
2026/10/31 1:05:22 网站建设 项目流程

做伺服驱动和EtherCAT IO模块的朋友,应该对“倍福ET1100”这四个字又爱又恨。爱的是它一颗芯片就把EtherCAT从站通信的事情包圆了,从机侧不用碰协议栈的底层细节;恨的是它的采购周期、价格波动以及被芯片原厂锁定的局面。这两年圈子里聊得最多的题目就是“ET1100国产替代”,我也借着一次第三方伺服驱动器对接倍福TwinCAT3的项目,完整做了一轮替代改造。这篇文章就是那次改造的复盘,内容包括替代路线怎么选、FPGA复刻ESC的关键机制、从从站代码生成到TwinCAT3联调的完整流程,以及几个实测中掉进去又爬出来的坑。如果你也在评估要不要替代、怎么替代,这篇应该能帮你省不少弯路。

1. ET1100卡在哪里:先看清这颗芯片在从站里的真实位置

很多刚接触EtherCAT的人会把ET1100理解成“一个带以太网接口的单片机”,其实不是。ET1100本质上是一颗EtherCAT从站控制器(ESC)专用ASIC,它不跑应用代码,它负责的是一整条EtherCAT帧处理链路:识别帧、解析子报文、读写本地DPRAM、做CRC校验、维护分布式时钟,最后通过PDI接口和应用MCU交换数据。主站TwinCAT3发出的报文经过从站时就像火车经过一个小站,ET1100就是那个调度的列车员,决定了哪些数据要卸下来、哪些数据要装上去。

这个“从站心脏”的重要性在于,EtherCAT协议栈对实时性和确定性要求极高,帧周期在微秒到毫秒级,MCU如果直接处理以太网帧,既要在MAC层折腾收发缓冲,又要掐着时序解析报文,很容易被中断风暴打垮。ET1100把通信层和应用层彻底切开:应用MCU只面对一块看似普通的双口RAM,往里面写数据、读数据,剩下的交给ESC。这也是为什么早期的国产伺服驱动器几乎清一色采用“主控MCU + ET1100”的双芯片方案。

那到底卡在哪?我自己的体会有三方面。

第一是供应风险。ET1100这类专用芯片的需求量比起通用MCU小很多,原厂排产周期不确定,市场上时不时就传出缺货、涨价的信号。做产品的都知道,一颗关键料交期拉长到十几二十周,整个项目的交付计划就得跟着改。

第二是成本和议价空间。一颗ET1100的量产价在几十块钱量级,伺服驱动器本身毛利就被卷得很低,通信芯片占了不小的成本比例。用量越大,越觉得这笔钱花得不值。

第三是方案锁定。ET1100虽然普及,但它的PDI接口方式和寄存器行为是固定的,如果你想做一些定制化的从站功能,比如把高速捕获、编码器处理、PWM扩展全部塞进一个设备,就得在外围再挂FPGA或CPLD。与其这样叠床架屋,不如直接把ESC功能并进自己已有的逻辑资源里。

另外还有一个容易被忽视的场景:第三方伺服驱动器要接入倍福TwinCAT3系统,从站侧必须是一个标准EtherCAT从站。你用国产方案做驱动器,通信接口那块还是绕不开ET1100或者同类ESC,除非你准备把ESC做成自己的核心能力。这正是“国产替代”讨论的根源——不是替代不掉,而是替代的深度决定了你能省多少钱、掌握多少主动权。

2. 三条替代路线对比:换芯片、换封装、换架构

我接触到的ET1100国产替代方案,大概能分成三条路线:PIN2PIN兼容芯片、集成ESC的专用MCU/SoC、以及FPGA内实现ESC IP。三条路线的开发量、风险、适用场景完全不一样,我先把对比表放出来,再逐个说。

路线开发量硬件改动成本空间风险点适用场景
PIN2PIN兼容芯片低几乎为零中供应链仍单点依赖,货源不稳定已有量产板卡快速保供
集成ESC的专用MCU/SoC中改核心板高主频/性能受限于MCU,绑定单一芯片厂IO模块、简单从站、部分伺服
FPGA内实现ESC IP高重新设计通信板高开发周期长,需要懂EtherCAT底层自研伺服、多轴控制器、定制化从站

PIN2PIN兼容芯片这条路线最省事,基本就是找一颗脚位兼容、寄存器行为兼容的国产IC直接换上。优点显而易见,改版工作量小,固件层面大概率不需要动。但它的问题也很致命:你的供应链从“依赖倍福”变成了“依赖另一家芯片厂”,本质上还是单点。如果这颗芯片本身销量不大,原厂维护意愿、供货稳定性都要打个问号。我认为它适合作为过渡方案或者备选货源,不适合作为长期战略。

集成ESC的专用MCU/SoC是最近两年冒出来的新方向,一些国产电机控制芯片开始内置ESC接口。这类芯片把ET1100做的事情吸收进MCU内部,省掉了外部ESC、省掉了PDI总线,主控直接通过内部寄存器访问过程数据。好处是BOM成本降得明显,延迟也更低,对于IO从站、小型伺服这类场景非常合适。但它的天花板也很清楚:ESC会话和过程数据交换要占用MCU资源,如果伺服环路跑得很激进,电流环频率和EtherCAT中断互相抢占,性能反而容易翻车。另一个问题是,用了这颗芯片,你的主控选型就被绑死了,后续想换MCU平台等于重新做一遍。

FPGA内实现ESC IP是我这次项目实际走的路线,也是我认为目前最适合自研团队的一条。FPGA里跑ESC逻辑核,外接千兆/百兆PHY和网络变压器,FPGA内部用Block RAM实现双口RAM,应用MCU通过并行总线或SPI访问这块RAM。这个方案的本质是把ET1100的职能“拉回自己手里”,不依赖任何单独的通信芯片。对伺服产品来说,FPGA本来就可能承担编码器接口、PWM死区控制、硬件保护等功能,ESC IP只是多占用一部分逻辑资源,边际成本很低,还能根据产品需求做定制,比如多从站端口、额外的数字IO逻辑。

当然,这条路门槛最高。你要能理解EtherCAT数据链路层的工作原理,要会写状态机,要对FPGA时序收敛有把握,还要解决PHY层兼容性、EMC问题。本文后面几个章节,我重点把这条路线的核心机制和实操细节展开讲。

3. FPGA复刻ET1100:DPRAM、FMMU、同步管理器、DC时钟是四座大山

如果你决定用FPGA实现ESC,最忌讳的事情是“照着寄存器表抄”。ET1100的寄存器手册只有几百页,但每个寄存器背后都对应一套机制。我按重要性排序,把必须在FPGA里实现好的四件事拆开讲。

第一件:DPRAM双口RAM。这是主站和应用MCU之间的数据交换窗口。ET1100内部有4KB的DPRAM,被划分成邮箱区和过程数据区。主站通过EtherCAT帧往DPRAM里写数据,应用MCU通过PDI口读取;反过来,MCU写入的数据也会被主站帧带走。FPGA里的实现方式是用Block RAM做一个真正的双口RAM,一端挂在EtherCAT数据链路处理逻辑上,另一端挂在PDI总线上。做好地址映射很关键,字段偏移必须和从站配置工具里定义的偏移完全一致,否则主站侧一切换到SafeOp就报SM校验错误。

第二件:FMMU(现场总线内存管理单元)。它的作用可以类比成“地址翻译器”。主站通常把多个从站的过程数据连续编址,形成一个逻辑地址空间,每个从站只需要知道自己那一段。FMMU负责在帧经过时,判断当前逻辑地址是否落在自己的映射范围内,如果是,就把对应数据从帧里提取出来,放入DPRAM的指定位置。反向也一样,从站往逻辑地址写数据,FMMU负责放到帧的正确偏移上。FPGA里实现FMMU要注意映射表的数量,常见的ESC核会支持8个或16个FMMU,每次映射包含逻辑起始地址、逻辑长度、物理起始地址和读写使能标志。

第三件:同步管理器(Sync Manager)。同步管理器控制邮箱和过程数据的收发方向、触发中断时机和看门狗。可以说,FMMU决定“数据放到哪”,同步管理器决定“什么时候放、放完通知谁”。ET1100通常有4个同步管理器,典型配置是:SM0用作邮箱写、SM1用作邮箱读、SM2用作过程数据写、SM3用作过程数据读。主站发来的过程数据写入完成后,FPGA要能产生一个PDI中断,应用MCU在中断中立刻读取新数据。这个中断的实时性直接决定从站响应速度,做伺服驱动器尤其敏感。FPGA里中断信号的拉高时机、释放时机都要仔细调,太早MCU读到旧数据,太晚则MCU白白空等。

第四件:分布式时钟(DC)。这一项是EtherCAT实现高精度同步的核心,也是最容易做崩的一部分。简单说,主站和每个从站都有一个本地时钟,主站在启动阶段测量每段链路的传播延迟和时钟偏移,然后把参考时间下发,各从站据此对齐自己的本地时间,并周期产生SYNC脉冲。伺服驱动器通常把SYNC脉冲直接接到MCU的中断或定时器上,作为电流环的控制节拍。可能有人会觉得这就是“对表”,但实际比“对表”复杂多了——每个从站的物理层接收延迟不同,PHY芯片的收发延迟也不同,这些都要在FPGA里补偿。用生活化类比来说,全班同学要对表,但每个人听到口令的延迟不一样,光喊一声“对了”没用,得给每个人发一个“你比别人晚0.3秒听到”的补偿值。DC实现得好不好,直接表现为SYNC脉冲抖动多大。我在实测中用示波器看过,好的实现能把抖动压到几十纳秒以内,做得粗糙的会漂到几百纳秒甚至微秒级,伺服环路马上就给你颜色看。

除了这四座大山,还有几个基础细节不能忽略:一个是物理层,FPGA外接PHY通常用MII或RMII接口,从站一般做两路PHY支持级联,PCB上网络变压器、阻抗匹配、接地都要按百兆以太网规范来;另一个是时钟,FPGA的时钟和ESC核的时钟要同源设计,否则DC补偿白做;再一个是ESC地址配置,一般通过引脚电平或者EEPROM内容设定,ID设置错了从站在总线上就“隐身”了。

4. 从ET1100迁移到FPGA IP的实操路径:SSC代码、EEPROM、TwinCAT3联调

看完机制,说实操。我按自己项目的完整流程,从硬件设计到跑通TwinCAT3联调,拆成几个阶段。

第一步,硬件物料选型和PDI接口设计。我用的是国产FPGA加两颗百兆PHY,外接网络变压器,MCU选的是STM32F103系列。没错,就是那颗被无数人吐槽“老掉牙”的Cortex-M3。很多人做国产替代时把MCU一起换成了GD32、APM32,然后在固件层面对齐外设寄存器,这就是另一个热词“stm32f103c8t6国产替代”在做的事。F103本身没有外部并行总线,但通过FSMC或者GPIO模拟并行时序访问FPGA的DPRAM完全够用,125微秒到1毫秒的EtherCAT周期里,读几百个字节毫无压力。对高速伺服,我建议用16位并行PDI加中断;对IO从站,用SPI接口更省引脚。判断标准很简单:看你一个周期要交换多少过程数据、MCU能在中断里停留多久。

第二步,用SSC工具生成从站协议栈代码。倍福提供了一个叫SSC(Slave Stack Code)的工具,输入从站配置,生成一套C代码协议栈,跑在应用MCU上,负责处理邮箱通信、状态机切换、PDO映射。很多人误以为用了FPGA ESC IP就不需要SSC了,其实不是。FPGA实现的是数据链路层,SSC生成的是应用层协议栈,两者通过PDI接口配合。SSC工具里可以选择PDI类型,选并行总线或者SPI,生成的代码会自动带上对应的底层驱动。代码生成后要填设备信息,Vendor ID、Product ID这些标识会在TwinCAT3扫描时展示出来。

第三步,EEPROM和从站信息配置。ET1100方案里,EEPROM用于存储从站的设备信息、别名地址和配置数据。FPGA方案里EEPROM依然建议保留,因为TwinCAT3扫描总线时会读取从站EEPROM,判断设备类型,并向用户显示厂商和设备名。如果你的设备没有EEPROM或者EEPROM内容校验失败,主站会把它识别成未知设备,后续配置全部抓瞎。常见的做法是在第一次上电前烧好预置内容,包含Vendor ID、Product ID和基本寄存器默认值;也可以让ESC在初始化阶段支持从主站写入EEPROM内容。这里有个实操细节:TwinCAT3的“EtherCAT从站信息”对话框可以直接写入这些参数,但必须先让从站进入PreOp状态,否则写入命令不会被执行。

第四步,TwinCAT3联调和状态机切换。倍福PLC软件TwinCAT3启动后,会按顺序切换从站状态:Init到PreOp、PreOp到SafeOp、SafeOp到Op。每一步都有严格的前置条件。Init到PreOp需要建立邮箱通信,主站发送FOE或CoE请求;PreOp到SafeOp需要校验过程数据配置和SM通道;SafeOp到Op才允许数据真正双向流动,也才让伺服驱动器“动起来”。TwinCAT3界面里最常用的操作是选中从站节点,右键选择“Set Op”,如果哪一步失败,主站会报对应的状态码,专业叫法是AL状态码。我调试时最喜欢用这个状态码来判断问题范围,它能告诉你是邮箱没建立,还是SM配置不匹配,还是分布式时钟参数异常。

第五步,一次典型的上电调试顺序。我建议拿到新板子后不要直接上主站,先做单板自检:给FPGA烧录ESC核,用逻辑分析仪确认PHY_LINK灯亮、确认ESC能输出时钟,再通过MCU的调试串口访问DPRAM,往某个测试地址写读,确认PDI总线通。自检通过后,再接TwinCAT3,先用“Scan Devices”扫描,看能否识别到从站,识别不到就查EEPROM和ESC地址;识别到了就依次请求PreOp、SafeOp、Op,每步都停一下观察现象。整个过程我最少要十分钟,但能省掉后面无数反复排查的时间。

5. 实测踩坑清单:四个高频问题和完整的排查链路

理论讲完,讲点疼的。下面四个坑是我和团队在实际调试中遇到的,每一个都曾让我们卡了一整天以上。我把现象、原因和排查链路写出来,方便你对照。

坑一:TwinCAT扫描把从站识别成未知设备。现象是“Scan Devices”能看到一个设备但名称全是问号,Vendor ID读出来为零或者错误。最先怀疑EEPROM,用下载线读出EEPROM内容,发现校验字节不对或者开头几字节全是0xFF。原因通常是EEPROM根本就没烧录,或者FPGA的EEPROM接口时序不对。排查链路:先测量EEPROM的CLK和Data引脚有没有波形,确认接口正常;再用示波器抓上电瞬间的读写操作,ESC要在复位释放后才能访问EEPROM,时序太早会导致数据没读进来。最后用TwinCAT的“Advanced Settings”手动写入Vendor ID和Product ID,看从站是否恢复正常。这个坑解决之后,一定要重新做一次完整的断电上电,确认信息能持久保存。

坑二:从站一直卡在Init状态,进不了PreOp。现象是TwinCAT请求PreOp后,从站的AL状态寄存器一直不回写,主站报“Invalid requested state change”。这个问题的根源大概率不是协议栈,而是PDI接口。AL状态机的状态切换需要应用MCU参与,MCU通过PDI总线读取ESC寄存器、执行状态切换动作,如果MCU读不到状态,或者写不进去,整条链路就僵住了。我们当时的排查链路:先看MCU的中断是否产生,确认ESC侧有没有正确触发PDI事件;再用逻辑分析仪抓MCU访问DPRAM的时序,对比FPGA期望的Setup/Hold时间,发现并行总线的片选信号和读写信号存在几十纳秒的毛刺,导致偶发读写失败。最终在FPGA里给PDI接口加了输入同步和总线FIFO,状态切换就顺畅了。如果你也卡在这,先用软件反复轮询AL状态寄存器,看看是不是偶发能读到值、偶尔读不到,这个特征很能说明问题。

坑三:DC同步SYNC脉冲抖动超标。现象是伺服跑起来之后能转,但电流波形偶尔抖,用示波器抓SYNC脉冲能看到沿的抖动达到几百纳秒甚至更大。排查链路是这样的:第一步,确认FPGA的接收时钟是否恢复良好,PHY输出到FPGA的时钟抖动如果大,后面全白搭;第二步,检查DC补偿参数里有没有把PHY的RX/TX延迟估算进去,很多基础ESC IP里这部分是可配置的,我们一开始用的是默认值,明显偏小;第三步,检查晶振本身,普通石英晶振的温漂在百ppm级别,如果从站环境温度变化大,SYNC漂移会慢慢变大,做高精度产品建议用带温度补偿的晶振。调完这三步后,SYNC在室温下能稳定在几十纳秒以内,伺服环路才真正安静下来。

坑四:多从站级联时地址冲突和看门狗配置问题。单独一个从站跑得好好的,级联到第二个从站后,第一个从站时而能通信时而掉线。先查ESC地址:每个从站的地址必须唯一,ET1100类方案一般通过引脚拨码或者EEPROM里存别名地址,两个从站设成一样,主站就分不清谁是谁。再查看门狗:EtherCAT从站有看门狗机制,主站在规定时间内没收到帧,从站就把输出置为安全状态。如果看门狗设得太短,比如小于主站周期,主站一旦调试时暂停,从站就会误判掉线,数据被清零。这个参数在SSC配置里可以调,倍福默认值通常比较合理,但总有人手贱把它改成一个小数值。排查时打开TwinCAT的诊断页,看Frame Error和Lost Frame计数,如果Error值持续增长,优先级最高的是看门狗和线缆连接问题,其次才是寄存器配置。

除了上面四个坑,调试工具也很重要。我的组合是:TwinCAT的诊断界面看状态码和帧错误计数,逻辑分析仪抓PDI总线和AL状态寄存器,示波器看SYNC和PWM的相位关系,Wireshark配合网口镜像抓EtherCAT帧分析Working Counter是否正确。Working Counter是EtherCAT帧里一个关键字段,每个从站处理完数据后会递增它,主站通过这个值判断哪些从站没有正确响应。把这个值盯住了,很多通信层面的问题都能快速定位。

还有一个话题最近常被提起,就是倍福的EAP通讯。简单说,EAP是EtherCAT之上的自动化协议,适合控制器之间做集群式通讯,但它对从站侧的要求和传统EtherCAT不太一样。如果你的目标是让伺服驱动器或者IO设备接入TwinCAT3并跑标准周期同步,先把标准EtherCAT从站做扎实即可;等EAP在第三方设备侧生态成熟了,再评估要不要在ESC IP里扩展支持。目前阶段,把基础做稳比追新协议更重要。

到这里,我那次ET1100国产替代改造的核心内容就复盘完了。做完这一轮,最大的感受是:替代不是简简单单找一颗脚位兼容的芯片换上,而是把ESC的完整职能理解一遍、再在自己可控的逻辑里重新实现一遍。这个过程很痛苦,要啃协议手册、要反复调时序、要和TwinCAT3斗智斗勇,但走完之后,你对EtherCAT从站的理解会上一个台阶,产品也不再受单一通信芯片牵制。最后给一条我个人的建议:任何替代方案,先在单从站、标准1毫秒周期环境下连续跑满一周再谈量产;稳定性这个东西,实验室里跑三天看不出来,跑七天八天就能见真章。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询