STM32F429 以太网MAC滤波应用说明
STM32F429 以太网MAC滤波应用说明
最近在使用MAC滤波,进行流量控制。默认情况下stm32f429系列以太网能够满足大部分需求。针对需要进行mac滤波的应用可以从以下几个方面进行深度发掘。
1 采用4个完美滤波器
MAC 支持多达 4 个用于单播完美过滤的 MAC 地址。如果选择完美过滤(复位帧过滤寄存器中的 HU 位), MAC 会将接收的单播地址的所有 48 位与编程的 MAC 地址进行比较来确定是否匹配。默认情况下,始终使能 MacAddr0,其它地址 MacAddr1—MacAddr3 则通过单独的使能位进行选择。将其它地址 (MacAddr1—MacAddr3) 的各个字节与接收的相应 DA 字节进行比较时,可以将寄存器中相应的屏蔽字节控制位置 1 来屏蔽该字节。这有助于 DA 的组地址过滤。在散列过滤模式( HU 位置 1)下, MAC 将使用 64 位散列表执行对单播地址的不完美过滤。对于散列过滤, MAC 将使用接收的目标地址的 6 个高 CRC位来索引散列表的内容。值为 000000 时,选取所选寄存器中的位 0;值为 111111 时,选取散列表寄存器中的位 63。如果相应位(由 6 位 CRC 指示)已置 1,将认为单播帧已通过散列过滤,否则认为帧未能通过散列过滤。【STM32F4xx中文参考手册 P843】
上段中的名词说明:
(1)完美过滤——值与MacAddr地址的48bit全部匹配,完美此处是指没有冲突,相较于下面的方式。当然也可以选择屏蔽字节,即只是部分匹配,类似于CAN接收滤波器。
如下代码,可以针对MAC:A4-A3-A2-A1-34-12,进行定点接收。
uint32_t data = EthHandle.Instance->MACA1HR;EthHandle.Instance->MACA1HR = 0x80001234;EthHandle.Instance->MACA1LR = 0xA1A2A3A4;
2 散列过滤模式(hash)
是指利用hash计算(hash概念请自行百度),此处可以理解为一种映射,即多对一,因此肯定存在冲突,此种映射方式是通过CRC32计算的6bit来决定的。48bit通过计算映射到6bit,必然存在冲突。因此滤波是“不完美的”。
例如,如果传入帧的 DA 接收为 0x1F52 419C B6AF( 0x1F 是 MII 接口上接收的第一个字节),则内部计算出的 6 位散列值为 0x2C 且为了过滤要检查 HTH 寄存器位[12]。如果传入帧的 DA 接收为 0xA00A 9800 0045, 则计算出的 6 位散列值为 0x07 且为了过滤要检查HTL 寄存器位[7]。
下面给出hash计算方式(引用自st官网:https://community.st.com/s/question/0D50X00009Xkb6ySAB/calculating-ethernet-multicast-filter-hash-value-),这与手册上的例子是相对应的:
/ STM32 MACHASH - Copyright (C) 2014-2018 Clive Turvey (sourcer32@gmail.com)
// All Rights Reserved#include <windows.h>#include <stdio.h>
#include <stdlib.h>typedef unsigned char uint8_t;
typedef unsigned long uint32_t;uint32_t Rev32(uint32_t x)
{uint32_t y;int i;y = 0;for(i=0; i<32; i++)if (x & (1 << i))y |= 1 << (31 - i);return(y);
}uint32_t MacHash(const uint8_t *Mac) // sourcer32@gmail.com
{int i, j;uint32_t Crc;Crc = 0xFFFFFFFF;for(j=0; j<6; j++){Crc = Crc ^ (uint32_t)Mac[j];for(i=0; i<8; i++)if (Crc & 1)Crc = (Crc >> 1) ^ 0xEDB88320; // Reversed 0x04C11DB7elseCrc = (Crc >> 1);}return(Rev32(~Crc) >> 26); // Get High order 6-bit in reversed/inverted CRC
}uint32_t MacHashFast(const uint8_t *Mac) // sourcer32@gmail.com
{static const uint32_t Rev6Tbl[] = {0x00,0x20,0x10,0x30,0x08,0x28,0x18,0x38,0x04,0x24,0x14,0x34,0x0C,0x2C,0x1C,0x3C,0x02,0x22,0x12,0x32,0x0A,0x2A,0x1A,0x3A,0x06,0x26,0x16,0x36,0x0E,0x2E,0x1E,0x3E,0x01,0x21,0x11,0x31,0x09,0x29,0x19,0x39,0x05,0x25,0x15,0x35,0x0D,0x2D,0x1D,0x3D,0x03,0x23,0x13,0x33,0x0B,0x2B,0x1B,0x3B,0x07,0x27,0x17,0x37,0x0F,0x2F,0x1F,0x3F };static const uint32_t Crc32Tbl[] = {0x4DBDF21C, 0x500AE278, 0x76D3D2D4, 0x6B64C2B0,0x3B61B38C, 0x26D6A3E8, 0x000F9344, 0x1DB88320,0xA005713C, 0xBDB26158, 0x9B6B51F4, 0x86DC4190,0xD6D930AC, 0xCB6E20C8, 0xEDB71064, 0xF0000000 };int i;uint32_t Crc;Crc = 0;for(i=0; i<6; i++){Crc = Crc ^ (uint32_t)Mac[i];Crc = (Crc >> 4) ^ Crc32Tbl[Crc & 0x0F]; /* lower nibble */Crc = (Crc >> 4) ^ Crc32Tbl[Crc & 0x0F]; /* upper nibble */}return(Rev6Tbl[Crc & 0x3F]);
}int main(int argc, char **argv)
{static const uint8_t Test1[] = { 0x1F, 0x52, 0x41, 0x9C, 0xB6, 0xAF }; // 0x2Cstatic const uint8_t Test2[] = { 0xA0, 0x0A, 0x98, 0x00, 0x00, 0x45 }; // 0x07static const uint8_t Test3[] = { 0x01, 0x00, 0x5e, 0x00, 0x00, 0x21 }; // 0x24printf("MacHash %02X\n", MacHash(Test1));printf("MacHash %02X\n", MacHash(Test2));printf("MacHash %02X\n", MacHash(Test3));printf("MacHashFast %02X\n", MacHashFast(Test1));printf("MacHashFast %02X\n", MacHashFast(Test2));printf("MacHashFast %02X\n", MacHashFast(Test3));return(1);
}
提前计算好MAC地址的分布情况,针对的设置hash滤波参数,可以大为减去软件负荷。
3.接收所有帧
通过如下设置可以接收网络中的所有mac数据。没有任何过滤操作。
uint32_t data = EthHandle.Instance->MACFFR;EthHandle.Instance->MACFFR = data | 0x80000000;
STM32F429 以太网MAC滤波应用说明相关推荐
- Android5.1修改以太网MAC地址(SElinux)【转】
本文转载自:http://blog.csdn.net/LoongEmbedded/article/details/71477203 最近高通平台Android5.1项目中有个关于设置以太网MAC的需求 ...
- Android5.1修改以太网MAC地址(SElinux)
点击打开链接 最近高通平台Android5.1项目中有个关于设置以太网MAC的需求,大致流程是windows写到一块flash片区去保存序列号和以太网MAC地址,然后Android客户端通过相关接口去 ...
- 太网设计FAQ:以太网MAC和PHY
问:如何实现单片以太网微控制器? 答:诀窍是将微控制器.以太网媒体接入控制器(MAC)和物理接口收发器(PHY)整合进同一芯片,这样能去掉许多外接元器件.这种方案可使MAC和PHY实现很好的匹配,同时 ...
- 【计算机网络】数据链路层 : 以太网 ( 无连接、不可靠服务 | 以太网发展 | 10BASE-T 以太网 | MAC 地址 | 以太网 MAC 帧 | 高速以太网 )
文章目录 一. 以太网 ( Ethernet ) 概述 二. 以太网 ( Ethernet ) 服务 三. 以太网 ( Ethernet ) 发展 四. 10BASE-T 以太网 五. 适配器 与 M ...
- RV1126 Linux 以太网MAC PHY 芯片8201f gmac dts配置
RK 系列的 SoC 中内置了以太网 MAC 控制器,所以只需要搭配一颗以太网 PHY芯片, 即可实现以太网卡功能. 按照规范, 即使是不同厂家的 PHY,同样有一部分寄 存器的定义是通用的, 只要配 ...
- 图解通信原理与案例分析-35:以太网MAC层的通信原理--MAC帧格式与调度策略:载波侦听与冲突检测CSMA/CD、载波侦听与冲突避免(信道空闲保证)CSMA/CA、流控
以太网协议已经是非常成熟的通信技术,本文旨在在汇总以太网MAC层的协议,以便于与其他通信技术的MAC层作为比较,如4G LTE, 5G NR,特别是LTE在非授权频谱上的通信LAA LBT, 就是借鉴 ...
- 以太网MAC地址组成与交换机
目录 一,数据链路层 二,以太网格式 三,交换机的工作原理 交换机以太网接口的工作模式 交换机以太网接口速率 四,交换机基本命令 一,数据链路层 功能: 数据链路的建立,建立与拆除 帧包装,帧传输,帧 ...
- 以太网MAC控制器与PHY接口的通信方式总结
GMAC:MAC控制器 PHY:OSI模型物理层 GMAC与PHY接口支持四种模式:MII.GMII.RMII.RGMII MII: 支持lOMb/s和100Mh/s的数据速率: 100M工作模 ...
- pcs层到mac层_5.5.3 万兆以太网MAC子层
5.5.3 万兆以太网MAC子层 应用于局域网的万兆以太网的MAC子层与千兆以太网的MAC子层的帧格式基本一样(参见图5-17),但不再支持CSMA/CD介质控制方式,只允许进行全双工传输.这就意味 ...
最新文章
- python怎么设置字段_Django Model中字段(field)的各种选项说明
- Django框架之跨站请求伪造
- Js中的数据属性和访问器属性
- 利用koa实现mongodb数据库的增删改查
- java local_java.time.LocalDateTime with()方法
- 窗体的布局 1124
- qtcpsocket断开_2020-05-06 QT子线程使用QTcpSocket连接服务器
- STM32F103:一.(2)STLINK的配置
- “MapReduce: Simplified Data Processing on Large Clusters”
- 洛谷题解 P1005 【矩阵取数游戏】
- (转)style,currentStyle,getComputedStyle的区别和用法
- 南方cass计算表面积_CASS在工程中的应用“计算表面积”的方法
- 令牌桶(Token Bucket)
- 图像美学质量评价技术综述
- 倒车轨迹理论实现方法
- 关于GX WORKS2中M8002、M8012、M8013无法使用的问题
- 微信退款服务器系统失败怎么办,微信退款多久到账?微信退款不成功怎么办?...
- 在线ico图标制作、python代码实现ico格式转换
- armv6 可以通过什么方式检查内存泄露?
- My97DatePicker默认赋值