STM32H750XBH6的ETH模块的流控功能分析

根据图1中的维基百科上面的描述,以太网流控是当接收端来不及接收发送端发送过来的数据的时候,让发送端暂停发送数据以免接收端数据丢失的一种机制。似乎还分为了两种:

  • 在 I E E E 802.3 x IEEE\quad 802.3x IEEE802.3x标准中定义,接收端通过发送暂停帧来停止发送端的发送,这里发送端会停止所有数据帧的发送。
  • 在 I E E E 802.1 Q b b IEEE\quad 802.1Qbb IEEE802.1Qbb标准中定义。是对上一种流控的升级,可以选择性的停止特定数据帧的发送。 S T M 32 H 750 X B H 6 STM32H750XBH6 STM32H750XBH6的ETH模块的用户手册中有提到,如图2所示,但是在寄存器中似乎没有相关的功能位且在 S T M 32 H 750 X B H 6 STM32H750XBH6 STM32H750XBH6的ETH模块的用户手册的流控章节中也没有提到,如图3所示,因此好像是不支持该功能。


图1.
 
图2.
 
图3.

在 S T M 32 H 750 X B H 6 STM32H750XBH6 STM32H750XBH6的ETH模块中对于 I E E E 802.3 x IEEE\quad 802.3x IEEE802.3x标准的流控分为发送方和接收方,发送方相关功能位主要在图4中的寄存器, T F E TFE TFE位是发送方流控的开关位, F C B _ B P A FCB\_BPA FCB_BPA位在全双工模式下置1后触发暂停帧的发送,在半双工模式下使能 b a c k p r e s s u r e backpressure backpressure,按照图5的说法当接收方想停止接收数据包的时候,接收方会 w h e n i t s e n s e s a p a c k e t r e c e p t i o n when\quad it\quad senses\quad a\quad packet\quad reception whenitsensesapacketreception发送一个 J A M p a t t e r n JAM\quad pattern JAMpattern来构造碰撞的场景来使得发送方停止发送数据,图6中的《计算机网络(第8版)》的谢希仁版本中也有差不多的介绍。这里有一个问题是(虽然我现在暂时还不是太懂)感觉应该是硬件自动检测接收 B U F F E R BUFFER BUFFER或 F I F O FIFO FIFO里面当前数据的多少,当快要满的时候自动发送相应的暂停帧。但是目前根据这里的手册在全双工的时候,需要软件使能图4中的第0个比特位来发送一个暂停帧,但是图4中的第4到第6个比特位似乎是用来配置软件使能图4中的第0个比特位来发送第一个暂停帧后是否发送后续暂停帧的条件,也就是在发送第一个暂停帧后经过多长的时间后再次检查接收 B U F F E R BUFFER BUFFER或 F I F O FIFO FIFO,如果空间还是不太够的话,硬件就自动再次发送一个暂停帧,此时不需要软件使能图4中的第0个比特位,(该功能具体的配置我现在还不是太懂)。图4中的第16到第31个比特位的值表示暂停帧中,具体的时间值,单位是当前速率下发送512个比特所需的时间(在 10 M 10M 10M的速率下,发送512个比特所需的时间是 51.2 u s 51.2us 51.2us,假设图4中的第16到第31个比特位的值为60000,那么应该暂停的时间是 51.2 × 60 m s = 3072 m s 51.2\times 60ms=3072ms 51.2×60ms=3072ms)。图4中的第7个比特位默认值为0,这时假设暂停的时间还没有到且硬件自动检测接收 B U F F E R BUFFER BUFFER或 F I F O FIFO FIFO里面已经有了足够的空间的时候硬件会自动发送暂停时间值为0的暂停帧来通知发送方可以发送数据了(这个功能还不知道怎么配置)。

图4.
 
图5.
 
图6.

在 S T M 32 H 750 X B H 6 STM32H750XBH6 STM32H750XBH6的ETH模块中对于 I E E E 802.3 x IEEE\quad 802.3x IEEE802.3x标准的接收方的流控的配置主要在图7中的寄存器,这里就两个比特位,第0个比特位是接收方流控的使能位,前面说过 S T M 32 H 750 X B H 6 STM32H750XBH6 STM32H750XBH6的ETH模块似乎不支持基于优先级的流控,也就是 I E E E 802.1 Q b b IEEE\quad 802.1Qbb IEEE802.1Qbb标准规定的流控,但是图7中蓝色的字似乎又说明了是支持的(里面说到 W h e n P F C i s e n a b l e d When \quad PFC\quad is\quad enabled WhenPFCisenabled,但是我好像没有找到 P F C PFC PFC的使能位)。第1个比特位置0的时候,接收端仅仅处理目的硬件地址为 0 x 01 _ 80 _ C 2 _ 00 _ 00 _ 01 0x01\_80\_C2\_00\_00\_01 0x01_80_C2_00_00_01的暂停帧,当第1个比特位置1的时候,接收端不仅处理目的硬件地址为 0 x 01 _ 80 _ C 2 _ 00 _ 00 _ 01 0x01\_80\_C2\_00\_00\_01 0x01_80_C2_00_00_01的暂停帧,也处理目的硬件地址和自己硬件地址一样的暂停帧。接收端的流控处理比较简单,接收到暂停帧后,就停止发送数据指定的时间。还有就是接收端的流控只支持全双工模式,半双工模式下无效。
 
图7.

在 S T M 32 H 750 X B H 6 STM32H750XBH6 STM32H750XBH6的ETH模块中对于 I E E E 802.3 x IEEE\quad 802.3x IEEE802.3x标准的暂停帧的格式如图8所示。下面我们用程序来看看流控,这里配置为全双工模式, 10 M 10M 10M速率。流控的相关配置如图9所示。具体的程序如图10所示,这里有两块开发板,一边不断发送数据帧,另一边每隔 3100 m s 3100ms 3100ms通过将图4中的寄存器的第0位置1来触发一个暂停帧,这里暂停帧里面的暂停时间是 3072 m s 3072ms 3072ms,因此发送数据帧的一方每次接收完暂停帧之后只有28ms的时间发送数据帧,因为之后它又会收到暂停帧。这从图11中的篮圈也可以看出来。捕获的暂停帧如图12所示。
 
图8.
 
图9.
 
图10.
 
图11.
 
图12.

S T M 32 H 750 X B H 6 STM32H750XBH6 STM32H750XBH6的ETH模块中对于 I E E E 802.3 x IEEE\quad 802.3x IEEE802.3x标准的半双工流控的代码如图13所示。这里配置为半双工模式, 10 M 10M 10M速率。流控的相关配置如图9所示。这里有两块开发板,一边不断发送数据帧,另一边先将图4中的寄存器的第0位置1(这里和全双工模式不同的是,这里置1之后不会被自动清零),然后延时两秒之后再次用程序把它清零。通过图14中的逻辑分析仪捕获的波形可以看出,一块开发板正常发送了500多ms的数据帧之后就没有正常发送了,因为此时另一边使能了图4中的寄存器的第0位,此时只要检测到RX信号线上有波形似乎就会发送 j a m m i n g s i g n a l jamming\quad signal jammingsignal来产生冲突来使得另一端停止数据帧的发送,过了一段时间将图4中的寄存器的第0位清0之后另一端又开始正常发送了。
 
图13.
 
图14.

S T M 32 H 750 X B H 6 STM32H750XBH6 STM32H750XBH6的ETH模块中对 I E E E 802.1 Q b b IEEE\quad 802.1Qbb IEEE802.1Qbb标准规定的流控好像是不支持的,但是好像又支持,目前还不是太清楚。但是我们还是简单的了解一下基于优先级的流控,参考于这里。其帧格式如图15所示,只是对图8中的帧格式进行了扩展, C o n t r o l o p c o d e Control\quad opcode Controlopcode变成 0 x 0101 0x0101 0x0101, P r i o r i t y e n a b l e v e c t o r Priority\quad enable\quad vector Priorityenablevector,高字节置0,低字节的每个位代表相应的Time[n]是否有效。E[n]代表优先级n,当E[n]为1时,表示Time[n]有效,处理该优先级的数据流,即停止流量发送;当E[n]为0,表示Time[n]无效,忽略该优先级的数据流,即流量不受影响继续发送。Time[n]包含Time[0]至time[7]的8个数组单元,每个数组单元为2字节。当E[n]为0时,Time[n]没有意义。当E[n]为1时,Time[n]代表接收站点抑制优先级为n的报文发送的时间,时间的单位为物理层芯片发送512位数据所需要的时间。使用场景大概如图16所示,详细的可以参考这里
 
图15.
 
图16.

相关推荐
推敲模拟1 小时前
Chapter 2 Linear Regulators
嵌入式硬件
追梦人电立电子2 小时前
硅芯片的神秘世界:7805电压调节器探秘
单片机·嵌入式硬件·追梦人电力电子·7805
ChenYY~3 小时前
手把手教你使用vscode开发stm32!
vscode·stm32·嵌入式·软件开发·学习经验
余生皆假期-7 小时前
硬件基础知识补全【七】MOS 晶体管
单片机·嵌入式硬件
fly的fly8 小时前
RT-Thread消息队列源码机制讲解
c语言·stm32·物联网
隔壁大炮8 小时前
【串口】USART模块的使用方法
单片机·嵌入式硬件·pid·江协科技
小野嵌入式9 小时前
3小时精通嵌入式串口通信!从零玩转ESP32+Modbus+OTA(1)
c语言·单片机·嵌入式硬件·mcu·物联网
钰珠AIOT10 小时前
连接电池的座子2端的电阻只有0.24欧,这个是断路吗,为什么?
单片机·嵌入式硬件·机器人
Hello_Embed11 小时前
Modbus 传感器开发:从寄存器规划到点表设计
笔记·stm32·单片机·学习·modbus