STM32 以太网 ETH模块说明
1.overview
2.ETH module in stm32h743
STM32H743 为例
开局一张图 ETHER 模块 红框所示 以STM32H743为例
32 BIt AHB为内部高速总线 D2 域,Master为可以发起读写。AHB总线在STM32 H743的最高速率 为240MHz。
对外接口为MII/RMII
开局第二张图
Ethernet high-level block diagram
Eth_hclk ETH 模块的时钟源
DMA Arb 对模块外部 AHB Master可以主动发起数据的读写。对内连接 两个专用DMA (数据发送DMA,数据接收DMA)其分别连接 Tx,Rx FIFO (深度为2K)。FIFO连接两个对外数据寄存器 MAC Tx,MAC Rx ,对外用RMII/MII 对外引脚输出连接PYH。
AHB Slave 不可发起读写,CPU通过AHB Slave接口配置CRS控制寄存器控制整个ETH。
1.总线接口 ,用作数据传输。Master 用于DMA数据的 搬移,Slave 用于CPU对状态寄存器的读写。
2.DMA
3.MTL 缓存FIFO
4.MAC 以太网MAC协议处理
5.RMII,MII接口
开机第三张图 STM32 ETH模块主要实现MAC层
MAC数据包格式
IEEE 对以太网上传输的数据包格式也进行了统一规定,该数据包被称为 MAC 数据包。
MAC 数据包由前导字段、帧起始定界符、目标地址、源地址、数据包类型、数据域、填充域、校验和域组成。
前导字段,也称报头,这是一段方波,用于使收发节点的时钟同步。内容为连续 7 个字节,的 0x55。字段和帧起始定界符在 MAC 收到数据包后会自动过滤掉。
• 帧起始定界符 (SFD):用于区分前导段与数据段的,内容为 0xD5
• MAC 地址: MAC 地址由 48 位数字组成,它是网卡的物理地址,在以太网传输的最底层,就是根据 MAC 地址来收发数据的。部分 MAC 地址用于广播和多播,在同一个网络里不能有两个相同的 MAC 地址。 PC 的网卡在出厂时已经设置好了 MAC 地址,但也可以通过一些软件来进行修改,在嵌入式的以太网控制器中可由程序进行配置。数据包中的 DA 是目标地址, SA 是源地址。
• 数据包类型:本区域可以用来描述本 MAC 数据包是属于 TCP/IP 协议层的 IP 包、 ARP 包还是 SNMP 包,也可以用来描述本 MAC 数据包数据段的长度。如果该值被设置大于 0x0600,不用于长度描述,而是用于类型描述功能,表示与以太网帧相关的 MAC 客户端协议的种类。
• 数据段:数据段是 MAC 包的核心内容,它包含的数据来自 MAC 的上层。其长度可以从0~1500 字节间变化。
• 数据段:数据段是 MAC 包的核心内容,它包含的数据来自 MAC 的上层。其长度可以从0~1500 字节间变化。
• 填充域:由于协议要求整个 MAC 数据包的长度至少为 64 字节 (接收到的数据包如果少于64 字节会被认为发生冲突,数据包被自动丢弃),当数据段的字节少于 46 字节时,在填充域会自动填上无效数据,以使数据包符合长度要求。
• 校验和域: MAC 数据包的尾部是校验和域,它保存了 CRC 校验序列,用于检错。
MII 和 RMII 接口 ETH 对外接口连接PHY芯片实现物理层传输
图四
PHY:示例 LAN8720A
图五
高度抽象图如下
模块抽象图如下
最左边主要是RMII接口对接MCU实现数据的输入,以及LAN8720 寄存器配置端口MDC,MDIO
最右边是PHY输出(网线电平输出)
中间三大模块 RMII逻辑接口,接收模块,发送模块。要以一定的抽象视角。
一般封装方式,小巧,引脚少
如下所示
2. ETH Mode in STM32H743
eth_hclk Digital input AHB clock
eth_sbd_intr_it Digital output Main Ethernet interrupt
lpi_intr_o Digital output Sideband signal generated when the transmitter or receiver enters or exits the LPI state.
pmt_intr_o Digital output Sideband signal generated when a valid remote wakeup packet is received
eth_mii_tx_clk Digital input MII Tx kernel clock
eth_mii_rx_clk Digital input MII Rx kernel clock
eth_rmii_ref_clk Digital input RMII reference kernel clock
eth_ptp_pps_out Digital output PTP pulse-per-second signal
以太网外设由 4 个主要功能模块组成:
1 控制和状态寄存器模块 (CSR),用于控制通过 AHB 32 位从接口进行的寄存器访问
2直接存储器访问接口 (DMA)
此为逻辑 DMA 模块,具有 1 条用于接收的物理通道和 1 条用于发送的物理通道。该模
块用于控制通过 AMBA AHB 32 位主接口在 MAC 和系统存储器之间进行的数据传输。
3介质访问控制模块 (MAC),负责实现以太网协议MAC 事务层 (MTL),负责控制应用和 MAC 之间的数据流
DMA 具有独立的发送 (Tx) 和接收 (Rx) 引擎。 Tx 引擎将数据从系统存储器传输到 MAC 事务层 (MTL),而 Rx 引擎将数据从设备端口 (PHY) 传输到系统存储器。
以太网传输数据量大速度快,这种条件下不适合CPU的干预,DMA在以太网传输中为必须选择。因此ETH模块有自带的专用以太网DMA模块。DMA模块负责数据搬运,所以根据以太网传输数据特点特别设计的DAM。
DMA将MAC接收到的数据包传输到系统内存中的Rx缓冲区,将Tx数据包从系统内存中的Tx缓冲区中传输出去。驻留在系统内存中的描述符包含指向这些缓冲区的指针。
DMA 的数据结构 描述符 descriptors
The base address of each list is written to the respective Tx and Rx registers: Channel Txdescriptor list address register (ETH_DMACTXDLAR)) and Channel Rx descriptor listaddress register (ETH_DMACRXDLAR))
descriptor 是一个固定格式的数据,需要确定descriptor list 列表长度
DMA 处理完列表中的最后一个描述符后,会自动跳转回列表地址寄存器中的起始描述符,以形成一个描述符环。
描述符列表位于应用的物理存储地址空间内。每个描述符最多可指向两个缓冲区。因此,可使用并以物理方式寻址两个缓冲区,而非存储器中的连续缓冲区。
所指向的缓存区(BUFFER1、2) 都是在应用程序当中。大小不会超过一包数据 。缓冲区只包含数据。缓冲区状态保存在描述符中。
每个正常描述符均包含两个缓冲区和两个地址指针。
descriptors 间的地址间距,descriptors数量都有相应的寄存器
descriptors 尾指针寄存器表示 descriptors N DMA 会依次增加到tail指针。其实地址和tail 中间的descriptors 是DMA访问的区间。
上图所示
base address 为descriptors 起始地址。 tail为DMA自动+1 的末尾地址。当前descriptors 指针表示当下时刻所使用的descriptors 。
当下descriptors 如果和尾指针相当,那么DMA不会执行+1,处于阻塞状态Current Descriptor Pointer == Descriptor Tail Pointer;,应为还未到Length (descriptors list 长度)所以不会跳回到起始地址。通过该表尾指针的位置就可以解除阻塞。Current Descriptor Pointer < Descriptor Tail Pointer;
对于一个发送数据包,以太网外设 DMA 至少需要一个descriptors。除了两个缓冲区、两个字节计数缓冲区和两个地址指针之外,发送描述符还具有控制字段,此类字段可用于按发送数据包来管理 MAC 操作。
descriptors 数据结构有很多种
分为TX,RX 写,读 具体参考手册描述。
其作用是对发送数据包的信息进行记录。
MAC 事务层 (MTL) 提供 FIFO 存储器接口,来缓冲和调整应用系统存储器和 MAC 之间的数据包。它还可以在应用时钟和 MAC 时钟域之间实现数据传输。 MTL 层具有两个 32 位宽的数据路径:发送路径和接收路径。
发送路径
应用或内部 DMA 将从应用或系统存储器中读取的以太网数据包推入到 Tx FIFO。当达到队列阈值(阈值模式)或完整数据包处于队列中(存储转发模式)时,相应数据包将弹出并传输到 MAC。发送 EOP 后,将从 MAC 获取发送状态并传送回应用或内部DMA。 Tx 队列大小为 2048 个字节。
接收路径
MTL Rx 模块从 MAC 接收数据包,并将其推入 Rx 队列。当队列超出配置的接收阈值( Rx 队列工作模式寄存器 (ETH_MTLRxQOMR) 中定义的 RTC 位 [1:0])时,或者在接收到完整数据包后,会将队列的状态(填充级别)报告给应用或 DMA。 MTL 还指示队列填充级别,以便 DMA 可向主接口发起预配置的突发传输。 Rx 队列大小为 2048 个字节。
MAC 负责以太网协议处理。在发送模式下,它从 MTL 接收数据,然后再将其传送到 PHY接口。在接收模式下, MAC 从 PHY 接口接收数据,然后再将其传送到 MTL 模块的 RxFIFO。
MAC transmission MAC数据传输时序
发送序列如下:
MAC reception MAC层数据接收
当 MAC 在 MII 上检测到 SFD 时,将启动接收操作。 MAC 将去除报头和 SFD,然后再继续处理数据包。检查报头字段以进行过滤, FCS 字段用于验证数据包的 CRC。接收的数据包存储在浅缓冲区中,直到执行地址过滤。如果数据包未通过地址过滤器,则会在 MAC 中将其丢弃。
接收序列如下:
MII 的接收数据有效信号 (RxDV) 激活时,接收状态机 (RSM) 开始寻找 SFD 字段( MII模式下的 0xD 半字节)。
状态机会丢弃接收到的数据包,直至检测到 SFD。
检测到 SFD 时,状态机开始向 RPC 模块发送以太网数据包的数据,从 SFD 之后的第一个字节(目标地址)开始发送。
如果使能了 IEEE 1588 时间戳功能,则在 MII 上检测到任何数据包的 SFD 时, MAC 都
将获取系统时间的快照。如果在 MAC 过滤期间该数据包未被丢弃,则时间戳将传递给应用程序。 MAC 将接收到的半字节数据转换成字节,并将有效数据包数据转发到 RFC模块。
接收状态机对正在接收的以太网数据包的长度/类型字段进行解码。如果长度/类型字段小于 1,536 并且为 MAC 编程了自动去除 CRC/Pad( 工作模式配置寄存器 (ETH_MACCR) 的位 20),则状态机将发送数据包数据(数据量不超过长度/类型字段中指定的数量),然后开始丢弃字节(包括 FCS 字段)。状态机对长度/类型字段进行解码并检查长度解析。
当长度/类型字段大于或等于 1,536 时,如果尚未使能工作模式配置寄存器 (ETH_MACCR)位 21 中的类型数据包的 CRC 去除,则 RPE 模块会将所有接收到的以太网数据包数据发送到 RFC 模块。不过,如果已使能类型数据包的 CRC 去除,但未使能接收校验和减
荷引擎,则 MAC 将去除并丢弃所有以太类型数据包的最后 4 个字节,然后将数据包转发到应用程序。
默认情况下,将 MAC 编程为使能看门狗定时器,即在 RPE 模块中会切断大于 2,048(如果使能巨型数据包,则为 10,240)字节的数据包(DA + SA + LT + 数据 + PAD + FCS)。此外,还可以使用可编程看门狗定时器(看门狗超时寄存器 (ETH_MACWTR) 的位 16)
覆盖 2,048 或 10,240 字节的固定超时。 可通过编程工作模式配置寄存器 (ETH_MACCR)的位 19 来禁止看门狗定时器。但是,即使禁止看门狗定时器,也仍将切断大于 32 KB的数据包并给出看门狗超时状态
内容很多 具体参考数据手册
数据包过滤
MAC 支持对 Rx 数据包进行以下类型的过滤:
MAC 源地址或目标地址过滤:地址过滤模块 (AFM) 检查每个传入数据包的源地址和目标地址字段。
VLAN 过滤: MAC 支持基于 VLAN 标记的过滤和 VLAN 散列过滤。
第 3 层和第 4 层过滤:第 3 层过滤是指 IP 源地址和目标地址过滤。第 4 层过滤是指源端口和目标端口过滤。
IEEE 1588 时间戳
IEEE 1588 标准定义了精密时间协议 (PTP),此协议支持使用网络通信、局域计算和分布式对象等技术实现的测量和控制系统中的精密时钟同步。 PTP 适用于利用支持多播消息传送的局域网(包括但不限于以太网)进行通信的系统。该协议可对非均匀系统进行同步,这类系
统包含固有精度、分辨率和稳定性都不断变化的时钟。该协议支持亚微秒范围的系统级同步精度,并且需要极少的网络和本地时钟计算资源。以太网外设支持 IEEE 1588-2002(版本 1)和 IEEE 1588-2008(版本 2)。 IEEE 1588-2002支持通过 UDP/IP 传送的 PTP。 IEEE 1588 2008 支持通过以太网传送的 PTP。外设为这两种标准提供了可编程支持。它支持下列功能:
支持两种时间戳格式
可获取所有数据包或仅 PTP 型数据包的快照
可获取仅事件消息的快照
可基于时钟类型获取快照:普通、边界、端对端透明和点对点透明
可将节点选作普通和边界时钟的主节点或从节点
识别数据包中直接通过以太网发送的 PTP 消息类型、版本和 PTP 有效负载,并发送状态
支持数字或二进制格式的测量亚秒级时间
MAC 可由于各种事件而生成中断。这些中断事件与 DMA 中的事件结合用于 eth_sbd_intr_it信号。 MAC 中断为电平型中断,即在被应用程序或软件清除之前始终保持有效(高电平)。中断状态寄存器 (ETH_MACISR) 介绍了可能导致 MAC 生成中断的事件。默认情况下 MAC
中断处于使能状态。可通过将中断使能寄存器 (ETH_MACIER) 中的相应屏蔽位置 1,以阻止各个事件将 eth_sbd_intr_it 信号中断置为有效。中断寄存器位仅指示报告事件的模块。必须读取相应的状态寄存器和其他寄存器才能清除中断。
LAN8720 满足MAC 的RMII接口的需求
引脚定义如上图所示
具体功能定义入上图所示
发送数据流
Ext Ref clk 为外部时钟对于MCU(MAC)和PHY来说,外部时钟同时给这两部分提供时钟源。
RMII接口TX 为2Bit 通过RMII接口传输到 4B/5B 编码器 50Mhz 双线2bit接口 传输4bit数据需要两个时钟周期所以 4bit 数据频率为 50/2=25MHz。
接收过程如上所示。