文章目录
第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)