以STM32F407+LAN9252为基础移植EtherCat从站试验记录

一、实验前的准备工作

1.SSC软件
2.EtherCat从站开发板(淘宝-元杞科技-Ethercat从站开发板)STM32-LAN9252 通过SPI连接
3.电脑安装TWINCAT3
4.XMLNotepad 、XMLSpy

二、实验目的

  1. 从站向主站发送ADC1的值和ADC2的值(为了偷懒,ADC2=ADC1的值+1)
  2. 从站向主站发送Key1的值和Key2的值(Key1&Key2是uint16的变量,可以自定义值,并不是真实的按钮抬起或按下的状态)
  3. 主站向从站发送3个变量值 Voltage_control、Current_control、Power_control。

三、实验步骤

1.使用SSC文件生成对象字典

我在实验过程中发现——每次实验仅修改对象字典内容和更新xml文件即可,底层驱动和协议栈内容无需更改。所以,选择el9800模板即可,其他无需更改。

以STM32F407+LAN9252为基础移植EtherCat从站试验记录_第1张图片
模板的保存-打开excel表格的步骤省略,表格如下:

以STM32F407+LAN9252为基础移植EtherCat从站试验记录_第2张图片我只填写了两种PDO ----> RXPDO & TXPDO
在填写时我遇到了两个问题:
问:可以使只使用0x6000一个Index吗?
答:可以但不合理,如果有不同类型参数,建议使用多个index来区分,index的累加值为0x10,例如,0x6000、0x6010等(参照ETG5001)。

问:我观察到很多例子中在DataType栏填写BOOLEAN添加了补位,我的理解是:3个boolbool类型不满16bit,所以要手动添加补位用的参数,直到16bit吗?
答:对象字典内容是需要按照2字节对齐的,常用的方法是定义uint16_t,不用的bit位预留,或者用BIT(X)【例:BIT2】来补齐,具体定义可以看ETG2000里面的对象字典数据类型)

2.生成对象字典并导入

在这一步,SSC会生成很多原文件,由于我们是在例程的基础上做修改,所以只需要关注生成的对象字典文件------>“SSC-DeviceObjects.h”如果有名字不同,那就找XXXXXXObjects.h这样的文件。
让我们打开这个文件,并同一时间打开例程的el9800.h文件。
根据el9800.h文件中的内容格式将SSC-DeviceObjects.h的内容复制到相应位置。
第一部分:结构体

typedef struct OBJ_STRUCT_PACKED_START {
UINT16 u16SubIndex0;
UINT32 SI1; /* Subindex1 - Reference to 0x7010.1 */
UINT32 SI2; /* Subindex2 - Reference to 0x7010.2 */
UINT32 SI3; /* Subindex3 - Reference to 0x7010.3 */
} OBJ_STRUCT_PACKED_END
TOBJ1601;


 
typedef struct OBJ_STRUCT_PACKED_START {
UINT16 u16SubIndex0;
UINT32 SI1; /* Subindex1 - Reference to 0x6000.1 */
UINT32 SI2; /* Subindex2 - Reference to 0x6000.2 */
} OBJ_STRUCT_PACKED_END
TOBJ1A00;


 
typedef struct OBJ_STRUCT_PACKED_START {
UINT16 u16SubIndex0;
UINT32 SI1; /* Subindex1 - Reference to 0x6020.1 */
UINT32 SI2; /* Subindex2 - Reference to 0x6020.2 */
} OBJ_STRUCT_PACKED_END
TOBJ1A02;
 


 
typedef struct OBJ_STRUCT_PACKED_START {
UINT16   u16SubIndex0;  /**< \brief Subindex 0 */
UINT16 aEntries[1];  /**< \brief Subindex 1 - 1 */
} OBJ_STRUCT_PACKED_END
TOBJ1C12;


 
typedef struct OBJ_STRUCT_PACKED_START {
UINT16   u16SubIndex0;  /**< \brief Subindex 0 */
UINT16 aEntries[2];  /**< \brief Subindex 1 - 2 */
} OBJ_STRUCT_PACKED_END
TOBJ1C13;
 


 
typedef struct OBJ_STRUCT_PACKED_START {
UINT16 u16SubIndex0;
UINT16 Key1_value; /* Subindex1 - key1_value */
UINT16 Key2_value; /* Subindex2 - key2_value */
} OBJ_STRUCT_PACKED_END
TOBJ6000;



typedef struct OBJ_STRUCT_PACKED_START {
UINT16 u16SubIndex0;
UINT16 Adc1_value; /* Subindex1 - adc1_value */
UINT16 Adc2_value; /* Subindex2 - adc2_value */
} OBJ_STRUCT_PACKED_END
TOBJ6020;



typedef struct OBJ_STRUCT_PA

你可能感兴趣的:(嵌入式,STM32,stm32,单片机,物联网,嵌入式硬件,网络协议)