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滤波应用说明相关推荐

  1. Android5.1修改以太网MAC地址(SElinux)【转】

    本文转载自:http://blog.csdn.net/LoongEmbedded/article/details/71477203 最近高通平台Android5.1项目中有个关于设置以太网MAC的需求 ...

  2. Android5.1修改以太网MAC地址(SElinux)

    点击打开链接 最近高通平台Android5.1项目中有个关于设置以太网MAC的需求,大致流程是windows写到一块flash片区去保存序列号和以太网MAC地址,然后Android客户端通过相关接口去 ...

  3. 太网设计FAQ:以太网MAC和PHY

    问:如何实现单片以太网微控制器? 答:诀窍是将微控制器.以太网媒体接入控制器(MAC)和物理接口收发器(PHY)整合进同一芯片,这样能去掉许多外接元器件.这种方案可使MAC和PHY实现很好的匹配,同时 ...

  4. 【计算机网络】数据链路层 : 以太网 ( 无连接、不可靠服务 | 以太网发展 | 10BASE-T 以太网 | MAC 地址 | 以太网 MAC 帧 | 高速以太网 )

    文章目录 一. 以太网 ( Ethernet ) 概述 二. 以太网 ( Ethernet ) 服务 三. 以太网 ( Ethernet ) 发展 四. 10BASE-T 以太网 五. 适配器 与 M ...

  5. RV1126 Linux 以太网MAC PHY 芯片8201f gmac dts配置

    RK 系列的 SoC 中内置了以太网 MAC 控制器,所以只需要搭配一颗以太网 PHY芯片, 即可实现以太网卡功能. 按照规范, 即使是不同厂家的 PHY,同样有一部分寄 存器的定义是通用的, 只要配 ...

  6. 图解通信原理与案例分析-35:以太网MAC层的通信原理--MAC帧格式与调度策略:载波侦听与冲突检测CSMA/CD、载波侦听与冲突避免(信道空闲保证)CSMA/CA、流控

    以太网协议已经是非常成熟的通信技术,本文旨在在汇总以太网MAC层的协议,以便于与其他通信技术的MAC层作为比较,如4G LTE, 5G NR,特别是LTE在非授权频谱上的通信LAA LBT, 就是借鉴 ...

  7. 以太网MAC地址组成与交换机

    目录 一,数据链路层 二,以太网格式 三,交换机的工作原理 交换机以太网接口的工作模式 交换机以太网接口速率 四,交换机基本命令 一,数据链路层 功能: 数据链路的建立,建立与拆除 帧包装,帧传输,帧 ...

  8. 以太网MAC控制器与PHY接口的通信方式总结

    GMAC:MAC控制器    PHY:OSI模型物理层 GMAC与PHY接口支持四种模式:MII.GMII.RMII.RGMII MII: 支持lOMb/s和100Mh/s的数据速率: 100M工作模 ...

  9. pcs层到mac层_5.5.3 万兆以太网MAC子层

    5.5.3  万兆以太网MAC子层 应用于局域网的万兆以太网的MAC子层与千兆以太网的MAC子层的帧格式基本一样(参见图5-17),但不再支持CSMA/CD介质控制方式,只允许进行全双工传输.这就意味 ...

最新文章

  1. python怎么设置字段_Django Model中字段(field)的各种选项说明
  2. Django框架之跨站请求伪造
  3. Js中的数据属性和访问器属性
  4. 利用koa实现mongodb数据库的增删改查
  5. java local_java.time.LocalDateTime with()方法
  6. 窗体的布局 1124
  7. qtcpsocket断开_2020-05-06 QT子线程使用QTcpSocket连接服务器
  8. STM32F103:一.(2)STLINK的配置
  9. “MapReduce: Simplified Data Processing on Large Clusters”
  10. 洛谷题解 P1005 【矩阵取数游戏】
  11. (转)style,currentStyle,getComputedStyle的区别和用法
  12. 南方cass计算表面积_CASS在工程中的应用“计算表面积”的方法
  13. 令牌桶(Token Bucket)
  14. 图像美学质量评价技术综述
  15. 倒车轨迹理论实现方法
  16. 关于GX WORKS2中M8002、M8012、M8013无法使用的问题
  17. 微信退款服务器系统失败怎么办,微信退款多久到账?微信退款不成功怎么办?...
  18. 在线ico图标制作、python代码实现ico格式转换
  19. armv6 可以通过什么方式检查内存泄露?
  20. My97DatePicker默认赋值

热门文章

  1. (机器学习实战)2.3手写识别系统(详细注释)
  2. 笔记本屏幕亮度随着显示内容而变,时亮时暗
  3. 【备忘】IE开发人员工具修复
  4. WIN XP 开机正常,过了进度条之后黑屏
  5. openlayers热力图
  6. 【计算机网络】计算机网络的主要功能
  7. QQ珊瑚虫版被判侵权 作者陈寿福赔偿腾讯十万元
  8. 丈母娘想女婿了,小伟和陈萌刚拍完婚纱照,就被大衣哥安排去看望
  9. 香港网络新危机:黑客入侵网上银行账户买卖股票
  10. Vue中使用find函数