开源主站主要就SOEM和IGH两种,IGH只支持linux,SOME支持linux和rtThread,最新版本是SOEM1.4。可以到github或Gitee下载SOEM,移植EtherCAT之前,首先把Nuvoton驱动跑起来。
SOEM移植主要是三个文件 osal.c,oshw.c和nicdrv.c:
osal.c 主要是微秒及的延时和定时函数;
oshw.c 主要是网络端和本机端数据的大小端转换;
nicdrv.c 主要是网络数据收发。
1,移植osal.c:主要内容是实现osal_usleep和osal_gettimeofday两个函数。
我开始思路是自定义一个定时器用于EtherCAT,当时用了Timer4。等实现差不多了,发现系统时钟用的是Timer5,很多地方功能重复。最终和系统共用Timer5,省了个Timer。改动过的相关代码,osal_timer_init这个初始化函数要在启动EhterCAT功能之前调用。
#include <osal.h>
#include <time.h>
#include <sys/time.h>
#include <rtthread.h>
#include <rtdevice.h>
#include "NuMicro.h"
#include "drv_sys.h"
static rt_uint32_t us_ticks;
void osal_timer_init(void)
{
rt_uint32_t cmp = ETIMER_GetCompareData(5);
us_ticks = 1 * cmp / (1000000 / RT_TICK_PER_SECOND);
rt_