
做工业实时总线调试最怕的就是芯片手册写得天花乱坠板子一上电就翻车。前阵子我拿到一块基于国产EtherCAT从站芯片FCE1100和国产DSP芯片FCP32C335做成的功能板目标是把它变成一个真正能跑的EtherCAT从站接入主站完成编码器采集、位置/速度控制和周期数据交互。整块板测下来通信配置就折腾了两天DSP固件、从站状态机、程序固化后又踩了一堆坑。我把完整的测试流程和踩坑记录整理出来尤其是从站XML配置、SM寄存器、PDO映射、以及“固化后必须接JTAG才能启动”这类问题给正在搞国产EtherCAT从站和国产DSP的同行一个参考。如果你手头也有一块类似的国产EtherCAT从站加DSP功能板或者正在规划从零调试EtherCAT从站这篇内容可以直接当操作手册用。已经熟悉LAN9252、ET1100方案的朋友也能从FCE1100的寄存器差异和国产DSP的启动异常里找到一些共性经验。下面按实际测试顺序来讲。1. 项目整体设计与测试方案选型1.1 FCE1100 和 FCP32C335 在系统里分别干什么FCE1100 是一颗国产EtherCAT从站控制器ESC内部把链路层、物理层收发器和寄存器组都集成进去了。主站发过来的EtherCAT帧在FCE1100内部完成寻址、匹配、转发和FMMU映射应用层协议栈则跑在外部MCU或DSP上两边通过SPI或者8位并行总线交换数据。这种分立方案和STM32FCE1100、或者DSP直接挂ESC IP核的做法本质一样好处是通信和算法解耦通信芯片有问题只换通信芯片DSP选型也不被绑定。FCP32C335 则是一颗国产DSP定位是运动控制类芯片带浮点运算单元外设思路上对标C2000系列有PWM、ADC、编码器接口、SPI、CAN之类。在这块功能板里FCP32C335 跑协议栈、采集编码器、算PID、输出PWM给驱动器FCE1100 负责和主站打交道。有人会问为什么不用一颗SOC把ESC也集成进去我也这么想过但实际项目里原厂给出的参考设计大多还是分离式方案。分离方案的好处是软件迭代和技术支持都比较成熟出了问题方便分模块定位。FCE1100 自带EEPROM接口用于存放从站配置测试时如果EEPROM没烧录或者烧错从站扫描都过不去。FCP32C335 的启动模式和TI C2000很像上电要从Flash还是RAM执行由GPIO配的boot模式决定这一点后面单独讲因为它直接坑了我一个下午。1.2 测试目标与整体流程拆解先明确目标。功能板的最终用途是一个带EtherCAT接口的关节模组控制器主站通过EtherCAT周期发送目标位置、速度、力矩指令从站返回编码器位置、驱动器状态和故障信息。所以测试目标拆成四层第一层FCE1100能识别从站寄存器可读写第二层能进OP状态并以1kHz周期收发过程数据第三层编码器反馈值准确进入DSP第四层主站发位置指令电机能跟着转电流和速度控制稳定。测试流程我当时是这样排的离线EEPROM烧录与寄存器自检SSC生成协议栈XML配置加载TwinCAT扫描与状态机测试Wireshark抓包确认周期数据DSP外设调试最后联合带载调试。这个顺序不要随意打乱。我见过有人不做寄存器自检就直接上TwinCAT结果从站扫描不到回调函数位置对不上最后查了半天发现是SPI读时序问题。通信层没验证清楚之前不要碰算法层出了问题你根本不知道是通信延迟还是控制参数不对。1.3 测试环境与工具清单这次测试我准备了这样一套环境大家可以照抄工具用途说明TwinCAT 3主站功能验证免费模式够用支持ESI诊断汇川Easy521 PLC现场级联合调试AutoShop里配置EtherCAT从站USB转SPI/JTAG调试器烧录和寄存器读取原厂调试器最省心Wireshark NpcapEtherCAT抓包定位WKC和状态机异常示波器/逻辑分析仪量SPI时序、SYNC中断至少2通道100MHz以上直流电源、电机、编码器带载验证增量式2500线编码器足够TwinCAT 3 在没有真实从站的时候可以用仿真模式练手但仿真模式看不到寄存器物理层的时序只能看状态机逻辑。所以我的习惯是物理层和SPI先用逻辑分析仪确认状态机再用TwinCAT抓包工具留到多从站联动时用。2. 从站芯片 FCE1100 的 EtherCAT 通信配置2.1 用 SSC 工具生成从站协议栈代码EtherCAT从站的应用层协议栈一般不用手写SSCSlave Stack Code工具按芯片型号和PDI接口自动生成。我用的FCE1100在SSC工具里选对应的ESC类型PDI选SPI从模式应用层类型选CoE再勾选需要的服务包括SDO、PDO映射和DC。生成的代码里核心文件是ecat_def.h、ecatappl.c、ecatcoe.c这些文件会和DSP工程一起编译。这里有个容易踩的坑SSC工具版本要和FCE1100的寄存器配置匹配。我最初用了一个较旧的SSC版本生成的SM事件处理函数和FCE1100中断脚不匹配导致收到主站帧后DSP的SPI中断能进但状态寄存器读出来是全FF明显是ESC寄存器排版不对。换回芯片官方要求的SSC版本后问题才消失。所以拿到芯片的第一步先去原厂FAE确认SSC版本不要自己在官网乱下。生成代码后还需要改几个参数站地址默认0x0000主站运行时会动态配置PDO最大长度要看实际过程数据量DC是否使能取决于应用带关节模组的话DC同步几乎是必须的否则多轴运动指令相位会偏。改完以后看ecat_def.h里的宏定义确保这些参数和后面XML文件对得上。2.2 SM寄存器、PDO映射与对象字典配置EtherCAT从站通信的核心在SM通道和PDO映射。FCE1100的ESC寄存器空间0x0800开始是SM寄存器0x0100到0x0140是FMMU和SM事件中断相关。通常SM0和SM1用于邮箱收发SM2用于主站到从站的过程数据输出SM3用于从站到主站的过程数据输入。每个SM通道的寄存器包含物理起始地址、长度、控制字和状态字配置顺序不能乱先写地址长度再写控制字最后等一下状态字确认生效。控制字里的关键位中断使能、看门狗使能、方向。SM状态字读取要连续因为状态字某些位是写1清除的如果读返回了异常值先看是不是误写了这个寄存器。我自己调的时候遇到一个问题PDO长度改了但XML和SM配置里没有同步更新SafeOP切换OP时报错TwinCAT提示SM长度不等于PDO长度。这个错误很常见排查方式就是用Wireshark抓包看主站写进去的SM配置和从站实际寄存器内容是否一致。对象字典里标准CiA 402相关索引要配置好0x603F错误码、0x6040控制字、0x6060运行模式、0x6061模式显示、0x607A目标位置、0x6064实际位置。还有PDO映射表0x1600到0x1603是RxPDO0x1A00到0x1A03是TxPDO。我习惯把控制字、目标位置、目标速度、模式字放进RxPDO把状态字、实际位置、实际速度、电流反馈放进TxPDO。映射顺序必须和DSP里回调函数解析的字节顺序一致顺序错了电机乱动方向反了读出来位置乱跳这些我在后面联合调试时都遇到过。2.3 TwinCAT 3 中识别从站与状态机调测把SSC生成的ESI文件也就是XML拷贝到TwinCAT安装目录下的EtherCAT子目录重新扫描I/O设备。第一次扫描如果识别不到先检查EEPROM里有没有烧进去厂商ID和产品码。FCE1100的EEPROM烧录工具一般配合原厂调试器使用需要写厂商ID、产品ID、修订号还有默认站地址。如果不烧EEPROM主站默认按00000000处理扫描结果会是未知设备很多新手卡在这一步。TwinCAT下从站要经历INIT、PREOP、SAFEOP、OP四个状态。每次状态切换失败主站日志会给出错误码从站AL Status寄存器在0x0130和0x0131会给出具体原因。比如PREOP进SAFEOP失败常见原因是邮箱没有初始化、SM通道映射错、没有合理处理邮箱事件SAFEOP进OP失败常见原因是SM2/SM3长度不匹配、PDO映射数量不对、应用层ready标志没置位。我踩过一个很典型的坑SSC生成的代码默认没有自动回应用AL Control的OP请求需要应用层在状态机回调里实现收到OP请求后把应用准备好、再设置AL Status为OP的逻辑。如果你用的协议栈代码是精简版这一块最容易漏。漏掉的表现是主站请求OP从站状态寄存器永远停在SafeOPTwinCAT报状态切换错误。后来我在回调里加了日志输出才发现OP请求进来了但应用层没有置ready标志位。2.4 用 Wireshark 抓包定位通信时序问题Wireshark抓EtherCAT帧是排查问题的利器。Windows下装好Npcap后把主站网卡设为混杂模式过滤条件写ethercat就能看到主站每个周期发出的帧和从站返回的帧。EtherCAT帧里有每个从站的WKC字段当从站正确处理了对应命令后WKC会加1。如果WKC恒为0代表从站根本没有处理要么是地址没匹配要么是FMMU没配好WKC为1但数据不对往往是从站应用层数据没更新。我用Wireshark定位过一个问题SafeOP已经稳定了但OP状态下一段时间后从站掉线。抓包发现主站在重新发LRW命令时从站没有响应再看前几帧发现ESC看门狗超时。原因是DSP在某个中断里处理时间过长SPI响应超过ESC看门狗周期。后来用示波器量SPI中断间隔也能看出来但Wireshark把问题定位到通信层方向更准确。注意抓包只能抓主站出口的帧。EtherCAT是环形链路主站发出后经过每个从站转发回到主站如果网卡不支持镜像你抓到的其实只有主站发送和最终返回的帧中间某个从站有没有转发Wireshark很难直接判断。所以抓包最好配合从站告警灯和寄存器读取多几层证据交叉验证。Windows下抓包还有一个坑Windows自带网卡驱动会过滤掉部分EtherCAT帧必须安装Npcap并关闭TCP Offload否则抓到一半报文会经常丢。3. FCP32C335 DSP 侧固件与关键算法验证3.1 DSP 工程搭建与外设初始化FCP32C335 工程搭建和C2000系列很接近IDE可以用CCS或者国产工具链关键看原厂支持情况。工程里建议把DSP库和SSC生成的协议栈代码分成两个目录避免混在一起不好查。系统主频通常配置到150MHz级别外设时钟再分别使能。初始化顺序我整理过先系统时钟和锁相环再配GPIO复用SPI接FCE1100速率先设低一点比如1MHz等通信正常再拉高到10MHz以上编码器接口配置为eQEP模式增量式编码器有A、B、Z三路输入PWM用互补输出带死区ADC用于电流采样最后开定时器中断周期1kHz。如果你用过F28P65这类带ESC接口的DSPFCP32C335的连接方式本质上差不多ESC通过SPI挂DSPDSP的中断脚接ESC的SYNC和IRQSYNC用于同步控制周期IRQ用于通知SPI数据到达。以SPI初始化为例子大致结构是这样void spi_esc_init(void) { // 配置引脚复用 GPIO_setPinConfig(GPIO_16_SPISIMOA); GPIO_setPinConfig(GPIO_17_SPISOMIA); GPIO_setPinConfig(GPIO_18_SPICLKA); // SPI主从模式、时钟极性 SPI_setConfig(SPIA_BASE, DEVICE_LSPCLK_FREQ, SPI_PROT_0_0, SPI_MODE_MASTER, 1000000, 8); SPI_setMode(SPIA_BASE, SPI_MODE_MASTER); SPI_enableModule(SPIA_BASE); }不同芯片的API名字存在差异但顺序都是时钟、引脚、外设、中断。我习惯用一个函数搞定所有初始化先不开中断跑一个SPI回环命令确认帧格式没问题。回环这一步很关键特别是国产芯片的SPI时钟极性和相位很容易和FCE1100对不上。对不上表现为读到的寄存器全是FF或00而且不会报错只能靠逻辑分析仪去查。3.2 编码器接口与位置反馈处理DSP和编码器的接口当前分两种增量式编码器接eQEP绝对值编码器走SPI或SSI串行协议。功能板上预留了两套接口验收时要分别测。增量式编码器的位置采集我用2500线的增量编码器四倍频后每圈10000个计数分辨率为0.036度对一般关节模组已经够用。位置处理有三个坑。第一eQEP计数溢出默认16位位置计数器跑几圈就溢出回绕必须开启32位扩展或者在做控制算法时自己写溢出补偿。第二方向问题电机正转时位置寄存器是减小还是增大取决于A、B相接入顺序。我发现反馈方向反了以后第一反应不是改线而是在初始化代码里把计数方向标志取反这样不用动结构件。第三Z脉冲清零每次过零点的绝对位置参考只有在Z脉冲上才可靠否则累计误差会一点点变大低速运动尤其明显。我的做法是上电回零阶段先让电机低速转一圈捕获Z脉冲后把eQEP计数器清零之后才允许运行使能。对于绝对值编码器DSP接SSI时要注意波特率和帧长度原厂手册通常会写一帧多少位。我建议在固件里先做一个单次读取函数打印原始数据和编码器旋钮实际角度对比确认无误后再接入反馈环。这个验证步骤能省很多时间因为很多编码器热插拔后默认波特率不对读出来的数据全是0你会误以为是硬件坏。3.3 程序固化后必须接 JTAG 才能启动的问题这是本次测试里最让人头皮发麻的问题。程序编译后烧进Flash断电再上电板子完全不跑但是插上JTAG调试器用调试器的Connect Target后再Run程序却能正常跑。表面上看是必须接JTAG才能启动其实根本不是玄学是Flash启动流程压根没走通。拿TI C2000风格启动来说FCP32C335的启动模式由GPIO配置决定。仿真器连接时调试环境会自动执行一段启动序列把.out文件加载到RAM并复位运行这掩盖了Flash启动失败的事实。但真正的上电Flash启动芯片要从Boot ROM读启动配置再根据GPIO引脚状态决定是跳到Flash还是等待串口下载。如果那几个配置引脚被其他外设干扰或者工程链接脚本没有把Flash入口地址放对程序就会停在一个你看不见的地方表现就是上电无现象。还有一个细节attribute((ramfunc))。在TI DSP里把中断服务函数或者时间敏感函数放在RAM里执行能避免Flash等待状态带来的不确定延时。但如果这些函数在Flash启动时没有被初始化拷贝到RAM程序根本跑不到main。我的解决方法是三步检查boot引脚电平用万用表量GPIO对应的启动配置引脚确保不是悬空检查cmd文件确认设置有段把ramfunc段的初始化数据从Flash拷贝到RAM在main最开头加一段LED翻转用示波器看LED波形判断程序到底停在哪一步。另外FCP32C335如果用国产IDE烧录固化后最好用原厂烧录工具校验一下Flash内容因为有些烧录器默认只下载不编程校验导致个别扇区没写进去。这个问题在产线上遇到过表现为10块板中2块上电不启动剩下的都正常。3.4 在 DSP 上做位置环、速度环、电流环控制DSP的核心任务是把EtherCAT写过来的目标位置变成PWM输出。我在这块板上实现的是位置环加速度环加电流环三环电流环8kHz位置和速度环1kHz。电流环在PWM中断里跑用ADC采样相电流经过Clark和Park变换得到d、q轴电流位置环和速度环在EtherCAT同步中断里跑读取eQEP位置和目标位置做比较输出速度指令和电流指令。PID代码不复杂写法可以参考float pid_calc(PID_t *pid, float target, float actual) { float err target - actual; float out pid-kp * err pid-ki * pid-integral pid-kd * (err - pid-prev_err); pid-integral pid-integral pid-ki * err; if (pid-integral pid-i_limit) pid-integral pid-i_limit; if (pid-integral -pid-i_limit) pid-integral -pid-i_limit; pid-prev_err err; return out; }PID调试我推荐用带图形界面的工具有些DSP开发环境内置了PID调参面板或者接一个简单的上位机在线改Kp、Ki、Kd。熟手可以先用临界比例法调位置环把Ki、Kd置0慢慢加大Kp直到系统等幅振荡记录此时的振荡周期和临界增益再按经验公式整定参数。实测下来关节模组的位置环Kp从0.5开始试比较稳速度环再单独整定。千万别一开始就让主站发大幅阶跃容易过流跳阐调参前一定先把电流限幅设好保护优先。4. 功能板联合调试与常见问题排查4.1 从单从站到多从站的联合调试流程单从站调通后我把板子接入包含其他从站的测试环境验证多点位通信。EtherCAT在单网段里可以挂几十个从站但多从站时会出现两类问题一类是从站响应顺序和DC同步偏差另一类是一根线缆接触不良导致后面所有从站掉线。DC是EtherCAT多轴同步的关键FCE1100作为支持DC的从站会测量自身时钟和主站参考时钟的漂移并在每个SYNC周期产生中断。TwinCAT里可以查看DC偏差通常应该控制在几十纳秒到一两百纳秒内如果偏差很大要从线缆质量和主站时钟配置两头查。和汇川Easy521 PLC配合测试时我在主站侧用了一个小的PLC程序周期任务里给从站写目标位置从0到360度往复运动。Easy521的EtherCAT配置在AutoShop里做导入从站XML后过程数据变量会自动映射到PDO这对产线调试非常友好。要注意的是PLC主站的周期任务时间设置会影响整条链路抖动。我曾经把任务周期从1ms改到500us从站反馈的电流数据出现毛刺不是算法问题而是主站周期过短导致DSP的SPI带宽不足。这种情况下要把控制算法拆到两个周期执行位置环在1ms跑电流环在0.125ms跑各用各的中断。4.2 常见问题速查表测试过程中我把遇到的问题整理成了速查表方便现场排查现象可能原因排查方法扫描不到从站EEPROM未烧录、XML没加载读0x0000寄存器确认EEPROM有值从站一直停在INITPDI接口初始失败SPI回环测试检查CS、CLK极性SafeOP进OP失败SM长度或PDO映射不匹配对比SSC和XML的PDO长度OP后数据不更新ESC看门狗超时查看WKC检查SPI中断响应时间上电不运行Flash启动失败、boot引脚不对检查boot GPIO、cmd文件、ramfunc拷贝位置反馈乱跳编码器方向错、相序反、干扰eQEP方向取反加滤波查Z脉冲电流冲击大PID参数不当、PWM死区不够从位置环慢调限制i_limit这些现象中扫描不到从站是出现频率最高的而且绝大多数不是芯片坏了而是EEPROM没烧录或者XML文件没拷贝到位。寄存器读一下0x0000到0x0003就能确认EEPROM内容是否有效。还有一个容易被忽略的点FCE1100的两个EtherCAT端口如果只有一个接了网线INIT到PREOP会因为第二个端口未连接而产生警告但一般不影响进入OP要是强迫症可以不管它。4.3 实测数据与改进经验最后放一组实测数据供参考。单从站、1kHz周期、DC同步的模式下FCP32C335的SPI中断抖动大约在正负1us以内DC偏差大约在80ns量级过程数据收发连续跑12小时没有掉线。换成500us周期后SPI带宽开始吃紧中断抖动变成正负3us位置环还能跑但电流波形已经出现毛刺所以性能评估要以实际负载为准不能只看寄存器速度。这段时间积累了几个经验值得写下来。第一从站侧先用寄存器读写工具验证不要急着上TwinCAT。工具读回的寄存器值比任何软件日志都可靠特别是0x0000到0x0010这个区域能直接反映ESC是否在工作。第二抓包、寄存器、示波器要三者互证Wireshark只能说明主站发出了什么从站有没有正确响应还得看寄存器状态字和SPI波形。第三国产芯片的手册一定要看勘误表有些坑在手册正文里不写只在勘误表里提一句比如某版本SSC生成的驱动在特定条件下会丢中断这类问题靠猜是猜不出来的。最后说一句我最深刻的体会是调试国产芯片最大的成本不是芯片本身而是配套资料和工具链的完整度。FCE1100加FCP32C335这套方案本身没问题但很多坑藏在SSC版本、烧录校验、启动模式这些细节里。如果你也刚拿到类似的板子我建议按这个流程一步步来每层验证都留下日志特别是eQEP计数和SM中断的时间戳。这几条记录会是你在联合调试时最救命的东西。后面有机会我再单独写一篇关于国产DSP在关节模组上做无传感器控制的内容先把这个坑位的经验分享到这儿。