基于AX58100EtherCAT从站开发
- 其他
- 2025-09-18 11:27:02

一、设备描述文件XML的规范
1、XML文件的结构规范
主要核心的讲解:
1、从站支持的数据类型定义区:Desoriptions --> Devices --> Profile --> Dictionary --> DataTypes
2、从站设备所有支持变量PDO的定义区(这里还没有映射关系):Desoriptions --> Devices --> Profile --> Dictionary --> Objects
3、Sm数据通道的定义修改(这个定义了主从采用SM同步通信方式时,每个SM通道,主从交换的数据大小与起始地址):Desoriptions --> Devices --> Sm
4、RxPdo数据区定义(这里定义了从站所有支持的PDO中,用来读取主站命令的PDO数据,相当于定义#1600~#1602的映射内容):Desoriptions --> Devices --> RxPdo --> Entry(这里定义具体的映射数据PDO)
5、TxPdo数据区定义(这里与RxPdo作用相反,相当于定义#1a00~#1a02的映射内容):Desoriptions --> Devices --> TxPdo --> Entry
XML文件中的基本逻辑与数据映射关系:
2、添加新的PDO数据映射的方法与流程
技术细节分析:
1、在XML文件内修改部分:
第一步:在DataTypes内按照格式添加想要的数据类型,标准数据类型必须是EtherCAT支持的才可以
第二步:在Objects内按照格式添加想要的数据,当然必须符合EtherCAT行业规范的数据pdo
第三步:修改Sm对应数据传输通道的大小,如果你添加的是Output数据pdo,就扩大SM2;否则是SM3,单位是:字节
第四步:如果你添加的数据pdo是接收主站命令的,那么需要修改RxPdo将数据节点映射给1600~1602;如果是发送数据给主站的,则修改TxPdo,数据节点映射到1a00 ~ 1a02。
第五步:由于1600~1602或1a00~1a02映射了新的数据,那么需要回到Objects内,修改1600~1602或1a00~1a02对应的数据位长度与数据索引信息,添加索引。
第六步:既然1600~1602或1a00~1a02对应的数据大小改变了,那么对应的DataTypes内1600~1602或1a00~1a02的数据类型定义也要修改;就是扩大数据位大小,添加索引内容。
2、在源代码内添加对应的pdo内容索引:(修改文件e19800l.h、e19800l.c)
第一步:在e19800l.h文件内新增一个对数据pdo的描述对象,例如0x7012,数据类型为real(一个数据节点需要三个结构体对象来描述)
第二步:将数据节点对象添加到object应用对象当中
第三步:由于数据节点映射在1600~1602或1a00~1a02上的,意味着对应的1600~1602或1a00~1a02数据描述结构体要做修改;例如7012映射在1601上:
1601对应datatypes结构体修改:
1601对应的object上的修改:
第四步:我们知道,1600~1602和1a00~1a02最终需要同过sm数据通道来交互,所以对应的数据通道地址结构体也要修改;例如1601对应的output通道1c12:
第五步:在e19800l.c文件中,调整Rxpdo或Txpdo对应的数据通道内存大小;例如我在RxPdo的1601中添加了一个real的pdo数据映射:
3、新添加的PDO数据如何与硬件交互
从源代码的LED与SWITCH开始讲解:(数字量IO的关联)
1、文件el9800l.c中的物理关联:
2、LED_x与SWITCH_x在el9800l.h当中的定义,其实就是关联板子上寄存器地址宏操作:
3、PXin(n) 与 PXout(n) 宏定义操作的底层实现,在system.h文件中
4、GPIOXX_BASE在STM32内核中寄存器基础地址的定义:(stm32f4xx.h)
5、在程序文件 el9800hw.c中的函数对GPIO口的驱动配置(很重要!!)
注意:提共的历程中,GPIOB和GPIOE被用为特殊的接口,无法作为普通的IO口来使用??
范例源码中,模拟量输入与输出的硬件关联:
4、EtherCAT从站PDO映射与定义的技术细节(重要细节)
举个例子讲解技术细节:(BIT位形式的PDO)
第一步:在XML文件中,申明一个PDO对应的数据类型。
注意:每个PDO数据节点至少要占用16个bit,这与AX18600芯片数据寄存器有关,当PDO不足16位是,需要补齐。
第二步:使用申明好的数据类型,在XML的Object中,定义一个PDO节点。
第三步:根据笔记开头对PDO数据映射关系的描述,这个自定义的数据节点要挂载在输入或输出映射表上。
第四步:修改输出PDO地址寄存器PDO1601的数据类型定义
第五步:修改Object的1601PDO内容,添加输出数据PDO的地址
下面开始修改源程序代码与xml对应上
第六步:在源代码的el9800app.h中,添加数据节点结构体系列描述:(有四个东西需要创建或修改)
第七步:将新创建的PDO节点,加入应用PDO节点管理数据(在源代码的el9800app.h中)
第八步:在源代码的el9800app.h中,对应修改1601映射数据管理对象的四个东西
第九步:在源代码的el9800app.h中,修改1c12PDO对象,因为1600~1602是映射到1c12上,最终完成主从数据交换的
第十步:在el9800appl.c文件中,按照需求为数据节点PDO分配内存空间,用于交互数据
第十一步:在el9800appl.c文件中,将PDO数据缓存区内容赋值给具体的硬件接口,实现硬件操作
第十二步:硬件驱动初始化,否则数据也无法在硬件上体现出来
///
二、MCU硬件设计与软件驱动到接口的映射之间的关系
2、根据代码总体框架讲解IO驱动到PDO映射的过程(重点内容)
代码框架整体分为两个部分:硬件设计与驱动部分、通讯PDO与硬件数据交互部分
硬件设计与驱动部分:
AX58100协议芯片与STM32MCU关键的硬件链接只有:SPI通讯接口、协议通信IO中断信号线。而数字量IO由STM32提供(后期模拟量也应该由mcu提供)
应用层关键的硬件驱动代码:
1、SPI通信接口驱动
根据使用的STM32不同,使用的库函数与时钟频率不同,要求驱动SCK频率2.5ms左右!!!在SPI.c文件中,uint8_t WR_CMD (uint8_t cmd)函数修改为实际使用的SPI接口。
特别注意:AX58100需要两个片选信号控制,SPI CS FMC恒定高电平,SPI CS ESC在需要通信时,低电平唤醒,代码此处需要根据实际IO口修改:
///
2、外部IO中断驱动,MCU检测到AX58100中断信号,进行IO数据映射
这里需要开启三个IO中断,根据实际使用的MCU资源驱动中断函数。对应修改宏定义来对应中断函数:
//
3、根据使用的系统时钟,配置驱动一个TIM定时器作为总线通信看门狗
必要时,需要调整系统时钟以及定时器中断等级;配置根据实际STM32资源作修改。还需要修改相关宏定义来关联实际使用的定时器中断接口:
通信PDO与硬件数据交互的实现:
从站DC同步通讯模式下的实现原理
第一步:主站请求操作从站
通过循环检查从站邮箱,查看是否收到主站控制请求字,确认控制请求后,复位历史错误标志位等信息,恢复从站到初始状态;继续检查协议芯片当前状态,同步修改MCU运行状态,打开相应功能。涉及函数:ECAT_Main();这一步,从站跟据主站的请求,开启了DC同步中断函数。
第二步:TIM定时器中断开启,定时检查通讯状态
每间隔1ms(一定是1ms),关闭Ether主中断,然后检查周期同步报文丢失的情况;理论同步报文个数与实际作比较,丢失个数超过设定值,则作处理。涉及中断函数:void TimerIsr(void)。
第三步:有一个主中断函数,该函数在SM和DC模式下被启动执行数据的写出映射
如果主从同步模式为SM同步,则中断将执行IO数据双向映射;如果是DC模式,则只执行输出数据的映射,并检查同步数据帧丢帧的情况(输出:从-->主;输入:主-->从)。涉及的中断函数:void PDI_Isr(void)
第四步:DC同步模式一般使用SYN0模式,该模式下,DC同步数据主要是输入数据
在sync0的DC同步模式下,如果SM同步没有开启,则会执行IO双向映射,否则只执行一次输入数据的映射并递交到mcu硬件层。涉及函数:void Sync0_Isr(void)
///
基于AX58100EtherCAT从站开发由讯客互联其他栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“基于AX58100EtherCAT从站开发”