Ethercat学习-从站源码移植

张开发
2026/4/13 12:33:06 15 分钟阅读

分享文章

Ethercat学习-从站源码移植
文章目录简介移植源码1.源码结构2.GD32硬件接口准备1.SPI接口2.PDI中断配置3.Sync0中断配置4.Sync1中断配置5.定时器中断配置3.移植准备4.源码移植1.修改头文件名2.ecatport.c文件修改1.SPI部分修改2.中断部分3.修改HW_Init()4.报错修改3.myapp.c文件修改5.其他简介移植平台GD32F450,从站芯片AX58100,从站源码版本V5.12移植源码1.源码结构源码使用之前SSC生成的源码,如下图所示因为配置SSC的时候只选择了COE的功能,所以源码比较少。移植过程中重点关注红笔圈出的几个文件。其中ecat_def.h就是SSC中的配置项。el9800.c和el9800.h文件是根据EL9800的硬件生成的硬件接口文档,我们需要将它修改为GD32的接口。myapp.c、myapp.h、myappObjects.h是根据我之前定义的Excel文件生成的。2.GD32硬件接口准备1.SPI接口ESI文件的ConfigData中,PDI的配置选择的SPI,另外SPI的极性也在PDI的配置中。下面是部分代码/* SPI3初始化 */voidbsp_spi3_init(void){spi_parameter_struct spi_init_struct;rcu_periph_clock_enable(SPI3_CS_GPIO_CLK);rcu_periph_clock_enable(SPI3_MISO_GPIO_CLK);rcu_periph_clock_enable(SPI3_MOSI_GPIO_CLK);rcu_periph_clock_enable(SPI3_SCK_GPIO_CLK);rcu_periph_clock_enable(RCU_SPI3);/* MISO 引脚配置*/gpio_mode_set(SPI3_MISO_GPIO_PORT,GPIO_MODE_AF,GPIO_PUPD_NONE,SPI3_MISO_GPIO);gpio_output_options_set(SPI3_MISO_GPIO_PORT,GPIO_OTYPE_PP,GPIO_OSPEED_25MHZ,SPI3_MISO_GPIO);gpio_af_set(SPI3_MISO_GPIO_PORT,GPIO_AF_5,SPI3_MISO_GPIO);/* MOSI 引脚配置 */gpio_mode_set(SPI3_MOSI_GPIO_PORT,GPIO_MODE_AF,GPIO_PUPD_NONE,SPI3_MOSI_GPIO);gpio_output_options_set(SPI3_MOSI_GPIO_PORT,GPIO_OTYPE_PP,GPIO_OSPEED_25MHZ,SPI3_MOSI_GPIO);gpio_af_set(SPI3_MOSI_GPIO_PORT,GPIO_AF_5,SPI3_MOSI_GPIO);/* SCK 引脚配置*/gpio_mode_set(SPI3_SCK_GPIO_PORT,GPIO_MODE_AF,GPIO_PUPD_NONE,SPI3_SCK_GPIO);gpio_output_options_set(SPI3_SCK_GPIO_PORT,GPIO_OTYPE_PP,GPIO_OSPEED_25MHZ,SPI3_SCK_GPIO);gpio_af_set(SPI3_SCK_GPIO_PORT,GPIO_AF_5,SPI3_SCK_GPIO);/* CS 引脚配置 */gpio_mode_set(SPI3_CS_GPIO_PORT,GPIO_MODE_OUTPUT,GPIO_PUPD_NONE,SPI3_CS_GPIO);gpio_output_options_set(SPI3_CS_GPIO_PORT,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ,SPI3_CS_GPIO);gpio_output_options_set(SPI3_CS_GPIO_PORT,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ,SPI3_CS_GPIO);gpio_bit_set(SPI3_CS_GPIO_PORT,SPI3_CS_GPIO);spi_init_struct.trans_mode=SPI_TRANSMODE_FULLDUPLEX;/* 全双工*/spi_init_struct.device_mode=SPI_MASTER;/* 主机模式*/spi_init_struct.frame_size=SPI_FRAMESIZE_8BIT;/* 8位帧格式*/spi_init_struct.clock_polarity_phase=SPI_CK_PL_LOW_PH_1EDGE;/* 时钟相位极性,空闲时位低电平,第一个时钟边沿进行采样 */spi_init_struct.nss=SPI_NSS_SOFT;/* 软件NSS */spi_init_struct.prescale=SPI_PSC_32;/* 时钟32分频 */spi_init_struct.endian=SPI_ENDIAN_MSB;/* 高位在前 */spi_init(SPI3,spi_init_struct);/* 使能SPI */spi_enable(SPI3);}/* SPI的单字节收发 */u8spi_data_rw(u8 data){u16 tmp;/* 等待发送缓冲区清空 */while(RESET==spi_i2s_flag_get(Ethercat_SPI,SPI_FLAG_TBE));/* 发送要写的寄存器地址 */spi_i2s_data_transmit(Ethercat_SPI,data);/* 等待接收完成 SPI收发一体的,必须等到接收完成才代表一次完整的发送完成*/while(RESET==spi_i2s_flag_get(Ethercat_SPI,SPI_FLAG_RBNE));/* 读取缓存取得值,清空缓存区,准备发送 */tmp=spi_i2s_data_receive(Ethercat_SPI

更多文章