MAC:主要负责数据帧的创建,数据差错,检查,传送控制等。

PHY:物理接口收发器,当收到MAC过来的数据时,它会加上校验码,然后按照物理层的规则进行数据编码,再发送到传输介质上,接收过程则相反。

MII:媒体独立接口,“媒体独立”表明MAC一定情况下,任何类型的PHY设备都可以正常工作。

DM9000网卡部分函数实现:

/*
//实验步骤
//初始化dm900
//数据包发送
//数据包接收 */ #include "dm9000.h"
#include "arp.h" #define DM_ADD (*((volatile unsigned short *)0x18000000))
#define DM_DAT (*((volatile unsigned short *)0x18000004)) /*Register*/
#define MEM_SYS_CFG (*(volatile unsigned *)0x7E00F120) #define SROM_BW (*(volatile unsigned *)0x70000000)
#define SROM_BC1 (*(volatile unsigned *)0x70000008) #define GPNCON (*(volatile unsigned *)0x7F008830) /* 中断相关寄存器 */
#define EINT0CON0 (*(volatile unsigned *)0x7F008900)
#define EINT0MASK (*(volatile unsigned *)0x7F008920)
#define EINT0PEND (*(volatile unsigned *)0x7F008924)
#define VIC0INTENABLE (*(volatile unsigned *)0x71200010)
#define EINT7_VECTADDR (*(volatile unsigned *)0x71200104)
#define VIC0ADDRESS *((volatile unsigned int *)0x71200f00)
#define VIC1ADDRESS *((volatile unsigned int *)0x71300f00) u8 *buffer = &arpbuf; u8 host_mac_addr[] = {0xff,0xff,0xff,0xff,0xff,0xff};
u8 mac_addr[] = {,,,,,};
u8 ip_addr[] = {,,,};
u8 host_ip_addr[] = {,,,};
u16 packet_len; void cs_init()
{
// MEM_SYS_CFG
SROM_BW &= (~(<<)); //设置位宽度
SROM_BW |= (<<);
SROM_BC1 = (0x0<<)|(0x0<<)|(0x7<<)|(0x0<<)|(0x0<<)|(0x0<<)|(0x0<<); //设置时序 参考uboot ok6410的网卡片选位于bank1
} void int_init() //中断初始化
{
GPNCON &= (~(0x3<<));
GPNCON |= (0x2<<); // EINT0PEND &= (~(0x1<<7));
// EINT0PEND |= (0x1<<7);
} void dm9000_reg_write(u16 reg,u16 data)
{
DM_ADD = reg;
DM_DAT = data;
} u8 dm9000_reg_read(u16 reg)
{
DM_ADD = reg;
return DM_DAT;
} void dm9000_reset()
{
dm9000_reg_write(DM9000_GPCR, GPCR_GPIO0_OUT);
dm9000_reg_write(DM9000_GPR, ); dm9000_reg_write(DM9000_NCR, (NCR_LBK_INT_MAC | NCR_RST));
dm9000_reg_write(DM9000_NCR, ); dm9000_reg_write(DM9000_NCR, (NCR_LBK_INT_MAC | NCR_RST));
dm9000_reg_write(DM9000_NCR, );
} void dm9000_probe(void)
{
u32 id_val;
id_val = dm9000_reg_read(DM9000_VIDL);
id_val |= dm9000_reg_read(DM9000_VIDH) << ;
id_val |= dm9000_reg_read(DM9000_PIDL) << ;
id_val |= dm9000_reg_read(DM9000_PIDH) << ;
if (id_val == DM9000_ID) {
printf("dm9000 is found !\n");
return ;
} else {
printf("dm9000 is not found !\n");
return ;
}
} void dm9000_init()
{
u32 i; /*片选(独立芯片)*/
cs_init(); /*中断初始化*/
int_init(); /*设备复位操作*/
dm9000_reset(); /*捕获dm9000*/
dm9000_probe(); /*MAC初始化*/
/* Program operating register, only internal phy supported */
dm9000_reg_write(DM9000_NCR, 0x0);
/* TX Polling clear */
dm9000_reg_write(DM9000_TCR, );
/* Less 3Kb, 200us */
dm9000_reg_write(DM9000_BPTR, BPTR_BPHW() | BPTR_JPT_600US);
/* Flow Control : High/Low Water */
dm9000_reg_write(DM9000_FCTR, FCTR_HWOT() | FCTR_LWOT());
/* SH FIXME: This looks strange! Flow Control */
dm9000_reg_write(DM9000_FCR, 0x0);
/* Special Mode */
dm9000_reg_write(DM9000_SMCR, );
/* clear TX status */
dm9000_reg_write(DM9000_NSR, NSR_WAKEST | NSR_TX2END | NSR_TX1END);
/* Clear interrupt status */
dm9000_reg_write(DM9000_ISR, ISR_ROOS | ISR_ROS | ISR_PTS | ISR_PRS); /*填充MAC地址*/
for (i = ; i < ; i++)
dm9000_reg_write(DM9000_PAR+i, mac_addr[i]); /*激活DM9000*/
dm9000_reg_write(DM9000_RCR, RCR_DIS_LONG | RCR_DIS_CRC | RCR_RXEN);
/* Enable TX/RX interrupt mask */
dm9000_reg_write(DM9000_IMR, IMR_PAR);
} void dm9000_tx(u8 *data,u32 length)
{
u32 i; /*禁止中断*/
dm9000_reg_write(DM9000_IMR,0x80); /*写入发送数据的长度*/
dm9000_reg_write(DM9000_TXPLL, length & 0xff);
dm9000_reg_write(DM9000_TXPLH, (length >> ) & 0xff); /*写入待发送的数据*/
DM_ADD = DM9000_MWCMD; // MWCMD是DM9000内部SRAM的DMA指针,根据处理器模式,写后自动增加 for(i=;i<length;i+=)
{
DM_DAT = data[i] | (data[i+]<<); //低8 高8
} /*启动发送*/
dm9000_reg_write(DM9000_TCR, TCR_TXREQ); /*等待发送结束*/
while()
{
u8 status;
status = dm9000_reg_read(DM9000_TCR);
if((status&0x01)==0x00)
break;
} /*清除发送状态*/
dm9000_reg_write(DM9000_NSR,0x2c); /*恢复中断使能*/
dm9000_reg_write(DM9000_IMR,0x81); // printf("dm9000_tx");
} #define PTK_MAX_LEN 1522 u32 dm9000_rx(u8 *data)
{
u8 status,len;
u16 tmp;
u32 i; /*判断是否产生中断,且清除*/
if(dm9000_reg_read(DM9000_ISR) & 0x01)
dm9000_reg_write(DM9000_ISR,0x01);
else
return ; /*空读*/
dm9000_reg_read(DM9000_MRCMDX); /*读取状态*/
status = dm9000_reg_read(DM9000_MRCMD); /*读取包长度*/
len = DM_DAT; /*读取包数据*/
if(len<PTK_MAX_LEN)
{
for(i=;i<len;i+=)
{
tmp = DM_DAT;
data[i] = tmp & 0x0ff;
data[i+] = (tmp>>)&0x0ff;
}
} return len;
}

DM9000网卡的基本工作原理的更多相关文章

  1. 【夯实Nginx基础】Nginx工作原理和优化、漏洞

    本文地址 原文地址 本文提纲: 1.  Nginx的模块与工作原理    2.  Nginx的进程模型    3 . NginxFastCGI运行原理        3.1 什么是 FastCGI   ...

  2. 【Oracle 集群】ORACLE DATABASE 11G RAC 知识图文详细教程之RAC 工作原理和相关组件(三)

    RAC 工作原理和相关组件(三) 概述:写下本文档的初衷和动力,来源于上篇的<oracle基本操作手册>.oracle基本操作手册是作者研一假期对oracle基础知识学习的汇总.然后形成体 ...

  3. 【转】基于linux下的dm9000网卡移植全分析

    转自:http://blog.sina.com.cn/s/blog_6abf2c04010189ui.html DM9000可以直接与ISA总线相连,也可以与大多数CPU直接相连.Mini2440采用 ...

  4. PC工作原理

    提到"技术"这个词时,大多数人都会想到计算机.事实上,我们生活中的方方面面都离不开计算机部件.家里的电器设备有内置的微处理器,例如电视机.甚至汽车里也装有计算机.但是,提到计算机大 ...

  5. 【转】虚拟机VMware3种网络模式(桥接、nat、Host-only)的工作原理

     VMware网络配置详解一:三种网络模式简介 安装好虚拟机以后,在网络连接里面可以看到多了两块网卡: 其 中VMnet1是虚拟机Host-only模式的网络接口,VMnet8是NAT模式的网络接口, ...

  6. keepalived工作原理和配置说明 腾讯云VPC内通过keepalived搭建高可用主备集群

    keepalived工作原理和配置说明 腾讯云VPC内通过keepalived搭建高可用主备集群 内网路由都用mac地址 一个mac地址绑定多个ip一个网卡只能一个mac地址,而且mac地址无法改,但 ...

  7. [转]虚拟机VMware3种网络模式(桥接、nat、Host-only)的工作原理

    VMware网络配置详解一:三种网络模式简介 安装好虚拟机以后,在网络连接里面可以看到多了两块网卡: 其 中VMnet1是虚拟机Host-only模式的网络接口,VMnet8是NAT模式的网络接口,这 ...

  8. LVS-DR工作原理图文详解

    为了阐述方便,我根据官方原理图另外制作了一幅图,如下图所示:VS/DR的体系结构: 我将结合这幅原理图及具体的实例来讲解一下LVS-DR的原理,包括数据包.数据帧的走向和转换过程. 官方的原理说明:D ...

  9. LVS-DR工作原理

    我们都知道LVS有LVS-DR,LVS-NAT,LVS-TUN三种模式,其中DR模式意为Direct Routing(直接路由).对于LVS-DR,你到底了解到什么程度?本文通过一个实例场景,详细介绍 ...

随机推荐

  1. Redis数据持久化之AOF持久化

    一.RDB持久化的缺点创建RDB文件需要将服务器所有的数据库的数据都保存起来,这是一个非常耗费资源和时间的操作,所以服务器需要隔一段时间才能创建一个新的RDB文件,就也是说创建RDB文件的操作不能执行 ...

  2. Android Studio 实用插件整理

    首先说一下安装方法: 上图片: 首先点击Android stuido 菜单 File->Settings 进入上图界面: 区域1:你当前已经安装了的插件 区域3:在线安装 区域2:其实和区域3是 ...

  3. Appium环境搭建Java篇

    1.下载.安装JDK&配置Java环境变量 JDK下载地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html ...

  4. 模糊查询(LIKE)and (PATINDEX() . CHARINDEX())

    SQL中的模糊查询一般来说使用模糊查询,大家都会想到LIKE  select * from table where a like '%字符%' 如果一个SQL语句中用多个 like模糊查询,并且记录条 ...

  5. 关闭GS选项,解决注入后崩溃

    利用CreateRemoteThread向进程注入远程代码时,一般会有以下两种做法: 利用LoadLibrary在目标进程加载指定的DLL 将代码复制到目标进程,然后启动这段代码 上面的第二种方法其实 ...

  6. 轻松找回Win7桌面“消失”的IE9图标

    打开注册表编辑器(Win+R打开运行窗口,运行regedit命令),依次展开到 [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion ...

  7. 【Linux】Zabbix + MPM + msmtp + mutt 监控MySQL + 邮件报警

    Zabbix部署参考博文 http://blog.sina.com.cn/s/blog_5611597901017oe0.html  MPM安装配置参考博文和MPM官网下载地址 http://blog ...

  8. 在jQuery和JavaScript中,实现转跳

    隐藏转跳,浏览器不产生历史记录(replace).代码片段: window.location.replace("http://insus.cnblogs.com"); 当然我们还不 ...

  9. @media screen解决移动web开发的多分辨率问题

    当今移动设备的发展已经越来越迅速,移动web开发的需求也越来越多多.许多大平台.大门户都纷纷推出了自己的移动web版网站. 随着移动设备飞速的发展,移动产品的屏幕规格越来越多.从几年前的320×240 ...

  10. 阿里 Java面试 知识点

    摘自: http://blog.csdn.net/wtyvhreal/article/details/45291835 =================================== 基础知识 ...