dm9000网口收发控制以及mac地址过滤设置

目的 :完成网口收发调试

过程 : 

1、网口初始化,根据芯片数据手册配置

2、网口发数,先向DM9000中的TX FIFO存入数据,然后出发发送寄存器完成发送;

3、网口接收 。

1) 中断方式 :DM9000的中断可以通过主动查询DM9000中断寄存器的方式,以及通过DM9000INT引脚来中断DSP系统,在去查询中断类型的方式。

 

使用DM9000 INT方式出发DSP中断的好处有:可以避免cpu不断的查询DM9000中断寄存器;优化收数掉帧的情况

2)MAC地址过滤 :    配合DM9000中RCR(接受控制寄存器)寄存器以及DM9000物理地址和广播地址寄存器共同实现对非匹配MAC地址包的过滤功能

        

       

配置说明 :

假设配置的本地MAC地址为 28 5b 6d 5c 58 73 。注意mac地址的首位需要为偶数

将RCR寄存器的值配置为0X33 : 即打开DM9000的混杂模式,此时DM9000能够接受到所有的网络包,包括以

广播帧    :  FF FF FF FF FF FF XX XX XX XX XX XX..

其他MAC地址包 : 28 5b 6d 5c 58 74 XX XX XX XX XX XX...

多播帧  :33 33 01 00 02 00 XX XX XX XX XX XX...

当前匹配mac地址包 :28 5b 6d 5c 58 73 XX XX XX XX XX XX...

将RCR寄存器的值配置为0X31 : 即关闭DM9000的混杂模式,此时DM9000能够接受到广播包、多播包、匹配本地MAC地址包

广播帧    :  FF FF FF FF FF FF XX XX XX XX XX XX..

多播帧  :33 33 01 00 02 00 XX XX XX XX XX XX...

当前匹配mac地址包 :28 5b 6d 5c 58 73 XX XX XX XX XX XX...

将RCR寄存器的值配置为0X39 : 即关闭DM9000的多包模式,貌似无效,还是能够接受到广播包、多播包、匹配本地MAC地址包

如果需要进一步过滤掉广播包和多播包,需要借助广播寄存地址;从网上资料查询得到,此处的广播寄存器地址就等效于一个校验位,能对通过的MAC地址计算并校验,

符合校验值得则通过MAC产生中断,不符合的则被过滤掉(自己未验证过);本次设置该广播寄存地址全部为零;经测试发现,能够将其他的多播包和广播包去除,只接收匹配本地MAC地址的

数据

3) DSP移植 :

DM9000接受到的数据是进过MAC组帧过后的值,具体格式如下所示 :

第一个byte为接受包有效标志位 ; status为状态位;数据长度;后面其实还有两位校验位

假设上位机PC端发送一组数据长度为1040的数据 格式为 :FF FF FF FF FF FF 28 5b 6d 5c 58 73 保留为(4byte)   数据为(1024byte) 总共长度为  1040 byte

网口接受到的包格式为 :

01  XX 14 04    FF FF FF FF FF FF 28 5b 6d 5c 58 73 保留为(4byte)   数据为(1024byte) CRC(4byte);

接受包中的数据长度为0X414 即1044个;多出的4byte就是后面跟随的CRC

在移植过程中出现了一个关于读数的问题 :

1、程序移植到FLASH后发现接受到的数据出现错误。

原因 : DM9000内部设置从RX FIFO中将数据读取出来采用的是指针自动递增的模式;如果在有数据到来没有按照接受包的帧长度(1044)全部将数据读取出来,那么RX SRAM的自动指针是不会自动跳转回到初始位置;导致在进入中断时数据将会读取错误;

上图代码段想从接受到的数据中直接将信号提取出来;

rx_state = inw();

phy_addr[0] = inw(); .....

由于这些定义的变量只是为了将占据数据包中相应部分去除,使得读取RX FIFO 指针依次移动至有效数据位置上。然后获取有效数据位;

由于DSP程序代码打开了最高级别的优化,使得这些未使用的代码段直接被优化掉,使得RX FIFO指针在操作时没有移位到数据位上。

通过对变量添加volatile 关键字也不是全部都有效;所以将代码做了如下修改

          

如有错误请指正

时间: 2024-10-17 07:12:49

dm9000网口收发控制以及mac地址过滤设置的相关文章

使用truelicense进行Java程序license控制 经过扩张可以验证license 开始结束日期,验证绑定给定mac地址

使用truelicense进行Java程序license控制 经过扩张可以验证license 开始结束日期,验证绑定给定mac地址. Truelicense 是一个开源的java license 验证项目. 使用truelicense实现用于JAVA工程license机制(包括license生成和验证)请参考http://www.it165.net/pro/html/201404/11540.html 其中包括license授权机制的原理和制作license的具体步骤 本文主要是在此文基础上增加

MAC地址(单播、广播、组播、数据收发)

MAC地址 网络设备的MAC地址是全球唯一的.MAC地址长度为48比特,通常用十六进制表示.MAC地址包含两部分:前24比特是组织唯一标识符(OUI,OrganizationallyUniqueIdentifier),由IEEE统一分配给设备制造商. 例如,华为的网络产品的MAC地址前24比特是0x00e0fc.后24位序列号是厂商分配给每个产品的唯一数值,由各个厂商自行分配(这里所说的产品可以是网卡或者其他需要MAC地址的设备). 单播 局域网上的帧可以通过三种方式发送.第一种是单播,指从单一

C#获取局域网IP、MAC地址和端口的初学

首先非常感谢Melou的http://www.cnblogs.com/luoht/archive/2009/12/18/1627431.html的随笔,对于初学C#的我,参考你的随笔对我的学习真是有莫大帮助. C#遍历局域网的几种方法: 1.微软社区上介绍了使用Active Directory 来遍历局域网 首先我们来了解DirectoryEntry类是一个什么类. 命名空间:  System.DirectoryServices程序集:  System.DirectoryServices(在 S

OpenWrt Mac地址修改错误SIOCSIFHWADDR: Cannot assign requested address

问题 设置mac地址 11:22:33:44:55:66, 在OpenWrt正在开发的主trunk上就没有SIOCSIFHWADDR: Cannot assign requested address, 这个问题. 但是到attitude adjustment最新的trunk上就出现了,估计是内核版本不同,导致都mac地址的限制不同导致. 最新的反而不严格了?这个不科学啊. 解决方法: http://blog.csdn.net/evenness/article/details/7674038 ht

通过安卓应用获取任意蓝牙设备的MAC地址

最近做一个安卓应用,用蓝牙信号控制一台仪器,通过一个蓝牙转串口的装置,发送蓝牙信号,然后转换为串口命令发送给仪器.蓝牙装置如下: 在写安卓应用中的java代码时,如何获取这个蓝牙设备呢?BluetoothAdapter 的 getRemoteDevice(address) 方法可以通过MAC地址来获取蓝牙设备: BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address); 但问题来了,这个蓝牙设备的MAC地址是多少呢?

集中式MAC地址认证实现路由器上网

集中式MAC地址认证实现路由器上网 集中式MAC地址认证实现路由器上网... 1 一:背景... 1 二:技术分析... 1 三:测试总结... 2 测试一:IMC+MAC地址认证固定用户名... 2 测试二:IMC+MAC地址认证MAC用户名... 3 测试三:MAC地址用户名认证+802.1X同时存在... 3 测试四:MAC 地址用户名认证+802.1X同时存在,采用不同的认证域... 4 四:技术问答... 4 五:测试总结... 5 一:背景 家属区无线路由器设备增多,先前采用的腾达W

SCVMM“云端”自动为虚拟机分配ip地址和MAC地址

目前云计算在IT界是一个比较新潮的词语,那么到底该怎么定义云计算呢?NIST对云计算的定义如下:云计算是一种能够通过网络以便利的,按需付费的方式获取计算资源(包括网络,服务器,存储,应用和服务等)并提高其可用性的模式,这些资源来自一个共享的,可配置的资源池,并能够以最省力和无人干预的方式获取和释放. 这种模式具有:  5个关键功能, 4种部署方式,3种服务模式: 5大核心特点:按需自助服务,广泛的网络访问,动态的资源池,快速弹性,可计量的服务 1.  按需自助服务(On Demand Self-

【转载】获取MAC地址方法大全

From:http://blog.csdn.net/han2814675/article/details/6223617 Windows平台下用C++代码取得机器的MAC地址并不是一件简单直接的事情.到目前为止,作者尚未发现有任何一个通用的100%的适用于所有Windows平台的方法可以稳定的取得MAC地址.而有些应用(比如MMORPG)则需要稳定的得到机器的MAC地址,解决方案往往是通过多种方法依次使用来提高成功率. 说明: 以下方法只会返回多网卡的第一个MAC地址. 网上有很多文章和源码来解

Internet为什么需要IP地址和MAC地址?

1 基本概念 IP地址是Internet协议地址,每个Internet包必须带有IP地址,每个Internet服务提供商(ISP)必须向有关组织申请一组IP地址,然后一般是动态分配给其用户. MAC地址是Ethernet网卡上带的地址,长度为48位.每个Ethernet网卡生产厂家必须向IEEE组织申请一组MAC地址,在生产网卡时在网卡的串行EEPROM中写入一个唯一的MAC地址. 2 为什么需要IP地址和MAC地址? 第一种情形:宽带用户通过ADSL拨号上网 用户/主机(如Host A)最初是