基于AX58100 EtherCAT从站开发
一、设备描述文件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) |
///