以前每个月工资两三千的时候,我舍得花四五千买一部手机;现在每个月工资1万多,我反而只想买2000以内的红米了。现在手机对于我来说,重要程度暴跌,每天就接点电话,上班微信和TIM挂着,下班回家带带娃,看看书,学点知识,临睡觉半个小时用手机看看新闻,玩两局三国杀,正常情况下每天拿起充电器给手机充电时,都还有80%以上的电量。(现在用的小米MIX2)

STM32与LAN9252构建EtherCAT从站(一):项目简介

  1. 一、 STM32与LAN9252构建EtherCAT从站(一):项目简介
  2. 二、 STM32与LAN9252构建EtherCAT从站(二):使用SSC生成协议栈和XML文件
  3. 三、 STM32与LAN9252构建EtherCAT从站(三):LAN9252的XML文件
  4. 四、 STM32与LAN9252构建EtherCAT从站(四):STM32配置SPI
  5. 五、 STM32与LAN9252构建EtherCAT从站(五):STM32与LAN9252适配
  6. 六、 STM32与LAN9252构建EtherCAT从站(六):TwinCAT2的使用和从站测试

STM32与LAN9252构建EtherCAT从站(一):项目简介

EtherCAT及项目简述

EtherCAT是一种基于以太网的工业通信协议,类似于Profinet。

EterhCAT协议是一主多从模式,主站一般是由一个装有TwinCAT的PC机担任,PC机对网卡特殊要求,需要支持EtherCAT的网卡。本项目的主站是一台倍福CX9020(仅支持TwinCAT2.0),这是一台ARM架构的PC,内装Windows CE操作系统,操作系统中装了TwinCAT2.

项目需要开发其从站,周期交互IO:64入64出,选用STM32F103+LAN9252构建。

LAN9252工作模式

根据LAN9252的Datasheet所述,LAN9252一共有四种工作模式:

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


根据需求,项目选择SPI串口模式。

整体开发流程

  1. 淘宝购买相关学习板,得到文档和协议栈。
  2. 根据项目需求构建XML,该XML将会由TwinCAT2解析,并将相关特诊烧录进LAN9252连接的EEPROM中。
  3. 根据学习板附带的文档,尽可能理解EtherCAT协议栈和通信步骤。
  4. 根据项目需求绘制自选MCU与LAN9252的原理图和PCB。
  5. 移植相关代码到自己的MCU中,TwinCAT中编写PLC测试和调试。

整个体系中,LAN9252起到以下作用:

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

移植要处理的问题

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

代码层面的工作

整个EtherCAT协议栈相当复杂,几乎没办法阅读,只能从main()函数入手,简单地剥解一下代码,可以看到整个项目是由三个大函数构建而成的:

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

以上就是整个EtherCAT协议跑起来的骨架。
此外,在MCU的GPIO和内部资源部分,需要做到以下几点:

  1. SPI四根线的使能,跟LAN9252的通信就靠它了。
  2. 一个定时器中断,1ms周期,调用ECAT_CheckTimer();函数,但不要一上来就初始化使能这个中断,根据接口定义好使能入口,让协议栈调用,以上电就开启这个定时器中断会导致连接失败。
  3. 三个外部中断,IRQ,SCY0,SCY1,其中IRQ必须实现,SCY0和SCY1是分布式时钟同步用的,可以选择使用,也可不使用,注意这三个中断的使能同样要根据代码中的接口定义入口,由协议栈使能和失能中断,万万不可一上电就来使能中断。中断中处理的代码如下:
    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;
     }
    }
    

开发中使用的工具

  • STM32CubeMX5.1, Keil5(TrustStudio), Sublime3
  • SSC, XMLSpy
  • TwinCAT2.0, VirtualBox
  • AltiumDesigner18

大姨妈微信语录,关于过年

今天来南京了,安静平和与姜堰那个大家庭全然不同。竟有点不适应了。想想量量的大嗓门,尧尧的诗朗诵,天天的高频率。还真是热闹。孩子们本来就开心地玩,天公又送了厚厚的雪,又打起了几场雪杖。这个年过得真正的有趣。爷爷们杖着陪老婆婆,一个个地饭来张口,牌来伸手。神仙一般!奶奶们托儿女的福,竟然玩了几天的麻将,一边张长李短,一边摸牌打牌,谈极天峰。不知打错了多少牌,还乐不思蜀,输钱的输得开心,赢钱的得意忘形。这个年……怎么让人不想下个年。年啊!你一个月光临一次!

丁丁生于 1987.07.01 ,30岁,英文ID:newflydd
  • 现居住地 江苏 ● 泰州 ● 姜堰
  • 创建了 Jblog 开源博客系统
  • 坚持十余年的 独立博客 作者
  • 大学本科毕业后就职于 中国电信江苏泰州分公司,前两年从事Oracle数据库DBA工作,两年后公司精简技术人员,被安排到农村担任支局长(其本质是搞销售),于2016年因志向不合从国企辞职,在小城镇找了一份程序员的工作。
  • 在 Git OSChina 上积极参与开源社区
  •