自建极简Ethercat主站-第1章 底层驱动编写与数据组包

第1章 驱动编写与数据组包

源码地址

1.1 底层编写

​ 从根本来讲,Ethercat主站就是用来读写从站的。因此驱动的最核心功能有三个:网卡初始化、写入据到从站、读取从站数据。还有一个非必要功能,就是系统时钟,用来超时计数,也算是个简单的容错。当然,如果你不做超时也可以,选择发送和接收时一直死等也可以。

1.1.1 网卡初始化

​ 关于GD32的以太网理解和初始化流程,请看文章Ethercat学习-GD32以太网学习 下面是部分代码,代码的初始化流程也是按照文章中的流程来的。其中网卡最好配置为混杂模式,这样不管什么MAC地址都能接收到,或者将Ethercat的目的MAC填写为本机的MAC地址

/* 初始化代码片段 */
int enet_system_init(void)
{
   
    ErrStatus reval_state = ERROR;
    /* 初始化以太网模块时钟 */
    enet_clock_init();
    /* 初始化以太网引脚 RMII接口*/
    enet_gpio_init();
    /* 初始化以太网MAC和DMA */
    reval_state = enet_mac_dma_config();
    return reval_state;
}
/* MAC 和 DMA 的初始化 */
static int enet_mac_dma_config(void)
{
   
    int i;
    ErrStatus reval_state = ERROR;
    /* 复位,并等待完成 */
    enet_deinit();
    reval_state = enet_software_reset();
    if(ERROR == reval_state) {
   
        return ERROR;
    }
    /* 以太网初始化 配置网卡自协商模式、使能接收端校验和检测功能、接收所有的广播帧*/
    reval_state = enet_init(ENET_AUTO_NEGOTIATION, ENET_AUTOCHECKSUM_DROP_FAILFRAMES, ENET_BROADCAST_FRAMES_PASS);
    if(ERROR == reval_state) {
   
        return ERROR;
    }
    /* 设置MAC地址 */
    enet_mac_address_set(ENET_MAC_ADDRESS0, mac);
    /* 初始化收发的描述符,常规描述符,链结构*/
    enet_descriptors_chain_init(ENET_DMA_TX)
  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值