EtherCAT移植过程
前言:刚拿到一个EtherCAT的开发需求,本来想安心当个CV战士的,结果在网上找了一圈,只有https://www.hexcode.cn/article/5e3ee9ab2daef97 这篇写的相对详细,看来偷不了懒了,只有自己重新整理开发了。
1、需求
基于STM32F407芯片、LAN9253芯片(自带PHY芯片),验证8路I/O程序的通信。
2、使用到的工具
- 协议栈生成:Excel(编辑协议栈预文件),SSC-5.11(生成ESC协议栈文件),XMLSpy(查看XML文件);
- 代码编写:CubeMX,Keil5;
- 程序验证:TwinCAT3.0。
3、SSC构建协议栈文件和XML
3.1、配置SSC 协议栈/XML
SSC-5.11和SSC-5.12生成的协议栈文件差别有点大,SSC-5.11更适配MicroChip官网提供的SSC SDK。打开SSC,选择8bit I/O模板,点击“OK”生成Excel文件(需要保证Excel文件是非加密状态)。
SSC-5.11和SSC-5.12生成的Excel文件区别在于5.12有一段0xFxxx的片区,用于通道数量的填写。5.11生成的协议栈不用在意这个,状态转换的时候会忽略这个步骤。(所以不能用非同一SSC配出来的XML和协议栈!)

打开5.11生成的Excel文件,配置如下:

0x6000定义的是输入,0x7000定义的是输出,配置完成后保存,退出。
这个时候有的SSC会自动加载Excel文件,如果没有自动加载,点击Tool->Application->Import,加载刚才配置的Excel文件。

RT2000是自定义的SSC协议栈名称,右边显示的是所使用到的SSC协议栈版本。附一张5.12配出的文件:

可以很明显的看出协议栈里的很多文件已经变更了,5.11版的协议栈和官方给的SDK更适配。参考“AN_ET9300.pdf”文件,SSC选项设置如下:








选项设置好后点击Project->Create New Slave File,生成XML文件和协议栈文件夹。


3.2、修改SSC 协议栈/XML
由于SSC是针对倍福公司的软硬件生成协议栈,而我们使用的是基于LAN9252芯片和STM32F4芯片的程序架构,所以需要更改一些东西:

- XML的EEPROM类型;
- 协议栈增加LAN9252.c/LAN9252.h文件。
3.2.1、XML-> EEPROM
打开XML文件,Descirptions->Devices->Device->Eeprom->ConfigData:
800E00CC8813f000000000
保存,找到TwinCAT3路径的XML路径:C:\TwinCAT\3.1\Config\Io\EtherCAT,把TwinCAT3自带的XML模板全删了,然后把自己生成的XML文件丢进去。
3.2.2、增加LAN9252.c/LAN9252.h文件
Micrchip官网下载SDK(“LAN9252-PIC32-SDK-1.1”),里面有这个两个文件,我们只需要里面的代码架构,里面的内容都可以自己写。
4、创建MDK工程,移植协议栈
4.1、CubeMX创建STM32F407工程
此过程中,我们需要开启以下引脚功能:
- 外部晶振;
- SPI1;
- 1个定时器中断;
- 3个外部中断(一个主中断,两个时钟同步中断,该程序使用的是DC同步,如果是用Free同步或者是SM同步,则只需要开一个主中断,主中断和定时器中断的优先级一样且要高于时钟同步中断);
- 所使用的的I/O引脚。
- 串口(非必须)。





点击Project Manager,添加工程名,选择MDK-ARM,点击Create Code生成对应的MDK工程。
4.2、移植协议栈
把第3章生成的协议栈添加进MDK文件树中,如下图:

RT2000.c是SSC生成的“从站APPlication”文件,I/O引脚映射和应用层逻辑在这个文件里面修改;
LAN9252.c是SDK里面的,用于完成MCU和LAN9252芯片之间的通信建立。
重点就在这两个文件里面,除此之外,在spi.c文件里面创建对应的spi读写函数就行了。
接下来按照顺序,先修改spi,在修改LAN9252,最后修改APPlication文件。
4.2.1、SPI.c
根据SDK文件里面的SPIDriver,创建SPI发送/SPI接收函数,其实也可以直接Copy过来用,删除SPIOpen(),SPIPut(),修改一下SPIWrite()和SPIRead()对应的读写HAL函数,补一下(void)。最后修改一下
SPI_CS的置高/置低HAL函数:
#define DESELECT_SPI HAL_GPIO_WritePin(SPI1_NSS_GPIO_Port,SPI1_NSS_Pin,GPIO_PIN_SET)
#define SELECT_SPI HAL_GPIO_WritePin(SPI1_NSS_GPIO_Port,SPI1_NSS_Pin,GPIO_PIN_RESET)
#define CSHIGH() DESELECT_SPI
#define CSLOW() SELECT_SPI

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/57791.html