打印
[STM32F3]

STM32与LAN9252构建EtherCAT从站(一)

[复制链接]
3881|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
慢醇|  楼主 | 2021-12-29 22:45 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
项目简介
EtherCAT及项目简述
EtherCAT是一种基于以太网的工业通信协议,类似于Profinet。
EterhCAT协议是一主多从模式,主站一般是由一个装有TwinCAT的PC机担任,PC机对网卡特殊要求,需要支持EtherCAT的网卡。本项目的主站是一台倍福CX9020(仅支持TwinCAT2.0),这是一台ARM架构的PC,内装Windows CE操作系统,操作系统中装了TwinCAT2.
项目需要开发其从站,周期交互IO:64入64出,选用STM32F103+LAN9252构建。

使用特权

评论回复
沙发
慢醇|  楼主 | 2021-12-29 22:47 | 只看该作者
LAN9252工作模式
根据LAN9252的Datasheet所述,LAN9252一共有四种工作模式:

自我工作模式(数字I/O模式),8入8出
SPI 串口通信模式,4线串行数据(或更多SQI)
并行通信模式(HBI),16/8位数据交互
扩展模式,LAN9252与MCU之间SPI通信,同时对外再提供一组MII接口,可扩展连接另一组PHY芯片,多接一个RJ45端子。

使用特权

评论回复
板凳
慢醇|  楼主 | 2021-12-29 22:53 | 只看该作者

使用特权

评论回复
地板
慢醇|  楼主 | 2021-12-29 22:54 | 只看该作者
根据需求,项目选择SPI串口模式。

使用特权

评论回复
5
慢醇|  楼主 | 2021-12-29 22:54 | 只看该作者
整体开发流程
淘宝购买相关学习板,得到文档和协议栈。
根据项目需求构建XML,该XML将会由TwinCAT2解析,并将相关特诊烧录进LAN9252连接的EEPROM中。
根据学习板附带的文档,尽可能理解EtherCAT协议栈和通信步骤。
根据项目需求绘制自选MCU与LAN9252的原理图和PCB。
移植相关代码到自己的MCU中,TwinCAT中编写PLC测试和调试。

使用特权

评论回复
6
慢醇|  楼主 | 2021-12-29 22:55 | 只看该作者
整个体系中,LAN9252起到以下作用:

PHY的作用,所有跟以太网RJ45交互的工作,都由LAN9252完成。
网络交换作用,EtherCAT要求从站必须有一拖一的能力,不可以终结总线,LAN9252有2端口/3端口模式,内部做网络交换。
数据解析及SPI下位机作用。MCU可以作为SPI主模式与LAN9252进行数据交互,其交互流程在协议栈中,非常复杂,没能完全理解。

使用特权

评论回复
7
慢醇|  楼主 | 2021-12-29 23:01 | 只看该作者
移植要处理的问题
首选需要初步理解TwinCAT使用的XML的作用,此XML是对设备的描述,类似于GSD文件。描述了通信时需要使用的对象字典,数据类型,长度等等。xml文件一般都有好几兆大小,但TwinCAT只会解析XML并将其中一部分特征数据烧录进LAN9252挂载的EEPROM中去,所以并不需要担心EEPROM大小问题,一般选择512KB的快速EEPROM(24FC512)。
根据自己的项目要求,设计XML,这个工作可以通过EtherCAT的开发工具SSC来简单实现,如果不使用SSC,手工修改XML将是一件非常麻烦的事情。
SSC在生成XML的同时,还可以生成代码,这份代码是没法直接用的,但里面有关字典的.c文件非常有价值,可以参考并移植到开发板的代码中去,完成自己的逻辑。

使用特权

评论回复
8
慢醇|  楼主 | 2021-12-29 23:05 | 只看该作者
代码层面的工作
整个EtherCAT协议栈相当复杂,几乎没办法阅读,只能从main()函数入手,简单地剥解一下代码,可以看到整个项目是由三个大函数构建而成的:

HW_Init();
MainInit();
while (1){
    MainLoop();
}

使用特权

评论回复
9
慢醇|  楼主 | 2021-12-29 23:06 | 只看该作者
以上就是整个EtherCAT协议跑起来的骨架。 此外,在MCU的GPIO和内部资源部分,需要做到以下几点:
SPI四根线的使能,跟LAN9252的通信就靠它了。

一个定时器中断,1ms周期,调用ECAT_CheckTimer();函数,但不要一上来就初始化使能这个中断,根据接口定义好使能入口,让协议栈调用,以上电就开启这个定时器中断会导致连接失败。

三个外部中断,IRQ,SCY0,SCY1,其中IRQ必须实现,SCY0和SCY1是分布式时钟同步用的,可以选择使用,也可不使用,注意这三个中断的使能同样要根据代码中的接口定义入口,由协议栈使能和失能中断,万万不可一上电就来使能中断。

中断中处理的代码如下:

使用特权

评论回复
10
慢醇|  楼主 | 2021-12-29 23:07 | 只看该作者
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {
if (GPIO_Pin == LAN9252_IRQ_Pin) {
         PDI_Isr();
         return;
}
if (GPIO_Pin == LAN9252_SYC0_Pin) {
     DISABLE_ESC_INT();
     Sync0_Isr();
     ENABLE_ESC_INT();
     return;
}
if (GPIO_Pin == LAN9252_SYC1_Pin) {
     DISABLE_ESC_INT();
     Sync1_Isr();
     ENABLE_ESC_INT();
     return;
}
}

使用特权

评论回复
11
慢醇|  楼主 | 2021-12-29 23:10 | 只看该作者
开发中使用的工具
STM32CubeMX5.1, Keil5(TrustStudio), Sublime3
SSC, XMLSpy
TwinCAT2.0, VirtualBox
AltiumDesigner18

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

125

主题

1241

帖子

5

粉丝