尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

瑞萨RZN2L EtherCAT从站开发实战:从原理到调试的完整避坑指南

瑞萨RZN2L EtherCAT从站开发实战:从原理到调试的完整避坑指南 如果你拿到瑞萨RZN2L这颗料第一反应大概率和我一样这玩意儿到底怎么跑通EtherCAT我在第一次接触RZN2L工业以太网开发时光是把开发环境搭起来、让主站扫到从站就折腾了将近两周。后来回头看很多问题不是芯片不行而是EtherCAT本身这套流程和普通以太网应用差异太大细节又多稍不注意就栽进去。这篇内容就围绕RZN2L EtherCAT从站开发按照从基础原理、开发环境、协议栈集成到通信调试的完整流程把关键步骤和避坑经验写出来。适合第一次做EtherCAT从站的朋友特别是用RZN2L做控制器或者评估方案的工程师手头已经有量产从站设备调试经验的也可以参考最后的排查思路。1. 先把基础概念捋清楚EtherCAT从站到底在做什么1.1 EtherCAT原理里必须搞明白的几个点EtherCAT是一个主从式实时工业以太网协议也可以叫实时以太网。主站发送一帧报文这帧报文会顺序穿过环网上的所有从站在每个从站处由硬件ESC处理提取发给本站的数据插入本站要上传的数据然后把帧转发给下一个从站。注意这里不是普通的以太网交换转发每个从站处理的是数据帧经过时的“飞过式”读写所以延迟非常小通常在一个从站上只有几百纳秒到微秒级。你可以想象一辆货车经过流水线每个工人在车经过的瞬间取下自己的快递、放上自己发出去的文件货车不停整体效率很高。接着一定要理解从站状态机。EtherCAT从站有四个主状态INIT、PRE-OP、SAFE-OP、OP。主站通过状态机控制从站的工作状态每个状态之间切换顺序固定INIT - PRE-OP - SAFE-OP - OP。从站需要在每一层正确初始化相应的通信通道比如PRE-OP阶段启用邮箱通信SDOSAFE-OP阶段开始刷新输入数据OP阶段输出才真正有效。很多入门者一上来就想直接跳到OP结果从站压根没反应因为状态机每一层都有对应要求跳不过去。通信对象也要分清楚。EtherCAT常用的两类数据是PDO和SDO。PDO是周期性过程数据负责实时收发比如几个字节的控制字、状态字、速度给定实时性要求高。SDO则是非周期性的邮箱数据一般用来读写参数、下载配置、做诊断。应用层协议里最常见的是CoE也就是CANopen over EtherCAT很多伺服、IO模块都用它来跑参数和诊断。换句话说从站代码里最先要跑通的其实就是状态机和这两类数据通道。1.2 RZN2L为什么适合做EtherCAT从站RZN2L是瑞萨面向工业以太网应用推出的MPU一个很大的特点就是内部直接集成了EtherCAT从站控制器ESC。这相当于把很多方案里外挂的ET1100、ET1200、LAN9252这一类从站控制芯片直接放进了主控芯片里。这样做有两个直接好处第一是BOM成本下降、PCB面积更小第二是ESC和CPU之间不再是外部总线通信数据访问路径更短出现总线竞争和信号干扰的概率低一些。另外RZN2L的主处理器核来自Arm Cortex-R系列这类核心本身针对实时性设计适合跑周期严苛的控制任务。所以在方案上它既要处理EtherCAT通信还要同时跑电机控制、IO扫描等实时逻辑也比普通MCU更有底气。当然芯片能力最终取决于平台软件是否完整尤其是瑞萨提供的例程和协议栈是否齐全。我的建议是拿到板卡后先看官方例程里的ESC寄存器配置和PHY驱动这些是后面排障的基础。使用RZN2L还有一个隐性好处你已经拥有一个支持工业以太网的MPU以后产品线如果要切换到PROFINET、EtherNet/IP等协议RZ/N2L系列内部也有对应方案不用重新换平台。但要注意不同协议对应的协议栈和配置工具都不一样不要想着一份代码通吃。选型时尽量把产品规划想清楚不然后期换协议栈的工作量远比换一颗芯片更大。2. 开发环境搭建与工程生成这一步决定后面顺不顺2.1 用RASC和e2 studio生成基础工程RZN2L开发最常规的一套工具链是瑞萨的e2 studio集成开发环境配合RASCRenesas Advanced Configurator图形化配置工具。用过瑞萨MCU的人应该都知道RASC的概念类似STM32CubeMX用来配置时钟、引脚、外设然后生成初始化代码。RZN2L这类MPU也是同样的套路只是支持的器件系列不同。我建议直接去瑞萨官网下载新版e2 studio安装时确认RASC插件已经勾上。打开e2 studio后新建工程时选择目标器件为RZN2L系列会自动进入RASC图形界面。界面里一般分三块时钟配置、引脚配置、外设配置。对于EtherCAT从站重点是先把系统时钟和PHY所需的时钟配好然后再配置ESC相关外设。这里千万不要直接跳过时钟配置EtherCAT对时钟同步很敏感如果ESC或PHY的时钟来源不对后面主站扫描链路都会出问题。生成的代码结构里main.c、pin_data.c、r_bsp这些文件不要手动改后续要改配置就回到RASC重新生成再同步到工程。很多新手喜欢直接改生成的代码结果下次生成配置时冲突或者留下莫名其妙的Bug。这个习惯在瑞萨平台上尤其要克制。如果你习惯用KeilRASC也可以生成Keil工程我们在2.3小节细说。2.2 引脚配置与ESC接口映射这里是最容易踩坑的地方。RZN2L内部集成了EtherCAT ESC但ESC不能直接连RJ45它需要经过一个外部以太网PHY芯片比如我常见到的KSZ8081、DP83822这类单口百兆PHY。所以你在RASC里要配置的是CPU到PHY之间的MII/RMII接口信号以及PHY的MDIO管理接口、复位脚、中断脚。以MII方式举例几个关键信号大致是信号组方向说明TXD[3:0]/TX_EN输出数据线和发送使能CPU送到PHYRXD[3:0]/RX_DV输入数据线和接收数据有效PHY回到CPUTX_CLK/RX_CLK输入发送/接收时钟由PHY提供MDC/MDIO输出/双向管理接口读写PHY寄存器PHY_RST输出PHY复位脚注意电平极性PHY_INT输入PHY中断脚可接到CPU的INTC这个表不是某个开发板原理图但基本是所有百兆PHY和ESC之间MII接口的通用信号。配置引脚时除了看信号名还要看网络标号是否和你的硬件原理图一致尤其是在引脚复用多的情况下。另一个容易忽略的点是PHY地址。PHY芯片一般通过引脚硬件的上下拉配置地址常见值是0x00到0x1F。如果你的PHY地址实际是1但代码里按0去读就读不到PHY ID链路状态会一直不对。我之前在RZN2L调试时就因为PHY地址和原理图不一致EtherCAT链路始终Link不上后来用MDIO工具读出寄存器才发现问题。这里建议一开始就把PHY地址、时钟极性、复位时间这些在硬件设计阶段固定下来。还有RASC生成的引脚配置最好对照官方评估板原理图检查和校准官方例程的引脚分配不一定适合你的板子但官方原理图能告诉你哪些引脚内部有特殊连接、哪些必须配置成上拉或下拉。2.3 Keil环境下如何落地用Keil做RZN2L开发也完全可以很多工程师更习惯Keil。第一步需要先装RZN2L的器件支持包也就是Device Pack否则Keil的器件列表里找不到芯片。然后在RASC的Toolchain设置里把编译器切换到Keil这样RASC生成的就是Keil工程里面已包含了分散加载文件和启动文件比手动从e2 studio工程转代码省心很多。Keil工程调试RZN2L时需要配置调试器。瑞萨官方常见的调试器是E2/E2 LiteKeil里选择的调试接口一般是SWD。关于E2 Lite引脚定义网上能找到很多资料但我建议直接看瑞萨官方硬件手册。实际接SWD时要注意GND连接E2 Lite的接口通常是14pin或20pin具体看你手上的转接板。我第一次用第三方SWD转接板信号线顺序没对上Keil一直报No target connected后来才发现转接板丝印和实际定义有出入。这个问题不大但只要出现一次就会浪费大半天时间。在Keil里调试RZN2L时建议设置好Flash Download算法不然点击下载会提示找不到芯片型号。还有Keil的调试视图里能看到外设寄存器但默认不一定包含ESC相关寄存器你可以手动添加表达式或者使用命令窗口读寄存器这会比打印日志快得多。3. 从站协议栈集成与ESI文件从站能不能被识别就看这里3.1 用SSC生成从站代码EtherCAT从站协议栈官方通用做法是用ETG提供的SSC工具生成。SSC的全称是Slave Stack Code它可以选ESC型号、应用层协议、邮箱类型然后生成一套C语言协议栈源码。RZ/N2L的ESC描述文件可以从瑞萨官网下载导入SSC后就能生成适配这颗芯片的底层代码。使用SSC工具时有几点建议。第一选择ESC类型或型号时务必确认与RZ/N2L内部ESC一致因为不同ESC的寄存器地址空间、SM通道数量、DC功能可能不同。第二应用层协议优先选择CoE这是实际项目里最常用的不管你的最终设备是IO模块还是伺服驱动器CoE都能覆盖大部分需求。第三SSC生成的代码里面会区分核心代码和用户代码核心代码如ecat_main、ecat_coe尽量不要改动用户应用代码放在appl.c、object_dictionary.c这类文件里。这样以后SSC升级或重新生成时改动不容易丢。生成后把协议栈源码整体复制到RZN2L工程里。接着就要做集成工作。RZ/N2L内部集成的ESC它的寄存器读写接口、中断处理入口和SSC默认的外部ESC驱动不一样需要根据瑞萨提供的驱动函数封装一下。这一步往往是整个过程中改动量最大的环节也是容易出错的环节。别急先把SSC里的main函数入口和ESC初始化函数找清楚再跟着瑞萨例程的调用顺序走一遍。3.2 ESI文件设计与PDO映射ESI文件是EtherCAT从站信息文件本质上是一个XML文件主站启动时会读取它来识别从站。ESI文件里有厂商ID、产品代码、从站名、对象字典、PDO映射等信息。用SSC工具通常也能生成一个初始ESI但实际项目里往往要改。最常见的坑是主站扫到从站后能识别厂商和产品ID但接下来配置PDO时一直报错。原因是ESI文件里的PDO映射和固件里实际的对象字典不一致。比如你在ESI中声明了0x1600对应RXPDO里面有4个入口但固件代码里只将0x1600映射了2个对象主站配置就会失败。所以ESI文件和固件对象字典必须同步更新。我习惯把对象字典和ESI文件放在版本管理里一起评审修改任何一边另一边一定要同步。PDO内容设计中另一个容易忽略的是数据类型和数据长度。CoE对象字典里每个PDO入口都关联一个索引和子索引要确保类型对齐比如uint16、int32。如果类型不对齐主站发过来的数据解析就是乱码更麻烦的是有些主站工具在扫描阶段不报错到了实际运行时数据才异常。ESI文件写完以后建议用一个XML校验工具检查格式。主站对XML文件比较严格少一个结束标签或者字段顺序错了可能导致从站无法识别。TwinCAT除了解析XML之外还会把从站信息放到EtherCAT设备列表中如果你修改了ESI文件需要在TwinCAT里清理缓存再重新扫描否则它还是用旧的配置。这一条我踩过好几次改了从站信息却忘了刷新缓存半天看不到变化。3.3 把协议栈集成到RZN2L工程把SSC生成代码集成到RZN2L工程我建议分三步走。第一步先保证协议栈能编译通过不急于加业务逻辑。第二步实现最基础的应用钩子函数状态机变化回调、PDO数据更新回调、SDO读写回调。用SSC工具生成的代码通常这些函数已经存在但里面是空的或默认实现需要你往里面填内容。第三步再在这个基础上加你的设备控制逻辑。这里特别提醒一点EtherCAT从站的实时数据通道最终要靠中断或高优先级任务来及时处理。RZN2L内部有实时处理能力但如果你在PDO回调里写了太多业务代码比如复杂的数学运算或阻塞延时就会影响周期通信。我比较建议的做法是把PDO处理做成“快速搬运”中断里只把过程数据复制到全局变量真正的控制和运算放到低优先级任务里保证通信周期稳定。以实际经验来说EtherCAT从站通信周期常见的1ms、0.5ms如果PDO回调里跑了浮点除法加日志抖动会非常明显。另外EEPROM里的SII数据也经常影响系统识别。很多从站方案在ESC外部挂一个EEPROM里面保存SII数据包括厂商ID、产品ID、PDO默认值等。RZN2L的评估方案通常也有EEPROM。如果EEPROM没烧录或数据不对主站扫描时就只能识别到链路却读不到完整从站信息。这一步在集成阶段就要检查不要把问题留到现场调试。4. 主站通信调试全流程从网线到数据交互4.1 调试前检查和硬件连接在打开主站工具之前先做最基础的硬件检查。焊好板子后先量电源再确认PHY芯片复位时间和晶振是否起振然后用普通以太网设备验证PHY比如把RZN2L的PHY和电脑直接连起来用网络调试助手做UDP收发。这一步很土但非常有效。因为EtherCAT的底层仍然是标准以太网帧如果你在普通以太网通信下都Link不上或者收发丢包那问题大概率在硬件而不是EtherCAT协议。EtherCAT主站的网卡选择也要注意。用TwinCAT开发时不是所有网卡都能被识别。TwinCAT对Intel 82574L、I210、I211等网卡支持得比较好。如果你的开发机上只有一颗不支持的网卡可以考虑USB转有线网卡但性能可能不稳定。对于快速验证用支持良好的集成网卡最省心。如果是在Linux平台用IgH主站道理类似需要确认网卡驱动支持EtherCAT模式。我看到有的项目用正点原子RK3568这类ARM板做Linux主站跑EtherCAT官方内核和igc网卡驱动也需要专门配置并不是装上系统就行。还有一个很常见的低级问题主站和从站的网线顺序。EtherCAT拓扑上主站接从站的IN口如果你有多级从站还需要从上一级的OUT口接到下一级的IN口。有些PHY和变压器设计时IN和OUT的标识不明显经常有人接反。接反以后可能Link灯也亮但主站扫描不到完整拓扑因为EtherCAT帧没法正常往下传。4.2 主站配置与状态机切换以TwinCAT为例扫描从站前先在TwinCAT中注册EtherCAT从站描述文件也就是ESI文件。注册之后在I/O设备里选择EtherCAT Master然后扫描设备。扫描成功后能看到你的RZN2L从站设备厂商、产品ID、设备名都和ESI文件对应。这之后开始手动切换状态机。TwinCAT的在线窗口里有当前状态、请求状态、错误状态几个字段。通常操作顺序是先请求PRE-OP等状态变成PRE-OP再请求SAFE-OP最后请求OP。如果某一步请求后状态频繁回退读一下错误寄存器通常会有具体错误码。比如状态机卡在SAFE-OP但请求OP失败多是由于PDO输出参数配置不一致。在Linux上使用IgH主站流程类似但工具不一样。你需要用ethercat命令来查看从站状态例如 ethercat states 查看状态、ethercat slaves 列出从站。IgH默认状态下从站可能只是INIT或PRE-OP需要你显式设置到OP。刚开始用IgH的时候会不习惯不过它命令行很直观多敲几次就记住了。如果使用实时补丁内核还要确认EtherCAT主站模块加载是否正常igc网卡绑定是否成功否则ethercat命令会一直显示找不到主站。这里还有个小技巧主站切状态的时候最好一个状态一个状态地切不要一下从INIT切到OP。虽然协议规范允许主站跳转但实际调试中一步步来能更早暴露问题。比如从INIT能到PRE-OP说明邮箱通道正常从PRE-OP到SAFE-OP说明输入PDO同步正常从SAFE-OP到OP说明输出通道能工作。哪一步卡住问题基本就锁定在哪一层。4.3 用网络抓包和断点定位数据问题EtherCAT是在标准以太网帧里跑的协议所以可以用Wireshark抓包。但必须插在合适的位置。如果你把抓包网卡放在主站和从站之间需要用一个HUB或者镜像口不建议直接用普通交换机因为交换机可能会破坏EtherCAT帧的实时转发。Wireshark打开网卡后过滤EtherCAT协议可以看到状态机切换、邮箱数据、过程数据帧。分析关键字段比凭经验猜高效得多。如果你发现OP模式下从站收不到输出数据或者输入数据一直没更新常见原因是PDO映射问题。先用Wireshark确认主站有没有周期性发送过程数据帧再看帧里的数据段对应从站映射是否正确。如果帧到达了但从站应用层没有响应就要在固件里打断点或者加日志输出。注意EtherCAT实时通信中不能随便暂停CPU因为暂停期间主站会认为从站超时。我建议不要打断点卡在PDO处理函数里而是增加一个状态全局变量用一个串口或调试接口把关键寄存器和状态打印出来。抓包有一个难点EtherCAT帧不是普通IPv4报文需要Wireshark的解析器正确识别。如果你的抓包环境里没有解析出ECAT层可以先确认网卡是否进入了混杂模式以及是不是用了任务繁忙的电脑抓包导致丢帧。另外在TwinCAT环境下也可以直接用自带的EtherCAT诊断功能它能显示拓扑、状态和错误信息比抓包更直接。但涉及更底层的帧内容时Wireshark仍然是最可靠的参考。5. 常见问题与避坑实录我踩过的那些坑你直接绕过去5.1 从站无法进入OP这个问题出现频率最高而且表象往往是状态机停留在SAFE-OP请求OP超时。可能原因有几个一是ESI文件里面TPDO/RPDO映射和固件不一致二是SM同步管理器的缓存区设置不对三是应用层AL事件处理有问题。排查时先确认INIT到PRE-OP是否正常。如果从INIT到PRE-OP正常说明邮箱通道是通的。之后卡在SAFE-OP到OP就优先检查输出数据同步和PDO方向。主站计算PDO的SM通道、FMMU是从ESI文件里读到的如果ESI里分配错了它自然无法建立OP状态。实际排障时我一般第一步看从站错误寄存器地址0x0130和AL状态码0x0134。如果AL状态码能读到非零值主站一般也会显示这个错误码它直接告诉你问题在邮箱、PDO还是DC。很多初学者一上来就看寄存器地址但没有系统学过EtherCAT寄存器映射容易蒙圈。我的建议是先去读一下ESC寄存器规范至少搞清楚状态机部分的几个关键地址排障效率会高很多。5.2 邮箱通信超时SDO读写超时大多数情况是邮箱中断没有开启。EtherCAT从站的邮箱是由SM通道管理的当主站向从站邮箱写数据时ESC检测到数据到达会触发一个事件CPU必须去处理并把回复数据放回去。如果这个中断没配好或者CPU响应不及时主站等不到响应就超时。检查点主要有三个ESC的SM通道中断是否使能、RZN2L的NVIC中断优先级是否合理、邮箱发送函数是否有忙等逻辑。在实时系统中邮箱处理最好是中断或高优先级线程不要在低优先级循环里轮询否则调试时就会发现“时好时坏”。我遇到过一个比较隐蔽的问题RZN2L的CPU中断嵌套默认设置正常但我在初始化阶段调用了某些库函数禁用了全局中断一段时间正好主站在这个窗口发了SDO请求。结果主站超时而从站这边什么异常都没打印。后来在邮箱中断服务函数前面加了一个标志计数才定位到是中断没响应。因此调试邮箱功能时建议先打开邮箱事件计数器确认中断确实进来了。5.3 同步抖动大如果从站在OP状态但主站发现DC同步误差比较大或者示波器上SYNC0脉冲抖动明显那就要关注分布式时钟相关配置。EtherCAT的DC功能理论上让所有从站使用同一个系统时钟但前提是每个从站的ESC支持DC并且正确接收过程数据。RZN2L内部ESC支持DC需要把DC模式打开并在应用层及时响应SYNC中断。实际产生抖动的原因更多是CPU在SYNC中断进入后做了太多非实时任务把周期拉长了。建议把FPU运算、Flash操作、打印日志都移出中断。另一个常见问题是PHY时钟源。如果PHY使用的时钟和ESC不是同源或者晶振误差太大DC同步也会受影响。关于时钟树建议严格按照瑞萨官方参考设计来不要自己随便换个不太匹配的晶振或者电容这会影响时钟精度而EtherCAT对时钟失配很敏感。5.4 首次上电从站不能被识别这类问题比较坑因为和协议栈关系不大。刚才已经提到EEPROM里的SII数据问题。RZN2L的评估方案往往也有EEPROM如果EEPROM没烧录或者里边的数据不对主站扫描时就只能识别到一个Link却读不到完整从站信息。解决方法是先用瑞萨的烧录工具把正确的SII数据写进EEPROM再上电扫描。对于量产产品要把SII数据烧录作为产线流程的一部分防止有些板卡空片上电产线又忘了烧录。还要注意PHY速度配置。EtherCAT平时默认是百兆全双工如果PHY被配置成自协商模式可能在某些主站交换机环境下协商异常导致从站Link不上。建议把PHY配置成固定百兆全双工或者按照EtherCAT规范使用对应延时补偿机制。这一点在工业现场尤其重要不能马虎。如果现场环境电磁干扰比较强RJ45的变压器中心抽头、共模电感的布局都要按参考设计做否则Link状态会间歇性断开这种问题靠软件很难定位。写到最后分享一个我个人的操作习惯在EtherCAT从站开发初期我先不看复杂的功能先把主站和从站跑在OP模式让一两路PDO数据稳定收发然后再逐步增加对象字典、邮箱诊断功能。这样做的好处是一旦出问题排查范围非常小。另外建议每次功能改动前都保留一个能正常工作的工程副本因为EtherCAT调试里寄存器配置极多改回一个可靠状态的时间往往比重新配置更短。瑞萨RZN2L这颗芯片本身适合做工业以太网从站平台但开发流程里的每个环节都需要仔细验证。最后再提醒大家一句话EtherCAT调试不怕问题多就怕定位问题没有章法每次只改动一个变量保留可工作的工程备份比啥都重要。
返回列表