Ethercat学习-GD32以太网学习

news2024/11/27 10:39:50

文章目录

        • 1、GD32F4以太网简介
        • 2、以太网模框图简介
        • 3、以太网主要模块介绍
          • SMI接口
          • RMII接口与MII接口
          • DMA控制器
        • 4、以太网配置流程
        • 5、其他

1、GD32F4以太网简介

GD32F4系列以太网模块包含10/100Mbps以太网MAC,数据的收发都通过DMA进行操作,支持MII(媒体独立接口)与RMII(简化的媒体独立接口)两种与物理层(PHY)通讯的标准接口。

2、以太网模框图简介

在这里插入图片描述

​ 以太网需要外接一个PHY(以太网芯片)才可以进行通信。与PHY连接的方式有两种,一种是通过MII直接连接,将MII接口化简为RMII接口,然后再与PHY进行连接。另外与PHY相连的还有一个SMI接口(站点管理接口)用于配置和管理PHY芯片。

​ AHB仲裁,在当TXDMA与RXDMA同时需要访问AHB总线的时候起作用。因为以太网外设与AHB的接口只有一个,所以当收发两个模块都需要访问AHB总线的时候就有一个优先级的问题。仲裁的方式有两种,一种是固定优先级,RXDMA总是对总线有更高优先级访问权限,一种是轮询优先级,TXDMA和RXDMA按照一定的访问比例来轮流访问总线,例如设置比例为2:1,但是目前这个比例表示什么还不太清楚,是RXDMA和TXDMA对总线的总访问次数的比值,还是发生竞争总次数中,RXDMA和TXDMA优先访问次数的比值,又或者是其他。

​ TXDMA控制器,用于从从内存中读取描述符和数据,并将状态写入到内存中。

​ TxMTL内含TxFIFO,用于缓存待MAC发 送的数据。

​ TXMAC控制数据帧的发送。

​ RxDMA控制器,用于从内存中读取描述符,以及将接收数据与状态写入内存中。

​ RxMTL内含RxFIFO与TXFIFO是相互独立的,用于缓存接受到的数据。

​ RXMAC控制数据接收,有过滤功能。

3、以太网主要模块介绍

SMI接口

​ SMI用于访问和配置PHY芯片中的寄存器。由两根线组成,MDC时钟线和MDIO数据线。SMI主要用到两个寄存器ENET_MAC_PHY_DATA和ENET_MAC_PHY_CTL。ENET_MAC_PHY_DATA中,在写数据时存放的是待写的数据;在读数据是存放的是读到的数据。ENET_MAC_PHY_CTL中PA存放的是PHY的地址;PR中存放的是待访问的PHY的寄存器;PW控制读写,0为读操作,1为写操作;PB用于判断传输状态,PB由软件置1,开始读或者写操作,当读或者写完成后,会又硬件清零。

RMII接口与MII接口

​ SYSCFG_CFG1寄存器的第23位ENET_PHY_SEL位进行配置,选择使用MII或者RMII模式,默认为MII模式。

DMA控制器

​ 这里说的DMA是以太网模块中的专用DMA。在发送数据的时候,CPU将数据打包好,存放与内存中,DMA控制器控制通过DMA将内存中的数据发送至TXFIFO中等待发送。在数据接收的时候,DMA控制器通过DMA将RXFIFO中的数据搬运至内存中,然后通知CPU。这个DMA与CPU之间的数据交换通过寄存器和描述符列表来控制。寄存器,很好理解,就是用来配置DMA、查看的DMA状态的,是芯片外设自带的。**至于描述符列表,这个是我们用户自己申请的一个内存。你可以把描述符理解为一个结构体,这个结构体里的成员用来描述一段内存,包括了内存的地址、长度等信息。而被描述的这段内存就是用来存储待发送的数据或者待接收的数据。描述符列表就是多个描述符连在一起组成的一个表。这个表的结构有两种,一种是链结构(链表),一种是环结构(环形缓存区)。**结构如下图:

在这里插入图片描述

​ 一般有两个描述符队列,一个用作发送,一个用作接收。当 DFM位为 0时(常规描述符),发送描述符由四个描述符字 TDES0-TDES3组成,也就是我们的结构体只有4个成员,当 DFM位为 1时,发送描述符由 8个描述符字 TDES0-TDES7组成(增强描述符),也就是我们的结构体有8个成员。同样的,当 DFM位为 0时,接收描述符由四个描述符字 RDES0-RDES3组成,当 DFM位为 1时,接收描述符由 8个描述符字 RDES0-RDES7组成。描述符的结构如下图所示

在这里插入图片描述

​ 常规TXDMA描述符

在这里插入图片描述

												增强TXDMA发送描述符

在这里插入图片描述

​ 常规RXDMA描述符

在这里插入图片描述

​ 增强RXDMA描述符

​ 在常规描述符,如果描述符列表的结构为链结构,那么TDES和RDES3中的内容为下一个描述符的地址,如果是环结构,则存放的是缓存区2的地址,因此当描述符列表的结构为链结构的时候,一个描述符对应一个缓存;如果描述符结构是环结构的时候,一个描述符对应两个缓存。

​ 在创建完描述符列表后,需要将描述符列表的首地址存储在相应寄存器中,DMA通过首地址一个一个去查看描述符。对于环结构的描述符列表,描述符的地址关系如下:

下个描述符地址 = 当前描述符地址 + 16 + DPSL * 4 这是常规描述符

下个描述符地址 = 当前描述符地址 + 32 + DPSL * 4 这是增强描述符

DPSL表示描述符跳跃长度,也就是两个描述符之间的间隔,一般都是相邻的,值为0,在ENET_DMA_BCTL中设置。

​ 发送帧处理:发送数据时,CPU需要将发送数据打包封装成以太网数据帧,放置在缓存区;然后设置TXDMA的描述符,在TDES0中,一般需要设置FSG、LSG,这两个表示帧头与帧尾,因为有时候设置的缓存区太小,一个缓存区存不下一帧数据,数据就会被分散在多个缓存区中,FSG置位,表示当前描述符指向的缓存帧为帧头,LSG置为表示当前描述符指向的缓存帧为帧尾。一般我们设置的缓存帧都是足够大的(一帧以太网数据需要的缓存大概1518左右,不同标准可能有些差别),所以FSG、LSG会同时置位。CPU将描述符TDES0的DAV位为1,DMA查询到DAV为1,就将数据传输到TXFIFO中进行发送;如果查询的描述符中DAV为0,则说明数据还没准备好,DMA会先挂起,发送的时候需要软件向ENET_DMA_TPEN中写入任意数据恢复DMA。

​ 接收帧处理:接收数据时,RXDMA会将RDES0中的FDES和LDES置位,表示一帧的帧头和帧尾,一般我们申请的缓存大小都可以完整的存储一个以太网帧的数据,所以FDES和LDES同时置位。RXDMA将RDES0的 DAV置0,表示CPU可以对该描述符所指向的地址进行操作。ENET_DMA_STAT寄存器中的 RS位将置位,如果使能了接收中断,则会触发中断,用户可以在通过中断来读取相应的数据。当接收到一个新的数据时,如果描述符的 DAV位为 ’ 则 DMA控制器进入挂起状态,需要软件向ENET_DMA_RPEN中写入任意数据恢复DMA。

4、以太网配置流程

  1. 使能以太网时钟(HCLK、以太网收发时钟)
  2. 配置通讯接口:配置 SYSCFG模块,选择接口模式 MII或 RMII,配置GPIO
  3. 等待复位完成:轮询ENET_DMA_BCTL寄存器直到 SWR位复位( SWR位在上电复位后或系统复位后默认置位) 。
  4. 获取并配置 PHY寄存器参数(如全双工、半双工、速率等),速度等等)。根据外部 PHY支持的模式,配置ENET_MAC_CFG寄存器使与 PHY寄存器信息一致 。
  5. 初始化以太网的DMA模块,完成 DMA模块初始化。
  6. 初始化用于存放描述符列表以及数据缓存的物理内存空间,将列表首地址写入ENET_DMA_RDTADDR和 ENET_DMA_TDTADDR寄存器中的地址,初始化发送描述符的DAV为0,接收描述符的DAV为1。
  7. 使能MAC和DMA模块开始发送和接收:置位ENET_MAC_CFG寄存器中的 TEN和 REN位,开启 MAC发送器和接收器。置位ENET_DMA_CTL寄存器中的 STE位和 SRE位,使能 DMA的 发送和 接收。
  8. 发送流程:获取发送描述符,打包数据写入描述符指向的缓存中,置位DAV,写入任意值到 ENET_DMA_TPEN寄存器中,使 TxDMA退出挂起模式,开始发送数据。如需等待数据发送完毕,有两种方法来确定当前帧是否发送完毕。第一种方法为轮询当前描述符的 DAV位直到其复位;第二种方法仅适用于当 INTC位为 1的况,应用程序可以轮询ENET_DMA_STAT寄存器的 TS位直到其置位。
  9. 接收流程:轮询方式:轮询查看描述符列表中的第一个接收描述符(其地址在 ENET_DMA_RDTADDR寄存器中配置);如果 RDES0的 DAV位复位,则说明描述符已被使用过,且接收缓存空间已存储了接收帧,处理接收帧数据;置位当前描述符的 DAV位,以复用当前描述符接收新的帧;继续查看列表中的下一个描述符。中断方式:在中断函数中,首先判断ENET_DMA_STAT中的RS是否置位,如果置位,则说明时接收完成中断,可以读取数据,读取数据后置位当前描述符的 DAV位,以复用当前描述符接收新的帧;两种接收方式在读取数据的过程中可以顺便检测一下DMA是否挂起了,如果挂起了就恢复一下。

5、其他

​ 发送帧格式:一个正常的发送帧应该由以下及部分构成:前导码,帧首界定码SFD,目标地址 DA,源地址 SA QTAG前缀(可选),长度 /类型域 LT,数据 PAD填充域(可选),和帧校验序列 FCS。前导码和帧首界定码都是由MAC自动生成的,因此应用程序只需要存储目标地址,源地址,(若需要),长度 /类型,数据,填充域(若需要),帧校验序列(若需要)。DPAD位和 DCRC位用于配置填充位和帧校验序列的自动生成。

​ 帧接收:MAC接收到的帧都会被送入RxFIFO中。MAC接收到帧后会剥离其前导码和帧首界定码,并从帧首界定码后的第一个字节(目标地址)开始向FIFO发送帧数据。

​ TXFIFO转发机制:在直通模式 Cut-Through 下,当 FIFO中的数据等于或超过了所设置的阈值时(或者在达到阈值之前写入了 EOF),数据会从 FIFO中取出并送入到 MAC控制器中。这个阈值可以通过 ENET_DMA_CTL寄存器的 TTHC位来设置;在存储转发模式 Store-and-Forward 下,只有当一 个完整的帧写入 FIFO之后, FIFO中的数据才会被送入 MAC控制器。但还有一种情况下,帧没有被完整写入 FIFO FIFO也会取出数据。这种情况为 TxFIFO的大小小于要发送的 以太网帧长度,那么在 TxFIFO即将全满时,数据会被送入到 MAC控制器。

​ RXFIFO转发机制:RxFIFO工作于直通模式时,如果 FIFO中的数据量大于门限值(可通过 ENET_DMA_CTL寄存器的 RTHC位设置),就开始从 FIFO中取出数据,并通知 DMA接收。当RxFIFO工作于存储转发模式(通过 ENET_DMA_CTL寄存器的 RSFD位设置)时, DMA只在RxFIFO完整地收到一帧后,才将其读出。此模式下,如果 MAC设置成将所有错误帧丢弃,那么 DMA只会读出合法的帧,并转发给应用程序。一旦

寄存器的 RSFD位设置)时, DMA只在RxFIFO完整地收到一帧后,才将其读出。此模式下,如果 MAC设置成将所有错误帧丢弃,那么 DMA只会读出合法的帧,并转发给应用程序。一旦

​ TDES0中有两种校验:一种是插入IP包头中的校验和校验,一种是以太网帧尾的CRC校验。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/402669.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一个C#开发的开源的快速启动工具

更多开源项目请查看:一个专注推荐.Net开源项目的榜单 平常计算机安装软件比较多、或者工作涉及的文件比较多,很多人都会直接放在桌面,一方面不安全,还不容易查找,这时候我们往往,都会放在其他硬盘内&#x…

springboot项目yml文件中${}的使用

作用 项目启动时可以灵活的通过修改环境变量来替换配置中的值,如果没有传该环境变量时,就是用默认值; 格式:${自定义参数名:默认值} 代码举例,已开启应用的端口号为例: server:port: ${SERVER_PORT:960…

AI+人类,实现高效网络安全

导语 聊天机器人和生成式人工智能(如 ChatGPT)突然成为主流让很多人感到担忧。很多人开始担忧,人工智能取代人的时代已经到来。 幸运的是,事实并非如此。 更有可能的情况是,人类将与 AI 合作创建工作角色的混合模型。…

Mercedes-Benz EDI需求分析

作为奔驰的仓储服务提供商,企业A需要借助EDI实现仓储流程的自动化。奔驰将车存放在企业A处,由企业A将货物提供给4S店。整体业务流程中将通过EDI系统来进行业务数据的传输,今天的文章主要从奔驰EDI需求概览以及EDI项目业务流程两方面展开介绍。…

646. 最长数对链——【Leetcode每日刷题】

646. 最长数对链 给你一个由 n 个数对组成的数对数组 pairs &#xff0c;其中 pairs[i][lefti,righti]pairs[i] [left_i, right_i]pairs[i][lefti​,righti​] 且lefti<rightileft_i < right_ilefti​<righti​。 现在&#xff0c;我们定义一种 跟随 关系&#xff…

MySQL查询索引原则

文章目录 等值匹配原则最左前缀匹配原则范围查找规则等值匹配+范围查找Order By + limit 优化分组查询优化总结MySQL 是如何帮我们维护非主键索引的等值匹配原则 我们现在已经知道了如果是【主键索引】,在插入数据的时候是根据主键的顺序依次往后排列的,一个数据页不够就会分…

保姆级使用PyTorch训练与评估自己的MobileViT网络教程

文章目录前言0. 环境搭建&快速开始1. 数据集制作1.1 标签文件制作1.2 数据集划分1.3 数据集信息文件制作2. 修改参数文件3. 训练4. 评估5. 其他教程前言 项目地址&#xff1a;https://github.com/Fafa-DL/Awesome-Backbones 操作教程&#xff1a;https://www.bilibili.co…

2023最新ELK日志平台(elasticsearch+logstash+kibana)搭建

去年公司由于不断发展&#xff0c;内部自研系统越来越多&#xff0c;所以后来搭建了一个日志收集平台&#xff0c;并将日志收集功能以二方包形式引入自研系统&#xff0c;避免每个自研系统都要建立一套自己的日志模块&#xff0c;节约了开发时间&#xff0c;管理起来也更加容易…

【UE4 RTS游戏】07-控件蓝图显示当前游戏时间

效果步骤新建一个文件夹&#xff0c;命名为“Interfaces”&#xff0c;在该文件夹内新建一个蓝图接口&#xff0c;命名为“I_HUD”打开“Interfaces”&#xff0c;默认的函数名改为“SetClock”&#xff0c;添加一个输入&#xff0c;命名为“Time”&#xff0c;整数数组类型。添…

一套Java语言的云HIS医院信息管理系统SaaS源码

这是一套优秀的云His医院管理系统&#xff0c;它区别于普通的HIS系统&#xff0c;它通过云端管理整个HIS业务 一、HIS使用技术框架&#xff1a;自主研发&#xff0c;系统完全开源。 1、前端&#xff1a;AngularNginx 2、后台&#xff1a;JavaSpring&#xff0c;SpringBoot&…

AidLux AI 应用案例悬赏选题|行车安全辅助

AidLux AI 应用案例悬赏征集活动 AidLux AI 应用案例悬赏征集活动是AidLux推出的AI应用案例项目合作模式&#xff0c;悬赏选题将会持续更新。目前上新的选题涉及泛边缘、机器人、工业检测、车载等领域&#xff0c;内容涵盖智慧零售、智慧社区、智慧交通、智慧农业、智能家居等…

YOLOv5中添加SE模块详解——原理+代码

目录一、SENet1. 设计原理2. SE Block2.1 Squeeze:Global Information Embedding2.2 Excitation:Adaptive Recalibration3. SE-Inception and SE-ResNet二、YOLOv5中添加SENet1.修改common.py2.修改yolo.py3.修改yolov5s.yaml参考文章一、SENet 论文地址&#xff1a;Squeeze-a…

UI设计 ,这7个网站,真的太好用了。

下面这几个UI设计网站&#xff0c;设计师们一定要收藏起来&#xff0c;每天坚持浏览这些网站&#xff0c;可以快速的提升你的UI设计水平。 1、菜鸟图库 https://www.sucai999.com/searchlist/UIsheji----all-0-0.html?vNTYxMjky 菜鸟图库提供了超多免费设计素材&#xff0c;在…

logistic回归的参数梯度更新方法的个人理解

logistic回归参数更新看了几篇博文&#xff0c;感觉理解不透彻&#xff0c;所以自己写一下&#xff0c;希望能有更深的理解。logistic回归输入是一个线性函数Wxb\boldsymbol{W}\boldsymbol{x}\boldsymbol{b}Wxb&#xff0c;为了简单理解&#xff0c;考虑batchsize为1的情况。这…

ChatGPT的影响力和未来发展

ChatGPT是一种基于深度学习的自然语言处理技术&#xff0c;它是由OpenAI开发的一种语言模型。ChatGPT作为一个大型语言模型&#xff0c;可以在很多方面对程序职业产生影响。值得注意的是&#xff0c;ChatGPT和其他语言模型一样&#xff0c;只是一种技术工具&#xff0c;它的应用…

Postman 接口传参报错解决与@RequestBody的注解作用记录

文章目录前言一、接口代码1.1 代码说明1.2 测试结果1.3 问题解决1.4 RequestBody 作用前言 记录接口传参报错与解决和RequestBody的作用记录 一、接口代码 1.1 代码说明 以下面测试代码作为例子&#xff1a;前端发送 POST 请求&#xff0c;请求体里面携带 List 集合的字符串…

C++回顾(十九)—— 容器string

19.1 string概述 1、string是STL的字符串类型&#xff0c;通常用来表示字符串。而在使用string之前&#xff0c;字符串通常是 用char * 表示的。string 与char * 都可以用来表示字符串&#xff0c;那么二者有什么区别呢。 2、string和 char * 的比较 &#xff08;1&#xff09…

【wed前端初级课程】第一章 什么是HTML

什么是WEB前端&#xff1f; 简单来说就是网页&#xff0c;只是这个网页它是由多种技术参与制作的&#xff0c;用来向用户展示的页面。 HTML(超文本标签语言)&#xff1a;它决定了网页的结构。 CSS&#xff1a;网页的装饰器。 JavaScript&#xff1a;JavaScrip最初是因为校验…

【Linux系统编程】06:共享内存

共享内存 OVERVIEW共享内存一、文件上锁flock二、共享内存1.关联共享内存ftok2.获取共享内存shmget3.绑定共享内存shmat4.绑定分离shmdt5.控制共享内存shmctl三、亲缘进程间通信1.共享内存写入与读取2.共享内存解绑与删除3.共享内存综合四、非亲缘进程间通信1.通过sleep同步2.通…

Android 进阶——Binder IPC之Native 服务的启动及代理对象的获取详解(六)

文章大纲引言一、Binder线程池的启动1、ProcessState#startThreadPool函数来启动线程池2、IPCThreadState#joinThreadPool 将当前线程进入到线程池中去等待和处理IPC请求二、Service 代理对象的获取1、获取Service Manager 代理对象BpServiceManager2、调用BpServiceManager#ge…