伺服主控外挂嵌入式小板实现EtherNet/IP从站的SPI通讯设计

发布时间:2026/9/8 11:50:39
伺服主控外挂嵌入式小板实现EtherNet/IP从站的SPI通讯设计 前阵子做了一款伺服驱动器的通讯扩展客户点名要EtherNet/IP。主控还是一颗服役多年的DSP电流环、速度环、编码器解码全压在它身上CPU占用率早就过半了。评估了一下主控直接挂以太网跑协议栈的方案光看那份中断延迟预算就被劝退了。后来定下来的方案就是标题里那套伺服主控外挂一块嵌入式小板小板这边跑完整的EtherNet/IP从站协议栈主控和小板之间用SPI通讯把周期性的IO数据和诊断信息直接搬进搬出。整个过程涉及固件Demo程序的适配、SPI链路的设计、以及没完没了的联调踩坑今天把关键节点都摊开讲清楚后面真有人接类似项目至少能少走点弯路。1. 为什么伺服主控要外挂一块嵌入式小板来跑EtherNet/IP1.1 伺服主控的真实负载电流环已经把CPU占了近一半很多初接触伺服产品的人会有一个错觉认为主控芯片性能足够了跑个协议栈就是加个库的事。真不是这样。伺服主控的实时任务非常密集电流环通常跑在10kHz到20kHz每个中断周期要做采样、Clarke变换、Park变换、PI调节、SVPWM输出速度环和位置环跑在1kHz到8kHz要处理速度计算、位置规划、前馈补偿再加上编码器协议解析、故障保护、上位机指令解析、内部监控参数刷新这些任务加起来主控的CPU占用率做到50%到60%是很常见的。在这个基础上再塞一个EtherNet/IP协议栈问题就来了。EtherNet/IP的IO连接要靠以太网接收中断驱动每次中断进来要解析以太网帧头、IP头、UDP头然后查CIP连接表、更新Assembly对象最坏情况下一个中断处理要几十微秒到几百微秒。如果现场网络环境不好广播报文多、有人乱PING中断频率和耗时还会进一步放大。对电流环来说一次几百微秒的突发延迟就可能导致控制周期跑飞机械上表现为咔哒一声异响这在伺服产品里是不允许的。所以把协议栈隔离出去让主控只面对一个行为可控的小板是最务实的选择。主控不需要知道CIP对象长什么样只需要按固定周期从SPI接口拿控制字和目标值、把状态字和实际值写回去实时任务的负载就是确定性的。1.2 外挂小板架构主控、小板、扫描器三方如何协作这套架构里角色分得很清楚。最外面是PLC扫描器或者叫Originator它发起连接、周期发送IO报文。中间是嵌入式小板小板上跑完整的CIP协议栈对外是以太网从站对内是SPI从机设备负责把EtherNet/IP报文里的过程数据翻译成SPI帧。最里面是伺服主控它作为SPI主机周期性地读写小板拿到控制字、目标速度、目标位置同时把状态字、实际速度、实际位置返回给小板。从数据流上看一次正常的IO周期是这样走的PLC按RPI周期发送IO报文小板收到后更新下行数据区主控在下一个SPI调度点把下行数据读走落实成伺服的位置指令或速度指令同时主控把当前实际位置和状态字通过SPI发给小板小板把它放进Assembly输入在下一拍IO报文里返回给PLC。整个过程主控对以太网协议一无所知它只看到一块SPI寄存器映射的设备。这个架构对产品线的长期意义更大。这次做的是EtherNet/IP下次客户要PROFINET或者EtherCAT只需要更换小板的协议栈固件主控侧的运动控制代码几乎不用动。我们在产品规划上直接把它当成了标准做法。1.3 三种方案对比主控直连、商用协议转换模块、自研小板外挂方案并不是唯一选择当时我们内部也对比过另外两条路。方案成本主控实时性影响开发周期定制灵活性认证风险主控直连以太网最低只需加PHY大中断不可控中等协议栈自己啃高需自行过一致性测试商用协议转换模块较高按量付费极小SPI/并口对接短SDK成熟低封装闭源模块厂商已认证自研嵌入式小板中等物料成本可控极小SPI实时交互长协议栈开发联调高完全可控需投入测试资源商用模块的质量确实稳定但问题也很现实单台成本高、封装闭源、订货周期长而且当客户提出一些定制诊断功能时模块厂商的响应速度往往跟不上项目节奏。自研小板虽然前期投入大但协议栈源码握在自己手里Assembly映射、诊断对象、IP配置策略都能按产品需求来后续复制到其它协议也方便。我们这个产品线最终选的就是自研方案。2. EtherNet/IP协议栈的选型从Demo程序到可落地固件2.1 有别于普通以太网EtherNet/IP的核心是CIP对象模型很多人一听EtherNet/IP以为就是在以太网上跑的Modbus这个误解得先纠正。EtherNet/IP基于CIP协议核心是对象模型每个设备由一组CIP对象组成每个对象有类、实例、属性、服务上层通过Get_Attribute_Single这类服务去读写属性值。IO连接用的是UDP 2222端口周期性交换隐式报文显式报文走TCP和UDP 44818端口用来做参数读写、诊断等非周期性通信。这个对象模型直接影响SPI链路的设计。周期性IO数据对应的是Assembly对象PLC和设备之间交换的就是Assembly里的内容。也就是说我们只需要把SPI帧的数据区设计成和Assembly的数据布局一一对应就不需要在应用层做复杂的协议解析主控读到的SPI帧内容基本就是PLC发过来的原样数据。2.2 协议栈的三条来源路线原厂Demo、商业协议栈、开源参考实现明确了要外挂小板之后第二个问题是协议栈从哪来。大致有三条路线。第一是芯片原厂或第三方提供的参考SDK。很多MCU厂家的评估板上都带EtherNet/IP从站参考程序这类Demo程序功能完整度通常够用CIP对象、以太网驱动、连接管理都有但业务逻辑基本没有需要自己往里填。第二是商业协议栈质量和一致性测试有保障但需要购买授权部分实现是闭源或者有配置工具锁定想定制诊断对象会比较别扭。第三是开源参考实现适合研究协议内部机制但性能、稳定性、一致性测试都得自己补。我们最终是原厂Demo为主干开源实现做参考把缺失的对象实例和业务逻辑自己写。这样做的好处是起步快坏处是要花时间把Demo程序的每个模块吃透。这里给个经验拿到Demo之后第一件事不是急着编译下板而是确认协议栈版本、支持的CIP对象表、有没有做过ODVA一致性测试。如果原厂已经通过了测试你改动越少后面认证风险越小。2.3 Demo程序里最值得先看懂的几组对象把Demo程序跑通后我建议先对照源代码把这几组对象的位置找出来适配改造时你会反复和它们打交道。Identity对象类ID 0x01设备标识包括厂商ID、设备类型、序列号。产测时PLC能不能正确识别设备就看这个对象的数据填得对不对。Message Router对象类ID 0x02负责把请求分发给其它对象一般不需要大改。Assembly对象类ID 0x04这是周期IO数据的核心输入Assembly和输出Assembly的数据布局就是SPI帧的数据布局。Demo里默认可能只有8进8出我们要改成实际工艺需要的长度。Connection Manager对象类ID 0x06管理连接建立与拆除决定设备能同时支持几个IO连接。TCP/IP Interface对象和Ethernet Link对象负责IP地址、MAC地址等网络参数的配置伺服产品里一般要处理静态IP和拨码设置。改造时最容易犯的错误是只盯着Assembly数据区忽略了Identity对象里的序列号和设备名。现场如果PLC侧配置了设备名称匹配的扫描规则序列号读出来不对连接直接建不上。2.4 改造前必须确认的通讯参数开始写代码之前有一些参数必须先和客户、和运动控制团队对齐否则后面返工成本很高。参数建议值/做法说明RPI伺服轴控通常4ms或8ms扫描器请求的报文周期对应SPI的调度周期连接超时一般为RPI的4倍超时后触发连接关闭太短容易误报IP配置静态IP或拨码产品默认静态IP支持上位机修改Assembly大小输入输出各32~64字节取决于控制字、模式字、目标值、实际值的数量掉线重连开启快速连接模式现场要求断线后1秒内恢复RPI是这里面最核心的。客户说我要2ms周期你得先算SPI能不能扛住、主控的调度能不能跟上。实际上对于伺服运动控制4ms RPI已经能覆盖绝大多数点位运动和速度控制需求真要到2ms对小板协议栈的处理能力要求会明显上升。3. SPI通讯链路设计伺服主控和嵌入式小板之间的数据通道3.1 为什么是SPI而不是IIC、UART或并口主控和小板之间的数据通道候选方案其实就几个简单对比一下就知道SPI为什么最合适。方式双工典型速率帧同步IO占用可靠性SPI全双工10~40Mbit/s硬件片选天然定界4线同步时钟抗干扰好IIC半双工400k~1Mbit/s地址起始停止位2线速率低被中断影响大UART全双工最高数Mbit/s帧头约定2线异步双方时钟需一致并口全双工很高读写信号很多引脚占用太多IIC半双工速率也上不去传64字节一帧的数据要占掉RPI周期里很大一块时间UART没有硬件片选帧同步完全靠帧头约定在强干扰环境下容易错帧并口虽然快但小板引脚有限走并口还要花一大堆IO去管理读写时序。SPI是全双工、同步、有硬件片选主控和小板又是1对1固定连接没有任何总线上挂多个设备的麻烦所以它是这个场景下最平衡的选择。3.2 硬件片选与软件片选的选择直接影响联调问题片选用硬件还是软件是SPI从站设计里一个看似不起眼、实际影响很大的决策。硬件片选由SPI外设自动控制CS边沿精准程序员不用操心代价是引脚被绑定片选释放时机也固定在硬件逻辑里。软件片选用GPIO手动控制灵活度高能自定义片选电平和释放时序但GPIO操作受中断影响调度繁忙时可能出现片选毛刺。我们这个项目选的是软件片选。原因是主控引脚紧张而且我们希望CS的高电平时间能自己控制。但从站固件侧非常依赖CS边沿来定界一帧的开始和结束CS下降沿表示主机开始传输CS上升沿表示一帧结束。如果主机CS释放得不够干净从机的帧状态机就会出问题。这个隐患在后面联调阶段真的炸了第5章会详细说。我的建议是如果主控引脚允许优先用硬件片选省心如果必须软件片选一定要在驱动里对CS的释放时间做保护比如释放后至少保持2个字节时钟周期的高电平再允许下一帧启动。3.3 帧格式与寄存器映射设计SPI帧格式设计得好不好直接决定后续适配层好不好写。我们的思路是固定帧长、固定字段、带序列号和CRC。下行帧主控到小板设计成64字节布局大致是2字节帧头0xAA55、1字节帧类型、1字节序列号、2字节控制字、4字节目标速度、4字节目标位置、2字节模式字后面预留数据区最后2字节CRC16。上行帧小板到主控同样64字节包含2字节帧头、1字节帧类型、1字节序列号、2字节状态字、4字节实际速度、4字节实际位置、4字节报警码预留数据区加CRC16。固定帧长最大的好处是收、发两端的缓冲区管理简单主控每次调度点固定收发128字节不用解析变长帧。序列号用来检测丢帧CRC用来丢弃坏帧。为了链路诊断我们在上行帧里还带了一个心跳计数主控每读一帧心跳加一联调时只要看心跳是否连续增长就能判断SPI链路是否正常。寄存器映射方面有两种常见做法。一种是类Modbus的寄存器地址方式通过地址加数据来读写另一种是直接结构体映射。我们在适配层用了结构体映射但特别注意了编译器的结构体对齐问题使用了packed属性防止字段错位这个细节在3.5节展开。3.4 速率与数据量估算算一笔账你就心里有底了。SPI跑10MHz也就是每秒1.25MB。一帧SPI通信包含下行64字节加上行64字节共128字节传输耗时约102微秒。如果RPI是4ms这一帧占用的链路时间只有2.5%左右非常宽裕。就算帧长翻倍到256字节也在一个RPI周期内轻松完成。所以SPI速率在伺服这个场景下根本不是瓶颈真正要关注的是主控能不能稳定地在每个RPI周期内调度一次SPI收发。如果主控的任务调度有抖动IO数据晚了一拍PLC侧体现出来的就是通讯抖动偏大。我们在主控里把SPI读写放在了固定周期任务里和位置环同频执行避免单独拉一条线程造成时序漂移。经验上SPI时钟不要压到从机能支持的上限。留出20%的时序裕量对波形质量和抗干扰都有好处。3.5 字节序与数据对齐这节看着小踩坑的人不少。EtherNet/IP报文本体使用小端字节序但你的主控和小板未必都是小端。以我们用的DSP为例虽然也是小端架构但有些老的DSP型号是大端或者编译器默认行为不一样一旦大小端不一致4字节的目标位置读出来就是反的。解决办法是在SPI适配层做统一转换用宏定义封装字节序转换函数不要散落在业务代码里到处改。另一个坑是结构体对齐。如果把SPI缓冲区直接定义成一个结构体指针编译器默认会做对齐填充字段就会错位。设计帧格式时要么用packed属性要么干脆用字节数组加偏移量访问后者更保险毕竟SPI帧本质就是字节流。4. 固件Demo程序适配改造的具体过程4.1 环境准备编译、烧录和最小验证链路改造第一步不是写代码是把环境搭干净。我们的小板用的MCU支持SWD调试开发阶段我习惯用IDE直接烧录和单步调试。但量产阶段不能用IDE逐台烧所以后来单独写了基于串口bootloader的量产烧录脚本这个放到第6章讲。环境搭好之后第一次上电先不要改任何代码直接烧录原厂Demo用PC端扫描器工具验证功能。能枚举到设备、能读到Identity对象属性说明编译链、烧录链路、以太网PHY、协议栈基础功能都是好的。这一步如果没跑通后面改了一堆代码再排查根本分不清是环境问题还是逻辑问题。4.2 SPI从机驱动改造模式、DMA与乒乓缓冲小板上的SPI从机驱动是这次改造的重点。从机侧主要做三件事配置SPI外设模式、设计中断与DMA配合、处理缓冲管理。SPI模式要和主控保持一致。我们主控配置的是Mode0即CPOL0、CPHA0小板从机也要配成Mode0同时统一MSB first。速率由主机决定从机这边只要保证在主机最大时钟下能稳定接收就行。接收路径我用的是DMA为主、中断为辅的方式。CS引脚配置双边沿中断下降沿通知DMA开始接收一帧数据DMA把数据从SPI数据寄存器搬到乒乓缓冲区接收完固定帧长后触发DMA完成中断。这里有一个关键细节CS上升沿到来时DMA可能还在搬运末尾几个字节所以不能立刻处理缓冲区要等DMA完成中断确认整帧接收完整。缓冲管理用乒乓结构两个缓冲区轮流使用。一个缓冲区正在给DMA搬运另一个缓冲区供协议栈上层处理处理完再交换角色。如果没有乒乓缓冲上层处理数据期间新数据到了要么被覆盖要么被丢弃就会产生偶发错帧。4.3 CIP对象到SPI数据帧的适配层设计Demo程序里CIP协议栈的接口通常已经很清晰周期IO连接的数据就放在Assembly对象的数据区我们只需要写一层适配代码把Assembly和SPI帧连接起来。适配层我定义了一个共享数据结构里面包含下行控制数据和上行状态数据。SPI从机每收到一帧下行帧通过DMA完成中断触发解析把控制字、目标位置这些字段更新到共享结构体。CIP协议栈的周期回调里把共享结构体里的内容拷贝到输出Assembly同时把输入Assembly的数据拷贝回共享结构体供下一个SPI上行帧发送。// 适配层核心示意 void ciper_ip_to_spi(const uint8_t *cyc_data) { memcpy(shared.down, cyc_data, sizeof(shared.down)); } void spi_frame_to_cip(void) { memcpy(shared.up, spi_rx_buf[OUT_BUF_IDX], sizeof(shared.up)); }并发保护是适配层最容易埋雷的地方。小板上跑着FreeRTOSCIP协议栈任务和SPI DMA中断会同时访问共享数据。我的处理方式是在CIP任务里读取共享数据时用关中断临界区保护SPI中断侧只负责写标志位不直接做耗时处理把数据解析放到任务上下文完成。4.4 初始化顺序里容易被忽略的坑这个坑我们真踩过。最初版的小板固件上电后先把SPI从机使能再初始化以太网结果主控在以太网链路还没起来之前就开始周期读写了。从机虽然在接收帧但其实上层CIP协议栈还没准备好数据帧来了没人消费状态机一乱之后就算以太网建连成功SPI链路也恢复不到正常状态。正确的初始化顺序应该是以太网PHY复位到TCP/IP协议栈初始化到CIP对象注册最后才使能SPI从机并置一个ready标志。主控侧也要等小板上报ready之后再开始正常的周期读写。我们在SPI上行帧的预留区里加了一个状态字节上电初始值为未就绪协议栈跑通后置为就绪主控发现这个标志才允许进入运动控制流程否则一直等。有了这个握手机制启动阶段的通信时序就稳定了。4.5 功能验证从能建连到能控制改造完成后的功能验证分三步走。第一步是PC端扫描器工具枚举设备确认能看到Identity对象、IP参数正确。第二步是显式报文读写测试比如通过对象服务读小板的诊断信息确认非周期通信路径是通的。第三步才建IO连接把RPI设为4ms观察Assembly数据是否按预期刷新。这三步都过了再上PLC做真机验证。这里有个经验PLC真机验证时重点测的不是正常运行而是异常恢复——拔网线再插、PLC停机再运行、PLC断电重启、RPI在参数范围内变化。这些场景才是现场最容易出问题的。我们当时还用了一个小技巧在SPI帧里专门放了一个版本心跳寄存器联调时通过PLC直接读这个值就能确认CIP连接有没有真正对接到SPI数据不用每次依赖抓包。5. 联调中踩过最深的坑SPI偶发断连与CIP重连失败的完整排查5.1 问题的表象长时间运行中的偶发离线功能验证都通过了我们开始做实验室长时间稳定性测试。测试配置是PLC建2ms RPI连接伺服本体带一个电机连续跑点位运动。头两天一切正常第三天早上检查历史记录发现半夜出现两次通讯丢失PLC侧报IO连接超时但几秒到十几秒后又自动重连成功了。这种偶发问题最头疼因为它不致命但客户现场必然不能接受。我们先假设是网络问题查了交换机、网线、电磁干扰都没找到直接证据。然后调出主控日志发现每次掉线前SPI错误帧计数都会从0跳增到十几这个关联性让我们把排查重点从以太网转移到SPI链路上。5.2 排查过程波形、日志与错误计数三重交叉确认SPI链路有错误帧后我们把逻辑分析仪挂到CS、SCLK、MOSI、MISO四根线上连续抓取几个小时。抓到的错误帧有个明显规律帧头不对第一字节往往是上一帧末尾的数据。这说明从机的缓冲区里混入了残留数据帧边界没有对齐。为了进一步定位我在小板固件里临时加了一个诊断字段记录最近一次CRC错误时的SPI状态寄存器值和DMA剩余计数。跑了一个晚上抓到的错误数据显示每次CRC错误时DMA剩余计数都不为0也就是说在CS上升沿触发帧结束处理时DMA还没把当前帧的数据全部搬完。另一个线索来自主控侧。主控用的是软件片选日志显示错误发生前的一段时间主控有一个高优先级中断占用比较频繁CS释放的时序出现了微秒级延迟。两边的异常叠加起来才导致了偶发错帧。5.3 根因定位片选释放时序与FIFO残留的叠加问题本质是两件事撞在一起。第一件事主机软件片选在中断繁忙时释放不干净CS高电平时间不足从机那边无法可靠区分上一帧结束和下一帧开始的边界。第二件事从机在CS上升沿时就立刻尝试提交当前帧但此时DMA还在搬运FIFO里的剩余字节缓冲区的数据是不完整的。下一帧CS下降沿到来时从机状态机被重置上一帧残留的数据和下一帧的数据混在一起CRC校验自然就失败了。CRC错误之后从机的固件选择丢弃这一帧但PLC那边还在按RPI周期等数据。连续丢几帧之后CIP连接超时IO连接关闭于是出现偶发离线。等从机状态机自我恢复下一轮连接建立通信又看似正常了。这个根因用一句话概括CS边沿是帧边界的锚点但固件没有用CS边沿DMA完成的双重确认来切换帧状态同时主机侧也没有保证CS释放的最短时间。5.4 修复方案与回归验证修复分两侧。主机侧在软件片选驱动里加了CS释放保护SPI帧发送完成后强制等待至少2个字节时钟周期再允许拉高CS进行下一次传输并且SPI任务与高优先级中断之间做了简单的互斥避免CS电平切换被随机延迟。从机侧修改帧接收状态机不再以CS上升沿为唯一帧结束标志而是等DMA完成中断后再做缓冲区提交如果DMA完成时CS已经处于低电平说明下一帧已经开始传输就丢弃当前缓冲区避免混帧。if (spi_dma_complete) { if (cs_pin_read() HIGH) { submit_frame(rx_buf[active_buf]); } else { discard_and_reset(active_buf); } }修复之后做了三轮回归验证。第一轮实验室连续72小时2ms RPI稳定性测试SPI错误帧计数始终保持为0。第二轮拔网线重插测试50次每次掉线重连时间均小于500ms。第三轮到客户现场跑了两周没再出现一次通讯丢失。这个案例也让我意识到偶发问题往往是多个小问题叠加的结果只修一个点永远不够。5.5 教训沉淀SPI链路调试清单这次排查之后我沉淀了一份SPI链路调试清单每次做类似项目都会照着过一遍。逻辑分析仪采样率至少要达到SCLK的4倍以上最好8倍否则抓到的波形本身就在丢边沿。关注CS释放边沿与最后一个SCLK边沿的时间差至少保留半个字节以上不要让CS和SCLK几乎同时动作。帧格式里必须有CRC不能只靠帧头CRC是判断数据完整性的底线。从机初始化完成之前不要应答有效数据用ready状态字节和主机握手。把SPI错误帧计数、CRC错误计数、重连次数这些诊断量通过CIP显式报文暴露给上位机产品出问题时能远程定位。这个清单在后来的EtherCAT方案中同样适用SPI链路设计的原则是通用的。6. 性能验证与量产产测阶段必须盯住的细节6.1 PPS、周期抖动与掉线恢复时间性能验证不能只看能不能连通得量化。PPS指每秒的IO报文数如果RPI是4ms理想情况下就是250pps。测试时我习惯在PLC侧配置循环计数器跑一段时间后统计主控收到的连续计数是否有空缺空缺就意味着丢帧。周期抖动是另一个关键指标。用示波器或逻辑分析仪同时抓SPI帧起始信号和以太网帧发送信号统计两者时间差的最大值和最小值抖动小于RPI的25%是一个比较稳妥的目标。我们实测在RPI4ms配置下SPI到以太网方向的抖动约在正负150微秒左右整体链路表现稳定。掉线恢复时间要单独测拔网线5秒后插回测量从物理层恢复、IP地址确认、CIP连接重建到IO数据恢复交换的完整时间。这个时间取决于协议栈是否开启了快速连接模式目标最好控制在1秒以内。6.2 产测中的固件版本、序列号与MAC地址管理量产阶段有几个细节很容易被忽视。固件版本要区分协议栈原生版本和适配版本两个版本号都固化到固件里通过Identity对象暴露。产品出问题后售后只报一个固件版本号你是没法判断问题出在CIP侧还是SPI适配侧的。MAC地址管理同样重要。批量MAC地址要提前从相关机构申请或者向芯片供应商购买地址段写入小板专用存储区。产测时用扫描器工具逐台读取Identity对象核对序列号和MAC地址是否匹配防止出现设备名重复、MAC重复这类低级错误。产测流程我们固定为四步烧录固件并写入MAC和序列号上电自检SPI通信和CRC用模拟扫描器建立连接并读写关键对象属性记录测试结果到产测系统。每一步都有明确的通过标准不合格的板子直接拦截在产线上。6.3 通过主控SPI在线升级小板固件小板固件的升级我们最终走的是主控SPI通道没有额外引出一条烧录线。原理是在小板Flash里分两个区Boot区负责接收固件并写入App区App区是正常的协议栈固件。主控通过SPI以专用帧类型下发固件包小板Boot区逐包校验CRC全部完成后跳转到新固件。在线升级最怕的是升级过程中掉电变砖。我们的做法是双Bank方案新固件写入备份区校验完整后引导程序把备份区切换为运行区如果新固件启动失败引导程序还能自动回退到旧版本。虽然增加了Flash占用但换来了产品现场升级的安全性。整个升级流程对用户是透明的PLC侧只需要通过显式报文触发一次升级指令。设计帧格式时升级帧和普通数据帧用帧类型字段区分主控侧状态机严格校验版本和CRC后才发起复位杜绝误触发。这套方案跑稳定之后回头看整个项目最值钱的反而不是那块小板上的协议栈而是主控侧完全不知道外面跑的是什么协议的松耦合设计。后续接其它协议家族时主控代码基本不用动只换对应协议的协处理小板固件就行。如果你也在做伺服、变频器、运动控制器这类设备的网络化改造这套协议栈隔离的思路可以参考。最后再分享一条个人体会无论Demo程序写得多么完整先把SPI链路的错误统计和对端心跳做出来再接CIP连接这一步能帮你省下后面一整周的排查时间。