ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

EtherCAT从站开发实战:SSC V5.11与AX58100+STM32移植全流程

EtherCAT从站开发实战:SSC V5.11与AX58100+STM32移植全流程 做EtherCAT从站开发这一年多前前后后折腾过不少芯片和方案从最早用STM32LAN9252到后来换到AX58100再到现在把整套SSC V5.11流程跑顺中间踩过的坑比想象中多得多。尤其是SSC这个工具别看界面简单配置项里的门道不少一个参数选错后面移植到STM32上就是几天的排查时间。这篇文章就把我从SSC V5.11生成代码到AX58100STM32跑通EtherCAT从站的完整流程梳理出来重点讲清楚每个环节为什么这么做、有哪些坑需要避开。无论你是刚接触EtherCAT从站开发的新手还是已经在用LAN9252想切换到AX58100的老手这篇文章都能帮你少走不少弯路。1. 整体设计与核心需求拆解1.1 为什么选择AX58100搭配STM32先说说方案选型的问题。EtherCAT从站方案市面上主要有三种路线一是直接用带ESCEtherCAT Slave Controller集成功能的MCU比如瑞萨的RZ/N系列二是用独立的ESC芯片加通用MCUAX58100和LAN9252都属于这一类三是在FPGA里自己实现ESC协议栈。三条路线各有各的适用场景但对于大多数中小团队来说独立ESC芯片加MCU是最稳妥的选择。AX58100这颗芯片之所以值得推荐有几个很实在的原因。首先是它自带两个以太网PHY。这一点非常关键EtherCAT从站天然要求支持线型拓扑一个IN口一个OUT口如果ESC芯片不带PHY你还得在外围加两颗PHY芯片BOM成本、PCB面积、调试难度都会明显上升。AX58100把PHY集成进去了外围电路简单很多电源加个晶振就能跑起来。其次是SPI接口的兼容性。AX58100支持SPI从模式主控MCU通过SPI读写ESC寄存器这种架构下MCU选型非常自由。STM32F103这种入门级芯片就能带得动F407、F429更是绰绰有余性能余量很大。第三是亚信官方提供的资料相对完整。数据手册、硬件参考设计、ESC寄存器说明、应用笔记都有虽然有些文档是英文的但对照着SSC生成的代码一起看基本能读懂。STM32这块就不用多说了生态成熟、资料丰富、成本低做从站开发完全够用。我用的是STM32F407VET6主频168MHzSPI跑在10MHz以上很轻松实际测下来协议栈处理占用率很低还有大量余量跑应用逻辑。1.2 快速搞懂EtherCAT从站的数据交互机制在动手配置SSC之前建议先花点时间把EtherCAT从站的数据交互机制理顺。很多人一上来就打开SSC点下一步生成完代码发现完全不知道从哪下手核心原因就是没理解协议栈的运行逻辑。EtherCAT从站的数据交互分为过程数据和邮箱数据两类。过程数据是周期性刷新的比如伺服的位置指令、实际位置、IO状态走的是FMMUFieldbus Memory Management Unit加SyncManager的通道。邮箱数据是非周期性的用于传输SDO参数、FoE固件升级等走的是邮箱通信机制。理解一个关键点就行主站通过以太网帧访问ESC芯片内部的寄存器空间和用户RAM空间ESC芯片通过中断通知MCU有数据到了MCU通过SPI读写ESC内部的共享内存然后协议栈代码负责把共享内存里的数据和用户应用层变量之间的映射关系处理好。SSC生成的就是这套协议栈加应用层框架的代码。所以整个开发流程可以拆成几个部分SSC生成协议栈代码、把代码移植到STM32工程、实现SPI底层驱动、配置ESC的SyncManager和FMMU、编写应用层对象字典和PDO映射、最后上电联调。理解了这条主线后面看到SSC里那些配置项就不会慌了。2. SSC V5.11核心配置与代码生成实操2.1 SSC V5.11安装和工程创建要点SSCSlave Stack Code工具本身是个Windows程序安装过程没什么特殊的一路下一步就行。需要注意的一点是版本问题我用的是V5.11这个版本生成的代码结构和老版本有些差异网上很多教程是基于V4.x的对不上号会浪费很多时间所以建议直接用V5.11照着这篇文章操作。打开SSC工具后界面非常朴素左边是配置导航右边是配置详情。创建新工程时首先要选ESC型号。这里要注意SSC工具原生支持的ESC型号里有些版本列表中没有AX58100这个选项我当时第一次使用就卡在这一步。解决办法是选择兼容模式AX58100的寄存器结构和Beckhoff的ET1100高度兼容在SSC里选择ET1100或者ESC1P具体看版本就能正常生成代码然后手动修改几个寄存器地址即可。创建工程后重点要配置几个页面。第一个是General页面这里设置从站的基本信息包括Vendor ID、Product Code、Revision Number等。这些ID要跟EEPROM里的信息对应起来主站扫描时会根据这些ID识别设备。我习惯先把这些ID定义好后面写EEPROM时直接复用。第二个关键页面是Hardware选择MCU类型和SPI接口参数。SSC工具本身不认识STM32但这不影响代码生成因为MCU相关的适配代码都在移植时手写SSC生成的是协议栈核心代码跟具体MCU无关。这个页面的操作是选择ESC的访问方式AX58100用SPI模式接口类型选SPI Slave数据宽度选8位或16位都可以推荐16位模式读写效率更高。2.2 代码生成前的参数配置与选择逻辑SSC工具里最核心的几个配置组是ESC Settings、Application和Mailbox这里面的参数选择直接决定生成的代码结构和功能。ESC Settings里的SyncManager配置要重点检查。EtherCAT从站至少有四个SyncManagerSM2用于过程数据输出主站到从站SM3用于过程数据输入从站到主站SM0和SM1用于邮箱通信。SSC生成代码时默认会把这四个SyncManager都配置好但你要确认它们的起始地址和长度是否满足需求。地址分配原则是SM0和SM1的邮箱缓冲区靠前SM2和SM3的过程数据区靠后各区域不能重叠。Application页面选择应用层协议最常用的就是CoECANopen over EtherCAT。如果你需要做固件升级还要勾选FoE需要在线调试参数选CoE就够了。生成的代码会根据选项包含对应协议的处理逻辑。我最初只勾了CoE后面加FoE功能时重新生成过一次所以建议一开始就把FoE勾上反正影响不大。Mailbox配置里要注意的是缓冲区大小。邮箱缓冲区默认配置是128字节或256字节如果SDO传输的数据量比较大建议直接配成512字节或者按ESC的邮箱缓冲区上限来配。配置小了不会报错但大块数据读写时会频繁分帧效率低而且容易出问题。所有参数都确认后点Generate生成代码。SSC会输出一个zip包里面就是完整的从站协议栈工程底层驱动、协议处理、应用框架都已经搭好了。但要注意SSC生成的代码是不能直接编译运行的它只是给你一个基础框架MCU平台相关的代码需要自己写。到这里可以给你一个实操建议SSC生成代码后先不要急着改代码用Beyond Compare之类的工具把生成的代码目录结构熟悉一遍搞清楚哪个文件是干什么的。V5.11生成的主目录里ssc_drv.c是ESC底层驱动ssc_serv.c是协议栈服务层ssc_appl.c是应用层入口cci.c是通用命令接口。这几个文件是移植时要重点关注的。3. 从协议栈到STM32工程移植3.1 数据类型、OSAL层和SPI驱动的适配SSC生成的代码是平台无关的但里面用了不少可移植性设计需要在STM32里把这些适配好才能跑起来。类型定义这块最简单也最容易出错。SSC代码里用了uint8、uint16、uint32这些类型在STM32工程里需要在头文件里定义清楚。如果用的是标准库加C99环境直接在工程配置里开启C99标准然后包含stdint.h就行。如果用的是老工程没有stdint.h那就自己在头文件里typedef。OSAL层是整个移植的难点。SSC协议栈运行时需要用到一些系统服务函数比如定时器获取时间戳、事件标志设置、互斥锁、内存拷贝等这些在SSC代码里都通过回调函数实现。在STM32上的做法是用SysTick提供1ms时基然后用一个全局变量记录运行时间。事件标志用GPIO中断加标志位的方式实现。SPI底层驱动是性能关键这里分享一个实测有效的配置方案。STM32F407的SPI1跑在10.5MHzCPOL和CPHA都设为0即模式0AX58100文档说明支持SPI Mode 0和Mode 3两种都行我用的是Mode 0。每次通信前把CS拉低通信完成后拉高注意CS信号必须用GPIO软件控制不能用SPI硬件的NSS自动管理。读写ESC数据时我封装了一个函数先写地址再写数据或者读数据。地址字节的高两位表示操作类型这个在AX58100的SPI接口文档里写得很清楚00表示读01表示写。实测下来一次典型的16位寄存器读操作大概是几百纳秒完成满足EtherCAT的周期要求完全没问题。3.2 EEPROM配置与从站信息写入AX58100内部没有非易失性存储从站信息SIISlave Information Interface存在外部的EEPROM里芯片上电后会自动读取EEPROM的内容来配置ESC。如果你的板子上没有焊EEPROM那就必须在MCU侧实现EEPROM仿真功能在协议栈初始化时把从站信息通过SPI写入ESC内部的SII寄存器。我用的是实际EEPROM方案板子上焊了颗AT24C02挂在AX58100的SII接口上。这样做的优势是上电即用MCU固件更新不会影响从站信息的加载而且主站扫描时速度更快。EEPROM的配置数据不要手动去写SSC生成的代码里带了一个EEPROM生成工具或者可以参考配置文件里面包含了从站ID、SyncManager配置、FMMU配置、PDO映射等所有必要信息。你需要做的是把SSC工程里配置的那套参数原样转换成EEPROM的二进制内容。这里有个非常容易踩的坑EEPROM里有一个Enable Flag位位于第一个字节的最高位。上电时ESC会检查这个标志如果没置位就会认为EEPROM无效从站无法正常进入OP状态。很多人的从站扫描不到问题就出在这里。我第一次调试时就是在生成EEPROM数据后忘记检查这个标志位折腾了两天才发现是这种低级问题。EEPROM内容里的PDO映射表也要重点检查。AX58100的默认PDO映射区域是0x1000到0x10FF实际可用的映射区域大小取决于ESC的版本和配置。如果映射的变量地址超出了ESC的RAM范围主站配置PDO时就会报错或者运行时不刷新数据。这个映射关系在SSC的Application配置里可以提前规划好建议先用小数据量跑通全流程再逐步增加IO点数。3.3 应用层接口PDO映射和对象字典的编写思路协议栈移植完成后就要开始写应用层代码了。这一步是很多人觉得最抽象的其实搞清楚了就很直白你要做的就是把应用里的变量和SSC代码里的输入输出缓冲区对应起来。SSC生成的代码里过程数据交互的入口是SSC_AppInputUpdate和SSC_AppOutputUpdate这两个函数。主站发过来的数据会先被协议栈放到输出缓冲区然后调用SSC_AppOutputUpdate你在这个函数里把缓冲区里的数据拷贝到应用层变量应用层要发出去的数据在SSC_AppInputUpdate函数里把变量拷贝到输入缓冲区协议栈会在下一个周期发出去。实际操作时我维护了一个结构体来管理所有应用数据比如伺服控制场景下会有目标位置、运行速度、使能状态这些字段结构体的内存布局和SSC配置的PDO映射保持一致。这样在Update函数里直接用memcpy整块拷贝就行速度快代码也简单。对象字典的实现也有一个技巧。CoE协议里的SDO访问本质上就是主站读写从站的对象字典。SSC生成的代码里对象字典是一个一个大表每项包含索引、子索引、数据类型、读写权限等属性。V5.11版本的代码结构相对清晰添加自定义对象时先在对象字典表里加一行然后在对应的读写回调函数里添加处理逻辑即可。这里要特别提醒一下添加对象字典后一定要同步更新CANopen对象字典到PDO映射的对应关系。这个对应关系在SSC里配置生成的代码会包含一个映射地址表如果是自己在代码里手动添加的对象别忘了在映射表里注册否则SDO读得到PDO周期性传输却用不了。4. 联调过程与常见问题排查4.1 用TwinCAT进行从站联调代码移植完成、硬件上电正常后就要进入联调阶段。主站软件我用的是倍福的TwinCAT 3免费授权模式下可以跑两小时用于开发调试完全够用。先把网线接好主站电脑的网口接到AX58100的IN口如果要级联测试把另一个设备接到OUT口。打开TwinCAT XAE新建一个工程后在I/O设备里扫描EtherCAT设备。如果一切正常主站会自动识别出从站显示Vendor ID和Product Code。如果扫描不到先不要怀疑协议栈代码用排除法检查硬件有没有问题、SPI有没有通、EEPROM内容对不对。识别到从站后进入配置界面会看到从站的状态机从INIT切换到PREOP再切换到SAFEOP最后到OP。这中间任何一个状态切换失败TwinCAT都会弹出错误码和错误描述这是排查问题的最重要线索。比如切换PREOP失败多半是邮箱通信配置有问题切换到SAFEOP失败大概率是同步管理器配置或者输入输出长度对不上切换到OP失败通常跟DC同步配置和应用层配置有关。TwinCAT的在线视图里可以看到SM、FMMU的配置情况以及每个通道的PDO数据。数据不刷新时先看输入输出的长度是否跟从站上报的一致然后再检查Update函数有没有被正确调用。4.2 高频故障对照表与处理方案这几个月调试下来我把遇到的高频问题整理了一张速查表基本覆盖了常见的坑分享给大家参考。故障现象可能原因排查与解决方案主站扫描不到从站ESC没有读取到有效EEPROM检查EEPROM的Enable Flag是否置位用示波器抓SII时钟和数据信号确认通信时序主站扫描不到从站SPI通信异常检查CPOL和CPHA是否匹配CS引脚是否有毛刺SPI初始化GPIO速度配置是否正确PREOP到SAFEOP失败SyncManager配置错位在TwinCAT在线视图中核对SM2/SM3的起始地址和数据长度与从站上报的是否一致OP状态进不去DC同步异常检查SYNC0中断有没有正常触发ESC的DC寄存器里时间基准是否正确中断延迟是否过大过程数据不刷新PDO映射地址错误核对TwinCAT里的映射地址与SSC配置的PDO映射是否一致检查Update函数是否真的在周期执行SDO读写超时邮箱缓冲区大小不足在SSC里调大邮箱缓冲区长度重新生成代码或者检查应用层SDO处理是否有阻塞操作从站偶发掉线SPI通信毛刺降低SPI频率、增加CS空闲时间检查PCB布局SPI信号线远离电机驱动等高干扰源实际调试中你会发现大部分问题最后都能归结到配置不一致上SSC里的配置和实际代码不一致代码里的映射和TwinCAT里的映射不一致。所以建议准备一个配置记录表把SSC里的关键配置项、代码里的关键地址、TwinCAT识别到的实际值都记下来对照排查比凭感觉猜要快得多。5. 随手就能用的几条调试技巧与避坑心得分享几个这个项目里最有价值的调试心得。第一逻辑分析仪是调试SPI和ESC交互的神器。很多配置上的问题比如CS时序太短、字节间间隔太长、通信速率不匹配都通过抓波形就能一眼看出问题。我在板子上留了带测试点把SPI CS、SCK、MISO、MOSI都引出来调试效率提升非常明显。第二TwinCAT的报文监控功能要会用。它能抓到主站和从站之间所有EtherCAT帧帧类型、通信状态、地址、数据内容一目了然。调试邮箱通信时开启报文监控你能直接看到主站发的CoE请求和从站的响应SDO读不到数据时到底是请求没到从站还是响应没回主站一目了然。第三尽量不要一个人闷头DEBUG太久的从站协议栈问题。EtherCAT协议栈虽然没有传统以太网协议栈复杂但涉及ESC寄存器、SyncManager、FMMU、邮箱协议等多个层面一旦出现问题嵌套在多个层面里单靠读代码排查效率很低。我习惯先用示波器看几个关键信号再结合TwinCAT的寄存器在线读取功能一个寄存器一个寄存器地对照手册确认这样排错速度快很多。第四版本管理要尽早做。SSC生成的整包代码、你自己修改过的代码、最终验证确认能用的代码分开保存并且做好版本备注。因为调试过程中经常会调整配置重新生成代码如果没有备份容易把之前能跑通的代码覆盖掉还得花时间排查到底哪里被不经意改坏了这是极其浪费时间的事。最后再说一个细节AX58100的复位时序很关键。上电后要让ESC的RESET引脚保持一段时间低电平然后再拉高期间等待芯片内部初始化完成。如果从站上电后第一次通信总是不稳定大概率是复位时间不够。我在代码里做了两次复位操作初始化之前先复位一次初始化后再延时几百毫秒这个问题的概率几乎就降为零了。整个流程跑通之后你会发现用STM32加AX58100做EtherCAT从站开发的整体思路和其他工业总线从站开发没有本质区别理解了数据通路和状态机剩下的就是把配置对齐、把驱动写稳、把应用层接口接好。希望这篇实战记录能帮正在踩坑的你省下几天时间有什么问题也欢迎一起交流。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进