STM32与LAN9252的连接(一):项目简介

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

单片机中的data,bdata,idata等用法

51单片机中的data, bdata, idata, xdata,code等内存区域的范围如下:

上表可以看出bdata的描述是:

片内RAM 位寻址区

只有这个区域的变量可以使用X^N的方式进行位寻址。
因此一个u8类型就可以作为8个bit的状态量供8条逻辑使用,节约内存开支。

丁丁生于 1987.07.01 ,30岁,英文ID:newflydd

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