新闻详情

新闻详情

首页 / 资讯中心 / 详情

STM32移植SOES协议栈,轻松实现EtherCAT从站

发布时间:2026/9/29 21:34:23来源:尧图网络
STM32移植SOES协议栈,轻松实现EtherCAT从站
1. 项目概述与方案选型思路1.1 这个项目到底在解决什么问题先聊聊我为什么会对这个东西感兴趣。EtherCAT这个词在工业自动化圈子里已经不算新鲜了伺服驱动器、IO模块、阀岛、编码器几乎你能想到的现场设备现在都在往EtherCAT上靠。它的核心卖点就一句话用标准的以太网物理层跑出比传统现场总线高一个数量级的实时性。主站发送一帧数据所有从站在硬件层面同步处理回程帧经过每个从站时延迟只有纳秒级这个特性让它在多轴同步、高速采集这些场景里几乎没有对手。但问题在于从站这头的门槛一直不低。市面上成熟的方案有倍福官方的SSCSlave Stack Code有各大芯片厂商提供的商用协议栈但要么授权费用不低要么代码闭源想深度定制就非常难受。而SOES这个开源项目全称是Simple Open EtherCAT Slave正好填补了这个空缺——它是开源协议栈里少有的、真正能在资源受限MCU上跑起来的实现。我这次要做的就是把它从零移植到STM32平台上让一块普通的单片机也能作为EtherCAT从站接入工业总线系统。这个项目的适用人群很明确手里有STM32开发板懂基本的裸机或RTOS开发想入门工业以太网但没有太多预算买商用协议栈的朋友。整个过程走完你得到的不仅仅是一段能跑的代码更重要的是搞清楚了一台EtherCAT从站在协议层面到底做了什么、主站和从站之间是怎么握手的。1.2 为什么选SOES而不是其他方案先说说从站协议栈的几条常见路线方便你做判断。第一条路是用倍福的SSC工具。SSC可以生成针对特定ESCEtherCAT Slave Controller芯片的完整从站代码代码质量高、功能全面但生成出来的代码比较臃肿而且商用需要授权对个人学习和二次开发来说心理门槛和经济成本都不小。第二条路是直接用带内置ESC的专用芯片比如Beckhoff的ET1100/ET1200、Microchip的LAN9252这类芯片把EtherCAT从站控制器做成了硬件MCU只需要通过SPI或并行总线跟它通信。这条路在工业产品里用得最多稳定可靠但前提是你得额外买一片ESC芯片硬件设计复杂度也上去了。第三条路就是我这次选的SOES。它的定位非常清晰——不依赖专用ESC芯片纯软件实现EtherCAT从站的数据链路层处理理论上只要MCU有足够的Flash和RAM外接一颗标准以太网PHY就能跑起来。SOES在GitHub上开源license对商业使用相对友好代码结构也很干净核心文件就那么几个适合静下心去读源码、搞懂协议细节。对于学习目的来说SOES能让你看到协议栈内部每一行代码在干什么这是SSC和商用栈给不了你的体验。补充一点SOES也支持配合LAN9252这类外部ESC芯片使用因为它的设计里把ESC的硬件操作封装成了接口层。所以就算你以后做正式产品改用硬件ESCSOES里学的那些上层逻辑CoE、FoE、状态机依然能用上学习不白费。1.3 移植目标与整体思路我这次移植的目标平台选的是STM32F407ZET6自带100M以太网MAC外接一颗RMII接口的PHY芯片我手里有的是LAN8720A这也是市面上最常见、最便宜的百兆PHY之一。为什么不选带内部PHY的F4系列芯片因为F407不带内部PHY需要外接正好通过这个项目把MII/RMII接口、PHY初始化这些底层细节也一起捋一遍这对做嵌入式网络开发很有价值。整体思路分四条线走硬件线STM32的MAC控制器通过RMII接口连接LAN8720APHY通过中断引脚通知MCU有数据到达。协议线SOES协议栈接管EtherCAT从站的ALApplication Layer状态机、邮箱通信、过程数据通信对外表现为一个标准的EtherCAT从站。应用线定义一个简单的数字IO对象把过程数据里的几个位映射到开发板上的LED和按键验证双向数据通路。调试线用TwinCAT作为主站扫描从站、切换状态、读写对象字典验证移植是否成功。这个思路定下来之后后面所有工作都是围绕这四条线展开的。2. 移植前的准备SOES协议栈结构与工程构建2.1 SOES源码结构逐文件拆解SOES的源码不算复杂但文件之间的调用关系如果不理清楚移植起来会一头雾水。我先把它的核心文件过一遍esc.c / esc.h这是SOES的骨架实现了EtherCAT从站控制器的核心逻辑包括AL状态机处理、FMMU映射、SyncManager管理、邮箱协议分发。所有的寄存器操作和状态切换都在这里完成。esc_coe.c / esc_coe.h实现CoECANopen over EtherCAT协议包括对象字典的读取写入、SDO请求处理、PDO映射。如果你要用EtherCAT传过程数据这个文件是核心。esc_foe.c / esc_foe.hFoEFile over EtherCAT协议用于固件升级、参数文件上传下载。这次移植用不到太多但代码先留着不占地方。esc_eoe.c / esc_eoe.hEoEEthernet over EtherCAT协议把EtherCAT网络封装成虚拟以太网口可以用来跑TCP/IP协议栈。这个功能对资源有限的MCU来说负担较大我这次直接裁剪掉。esc_mbox.c邮箱通信的底层实现处理邮箱头部、缓冲区分配和校验。esc_hw.h硬件抽象层这是移植时改动最多的文件。SOES把你需要实现的底层接口全部声明在这里包括以太网收发、定时器、中断、EEPROM读写等。另外还有一个很关键的文件是port/目录下的示例代码里面已经提供了针对特定平台的移植参考。比如一些demo里能看到ethernet驱动的封装方式你可以照着它的接口风格来写自己平台的驱动层。2.2 工作区规划与代码来源在实际动手之前我先把整个工程的工作目录规划好这个习惯能让你后期维护省很多事。我建议每个项目都建一个根目录里面分几个子目录source/放SOES的核心协议栈代码比如esc.c、esc_coe.c这些这个区域尽量不改保持跟上游源码同步方便以后升级。port/放针对STM32平台的移植代码包括PHY驱动、MAC驱动、中断处理、定时器实现这些是需要你亲手写的。app/放应用层代码比如对象字典定义、任务主循环、IO映射逻辑。hardware/放STM32的HAL库相关配置比如gpio.c、eth.c以及连接外部器件的驱动。代码的获取方式直接去GitHub搜SOES就行克隆最新的release分支。这里提醒一句不要用master分支上最新的开发版本尽量用打了tag的稳定版因为SOES的API偶尔会有调整网上很多教程写的时候是基于某个固定版本你用太新的代码反而可能对不上API签名。2.3 裁剪编译把不要的功能先干掉SOES的一大优点就是模块化程度高通过宏定义就能裁剪功能。我这次的目标是跑通一个最小的数字IO从站所以很多功能我直接裁掉EoE不要它的虚拟网卡功能会拉高内存占用。FoE先留着后面做固件升级很方便。EEPROM仿真可以先用RAM模拟不必上真正的EEPROM芯片方便前期调试。实际产品再做硬件EEPROM也不迟。裁剪的工作主要体现在编译宏上。比如SOES源码里有很多地方会写上#ifdef ESC_EOE_SUPPORT、#ifdef ESC_FOE_SUPPORT这样的条件编译你只要在头文件里把对应的宏取消掉就行。这里我踩过一个坑光在编译器命令行里加了宏定义却忘了在程序里把对应的初始化函数注释掉导致链接时提示函数不存在——其实初始化函数本身也在条件编译里不一致就会出问题。所以裁剪时务必保证头文件宏、源文件实现、初始化调用三处同步改齐。2.4 内存布局规划别让协议栈吃光你的RAMSTM32F407ZET6有192KB RAM看起来很大但EtherCAT从站协议栈对内存的需求比想象中要高。尤其SOES内部会分配一堆缓冲区发送缓冲、接收缓冲、邮箱缓冲、PDO映射表还有每个从站的FMMU和SM寄存器对应过来的数据结构。得提前算一下内存够不够用。我建议的做法是先把编译出来的map文件看一下确认以下关键数据的内存占用情况协议栈的全局变量区和缓冲池。以太网DMA描述符和DMA接收缓冲区这个往往占大头F407的ETH DMA至少需要为每个描述符分配单独的缓冲区一般一个缓冲区就能占掉几百字节到1KB。应用层对象字典缓存。如果内存不够优先缩小DMA接收缓冲区的数量比如从5个描述符降到3个或者把对象字典里字符串类型的条目改成精简形式。如果还不够再考虑裁剪功能宏。3. 硬件设计与底层驱动打通MAC到PHY的数据通路3.1 STM32F407的MAC/PHY接口配置EtherCAT虽然是个实时工业总线但物理层说到底还是百兆以太网。STM32F407内部集成了完整的以太网MAC控制器支持MII和RMII两种接口模式。我选RMII因为它只需要7根线CLK、TX_EN、TXD0、TXD1、RXD0、RXD1、CRS_DV布线简单F407的IO占用也少。RMII的工作时钟是50MHz可以由外部有源晶振提供也可以由PHY的反相时钟输出提供。LAN8720A这个PHY很便宜而且有内置的50MHz时钟输出功能可以直接给STM32提供RMII参考时钟省一颗外部有源晶振。但这里有个细节LAN8720A的50MHz时钟输出要求PHY本身工作在从模式即由XTAL1/CLKIN引脚输入25MHz的外部无源晶振然后内部倍频到50MHz再输出。如果你像我一样图省事想直接用LAN8720A的50MHz时钟输出给MCU那要留意板子上的晶振是不是25MHz。很多便宜的LAN8720A模块上默认焊的是25MHz无源晶振而不是50MHz有源晶振这两者不能混用。根据我的经验电路设计时有几个关键点要特别注意PHY的nINT引脚要连接到STM32的一个外部中断引脚用于接收PHY的中断比如链路状态变化、接收数据就绪。我用的是PA0配置为下降沿触发。PHY的地址要正确LAN8720A的默认PHY地址是0由PHYAD0引脚的上下拉决定。STM32的ETH外设初始化和后续的MDIO读写在PHY地址上必须一致。RMII参考时钟必须稳定如果是用PHY提供的时钟要确认PHY驱动配置里把时钟源选择搞对。3.2 PHY寄存器配置与MDIO通信STM32操作PHY是通过MDIO总线读PHY的寄存器。LAN8720A有几个寄存器非常重要寄存器0BMCR控制复位、自协商、百兆/十兆切换。寄存器1BMSR读取链接状态、自协商能力。寄存器31PHY Special Control/StatusLAN8720A特有的寄存器配置LED模式、时钟输出使能等。在STM32的HAL库里主要调HAL_ETH_Init初始化MAC层然后通过HAL_ETH_ReadPHYRegister和HAL_ETH_WritePHYRegister来读写PHY寄存器。初始化流程是这样的先把PHY的复位引脚拉低再拉高至少20ms以上让PHY完成上电复位。配置STM32 ETH外设的参数包括自动协商使能、MAC地址、DMA描述符地址等。写PHY寄存器0启动自动协商。轮询PHY寄存器1等待链接建立。读取PHY寄存器1确认是全双工100Mbps。根据链路速度配置STM32 MAC的时钟和双工模式。这里有个常见问题如果PHY的链接没建立EtherCAT主站再怎么扫描也扫不到你因为从站的以太网链路都没通。所以调试时先把第一步做到位——用网线把开发板和一个普通路由器连接看看能否通过PHY的寄存器确认链接状态为“已连接”。3.3 以太网DMA与描述符的坑STM32F407的ETH外设DMA和普通的外设DMA不同它有自己的描述符链表机制。你必须为发送和接收分别建立一个描述符数组并把它们初始化成正确的环形链表结构HAL库才能正常工作。这块代码虽然HAL库已经帮你封装好了但有几个地方容易出错描述符和对应缓冲区要32字节对齐否则ETH DMA传输会出错。接收缓冲区数组大小不要设太小否则一个大的以太网帧可能被截断。我设的是1524字节。HAL库初始化ETH外设时一定要先配置好DMA描述符的地址再调用HAL_ETH_Start否则DMA会立刻从非法地址取数据导致总线错误。我在调试时遇到过一件特别坑的事程序在HAL_ETH_Start之后就进入了HardFault排查了半天才发现是接收缓冲区数组只定义了8个字节而不是一个完整以太网帧的长度DMA写越界直接踩了系统堆栈。所以缓冲区长度这种事别省直接给到最大帧长度稳。3.4 中断设计收到帧第一时间通知协议栈EtherCAT是实时性要求很高的协议从站收到主站帧之后必须在极短的时间内完成解析和响应。所以接收路径不能靠轮询必须走中断。我在代码里做了这样几件事配置PHY中断引脚PA0为外部中断下降沿触发。PHY的中断事件在LAN8720A里可以通过寄存器31的bit15和bit14配置为“链路状态变化”和“接收数据就绪”等事件。在中断服务函数里调用HAL库的接收函数HAL_ETH_GetReceivedFrame取出一帧数据立即传递给SOES的ESC_Process处理。这里有个性能细节中断服务函数里不能做太多事情最好只做“收帧入队 置标志位”的工作真正的协议处理放到主循环里做。因为EtherCAT帧的处理涉及对象字典访问和状态机切换如果全塞在中断上下文里一旦逻辑复杂中断占用时间过长会直接影响实时性。我的做法是中断里拷贝帧数据到协议栈的接收缓冲然后置一个frame_received标志位主循环发现标志位置位后再调用ESC_Process。4. SOES移植实操让协议栈跑在单片机上4.1 硬件抽象层接口对照表SOES的硬件抽象层接口都定义在esc_hw.h里移植的核心工作就是逐个实现这些函数。我用一个表格把我实际用到的接口和对应的实现方式列出来方便你对照自己平台的实现SOES接口函数你需要在STM32上做什么关键注意事项esc_eth_init初始化MAC、PHY、DMA描述符并使能接收中断在启动EtherCAT前完成PHY链接建立后再返回esc_eth_recv从DMA接收缓冲区取出一帧数据拷贝到协议栈缓冲区每次调用只处理一帧返回帧长度没有新帧返回0esc_eth_send将协议栈给出的发送缓冲区数据通过DMA发出去发送完成前不能让数据buffer被覆盖要等DMA传输完毕esc_stm32_timer_init初始化一个硬件定时器提供微秒级的时基用TIM2~TIM5都可以配置为1us一个计数周期esc_stm32_timer_irq定时器中断里调用ESC_Process主循环里也要定期调用ESC_Process优先级要设计好esc_eeprom_read/esc_eeprom_write读取/写入EEPROM数据我用的RAM模拟正式产品要换硬件EEPROM或Flash模拟4.2 收到帧的处理路径从DMA到ESC_ProcessEtherCAT从站的帧处理路径是这样的PHY收到物理信号MAC和DMA把数据写到内存的接收缓冲区然后触发接收DMA中断或PHY中断我们在中断里把数据搬运到SOES的接收缓冲区调用ESC_Process把帧交给协议栈处理协议栈解析完EtherCAT头、寄存器寻址、FMMU映射之后如果需要回程帧就调用esc_eth_send把数据通过MAC发出去。这里有一个非常重要的概念EtherCAT的回程帧不是重新构造一帧新数据而是直接在原帧上修改从站把自己的数据填充到帧中对应位置再转发给下一级从站。这就是为什么EtherCAT能在一个帧周期里串联多个从站而延迟极低——因为每个从站都是在硬件层面直接操作收到的帧缓冲区。在SOES里ESC_Process做的就是这个事它拿到网络层传入的帧缓冲区逐个解析帧头中的从站地址判断是否跟自己相关然后更新对应寄存器的值并在帧中填入响应数据。最后返回的值指明了是否有数据要发送回主站。这个函数是协议栈的核心移植时不要试图去修改它的逻辑只需保证它能在收到帧后及时被调用。4.3 定时器与主循环的配合不能只靠中断EtherCAT协议栈除了处理主站的帧还得处理一些周期性任务。比如AL状态机的看门狗、CoE的超时重传、SyncManager的看门狗。这些任务不依赖外部脉冲必须靠协议栈自己定时触发。SOES的做法是通过一个定时器中断周期性调用ESC_Process让它处理超时事件。我的设计是TIM2配置为1ms中断中断里调用ESC_Process主循环里设置一个while(1)死循环周期性检查是否有新的以太网帧到达如果有也调用一次ESC_Process。简单说就是1ms定时器保证协议栈的心跳以太网帧中断保证数据面处理的及时性。这个方案执行起来效果不错。实际测试中我在主循环里加了一个翻转LED的调试代码可以明显看到当EtherCAT主站周期发送过程数据时LED闪烁频率会跟主站的周期同步如果停掉主站闪烁就停下来说明协议栈确实是在实时响应每一个帧。4.4 把AL状态机跑起来从INIT到OP的完整流程EtherCAT从站启动时AL状态机必须经历INIT → PRE-OPERATIONAL → SAFE-OPERATIONAL → OPERATIONAL这几个阶段主站通过写AL Control寄存器来指挥状态切换从站完成相应准备后在AL Status寄存器里反馈当前状态。SOES已经实现了这套状态机的处理逻辑你要做的事情就是确保在状态切换的每个节点应用层做出正确的配合INIT → PRE-OP这个阶段要完成邮箱通信的初始化包括CoE对象字典的读取准备。如果EEPROM初始化失败或邮箱参数不对从站可以拒绝切换。PRE-OP → SAFE-OP检查过程数据映射是否合法如果PDO映射配置错误从站拒绝切换。SAFE-OP → OP同步管理器要开始接收过程数据。我在移植时遇到过一个典型问题从站一直卡在INIT状态主站无法将它切到PRE-OP。排查后发现问题出在我把EEPROM初始化函数在启动时调用了但EEPROM模拟的缓冲区没有正确初始化导致从站读回了一个错误的状态标志。解决办法是先用RAM模拟EEPROM并且在初始化时填充默认数据把问题绕过去。5. 应用层开发用LED和按键验证从站功能5.1 对象字典的设计与PDO映射要让TwinCAT能够看到你定义的某个变量比如LED控制位必须把这个变量通过对象字典暴露出来再映射到PDO里。SOES里定义对象字典的方法是在object_dict.c文件里写一个对象的数组每个对象的格式包含索引、子索引、访问类型、数据类型等。我这边的对象字典这样设计索引0x1600接收PDO映射包含两个子对象分别映射到两个控制字用来控制LED1和LED2的开关。索引0x1A00发送PDO映射包含两个子对象映射两个状态字用来回传按键1和按键2的状态。索引0x6000接收PDO的实际数据区FMMU会把过程数据帧里的4个字节映射到这个区域。索引0x6010发送PDO的实际数据区存放按键状态。对象字典的编写要严格遵循CANopen和CoE的规范特别是访问类型读写/只读和数据类型U8/U16/U32等写错一个都可能导致TwinCAT读取失败。5.2 应用代码的任务一边读按钮一边把状态放进发送PDO光有对象字典还不够你还得有一个应用层循环把物理IO状态和对象字典的数据区关联起来。我的主循环大概是这样检查帧接收标志有帧就调用ESC_Process。每20ms读一次按键把按键状态写入0x6010对象里对应的变量。每20ms读一次0x6000对象里对应的变量然后控制LED引脚的翻转。这个任务设计得足够简单但已经能完整验证整个数据链路主站发过来的控制字经过EtherCAT帧 → FMMU映射 → 对象字典 → 应用代码最终控制GPIO反过来GPIO上的按键状态经过应用代码 → 对象字典 → PDO映射 → 回程帧最终被主站看到。5.3 用TwinCAT做第一次联调在主站这边我用的是倍福的TwinCAT 3它自带EtherCAT主站功能配置简单调试友好。步骤大概是打开TwinCAT的“EtherCAT”选项卡点击扫描设备。扫描后软件可能会弹窗询问是否要添加设备选择“确定”。TwinCAT会识别到一个未知的从站设备因为它还识别不了你的设备名。这时需要在设备列表里手动添加一个“EtherCAT从站”的通用设备类型。把从站状态切换到OP看状态是否成功。实际操作中我最常见的情况是从站能扫描到但状态切到SAFE-OP就上不去了。遇到这个情况优先去查PDO映射表确认0x1600和0x1A00的映射长度是否匹配过程数据帧里实际预留的字节数再查FMMU是否配置正确。TwinCAT的在线视图会提示错误码根据错误码查SOES源码里的状态返回码多半能找到原因。6. 常见问题与排查技巧实录6.1 问题速查表我在整个移植过程中踩了不少坑这里整理一个速查表希望对你有帮助。现象可能原因解决方案主站扫描不到从站PHY链路未建立检查网线读PHY寄存器1确认Link Status确认RMII时钟是否正常主站能扫描到但从站状态卡在INITEEPROM初始化失败或状态返回码错误暂时用RAM模拟EEPROM或者在INIT状态下打印AL Status码从站卡在PRE-OP无法进入SAFE-OPFMMU或SyncManager配置错误检查PDO映射长度与SM配置是否一致查看TwinCAT在线错误日志能进OP但过程数据全为0FMMU映射地址或对象索引错误检查0x1600/0x1A00的映射子项确认子对象索引对应正确程序启动后HardFaultDMA描述符或缓冲区未对齐确认描述符数组和缓冲数组都做32字节对齐从站能跑但响应慢主循环里没有及时调用ESC_Process保证帧中断到来时立即调用最少也要在1ms定时器里处理数据校验错误频繁RMII时钟抖动或地线问题检查PHY的时钟源考虑用高质量晶振或检查PCB布线6.2 一个实战排查案例为什么我的从站一进OP就掉线我调试时遇到最头疼的问题之一是主站TwinCAT能扫描到从站状态也能切到SAFE-OP但一进OP模式立刻报“从站掉线”错误。折腾了很久最后定位到是DMA缓冲区接收中断和主循环竞争访问的问题。具体过程是这样我的PHY中断优先级比较高以太网帧到达时中断里把帧拷贝到缓冲区并置标志位主循环里处理完帧后清标志位。但因为主循环和中断之间没有做临界区保护偶尔会出现主循环还在处理上一帧时新帧又到了覆盖了缓冲区导致数据不一致进而触发主站看门狗超时。解决方式很朴素在拷贝帧、置标志位、清标志位这三处加上临界区保护最简单的做法是临时关中断保证同一时间只有一处能访问共享缓冲区。加完之后再也没出现过进OP就掉线的情况。这个案例说明工业总线的移植不光是纯软件的逻辑问题还可能藏着底层并发访问的坑。6.3 调试工具与技巧调试EtherCAT从站有几个工具我强烈建议备好逻辑分析仪或者带协议解析的示波器看PHY芯片的RMII接口信号判断是不是PHY压根没工作。不过这只能帮你确认物理层有没有波形看不了EtherCAT的协议内容。带EtherCAT抓包功能的主站软件TwinCAT自带抓包功能可以把主站和从站交互的报文全部抓下来对照协议栈源码分析是哪个环节出错。这个功能在调试早期非常有用。串口打印简单粗暴在协议栈关键节点加打印信息。但注意如果打印信息太频繁会影响实时性调试时可以把打印开关做成宏定位问题后关掉即可。7. 实操心得与后续扩展建议7.1 过程中积累的几点经验把SOES移植到STM32F407这个全过程走完我最大的感受是EtherCAT从站协议栈并没有想象的那么神秘它的核心就是一个精心设计的有限状态机加上一套高效的数据映射机制。你只要把握住“帧来了要赶紧处理、状态切换要按规范响应、对象字典要提前设计好”这三件事基本就能让从站跑起来。另外有一点很重要不要一上来就追求把所有功能做全。先用最小系统跑通再逐步加功能。我最初的目标仅仅是能扫描到、能进OP、LED能亮达成之后再考虑FoE、DO、DC同步这些高级功能。一步一步来很多问题其实很好定位。7.2 后续还能做哪些扩展这个项目做完其实还有不少扩展方向增加DCDistributed Clock同步功能让从站支持精确的时间同步。这对伺服驱动等运动控制场景非常关键。增加FoE固件升级功能这样就可以通过网络远程升级从站程序省去现场烧录的麻烦。换一个更强的MCU比如STM32H7系列直接把EoE和轻量TCP/IP协议栈跑起来做成一个既能走实时过程数据又能处理非实时配置信息的混合型从站。如果打算做产品考虑移植到带内部ESC功能的专用芯片如LAN9252 MCU方案把SOES的上层逻辑继续沿用只替换下面几层。7.3 最后再分享一个实用小技巧如果你在调试过程中发现TwinCAT扫描不到从站一个非常有效的检查组法是先把PHY寄存器的状态全部dump出来发到串口打印。我这边打印过LAN8720A的寄存器0、1、31的内容能一目了然地看到链接状态、协商结果、中断事件标志。很多扫描不上的问题其实都是PHY物理层没起来跟协议栈没关系。把PHY调好再往上看问题效率会高很多。按照这个思路从零开始把SOES移植到STM32整个过程其实蛮顺畅的。如果你也在玩EtherCAT从站开发欢迎按这个路线试一试有问题多读源码、多抓包慢慢就能体会到这套协议的精妙之处。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

企业设备巡检体系怎么建立 2026/9/29 22:15:15

企业设备巡检体系怎么建立

一家工厂已有巡检表,也有人每天检查,为什么还需要改善巡检体系? 原因可能在不同地方:检查项没有覆盖常见故障,员工不知道怎样判断异常,发现问题后迟迟没有维修,或者同一个问题修了几次仍在发生…

阅读更多 →
Wald检验与p值深度解析:从原理到实战,告别显著性误读 2026/9/29 22:15:08

Wald检验与p值深度解析:从原理到实战,告别显著性误读

最近帮一个课题组看数据,他们跑完逻辑回归后盯着结果表问我:“这列z值和Pr(>|z|)到底什么意思?为什么有的自变量旁边有星号,有的没有?”我一听就明白了,这其实是在问统计分析里最常用、却又经常被误解的…

阅读更多 →
在 ng-zorro-antd 中实现可编辑单元格表格:基于 OnPush 的 immutable 数据编辑实战指南 2026/9/29 22:14:47

在 ng-zorro-antd 中实现可编辑单元格表格:基于 OnPush 的 immutable 数据编辑实战指南

UI组件前端 【免费下载链接】ng-zorro-antd Angular UI Component Library based on Ant Design 项目地址: https://gitcode.com/gh_mirrors/ng/ng-zorro-antd 点击查看 免费下载 导读 表格编辑是后台管理系统中最高频的交互场景之一。NG-ZORRO(ng-zor…

阅读更多 →
eFuse:TPS25982系列电子保险丝的相关设计 2026/9/29 22:14:47

eFuse:TPS25982系列电子保险丝的相关设计

创作背景:在设计板子中,总是有一些意外情况导致PCB短路(内部设计或是外部不小心短接),此时便想起给整个板子做一个保险。对于保险设计有很多方法:保险丝,电子保险丝等等。对于传统保险设计有一些…

阅读更多 →
光伏硅片传感器选型参考:明治ESB-BY30适配场景与现场调试要点 2026/9/29 22:14:47

光伏硅片传感器选型参考:明治ESB-BY30适配场景与现场调试要点

一句话结论:硅片检测选型的关键不在"标称检测距离越长越好",而在光源波长与硅片光谱特性是否匹配、是否具备反射率波动免疫能力;ESB-BY30在这两个维度上给出了明确的工程方案。 一、选型时应关注的五个维度 光源波长:…

阅读更多 →
六、PB-GATT入网流程 2026/9/29 22:14:47

六、PB-GATT入网流程

BLE Mesh理论资料 六、 PB-GATT入网流程 1、 入网流程 2、 Mesh Provisioning Service 3、 Mesh Proxy Service 4、 Proxy PDU 5、 Provisioning PDU 6、 发送Beacon信号

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉