【学习笔记】DM9000裸机驱动(一)

1 总体介绍

DM9000是以太网MAC控制器。它有一个一般处理接口、一个10/100M自适应的PHY4K DWORD值的SRAM。它的目的是在低功耗和高性能进程的3.3V5V的支持宽带。

DM9000还提供了介质无关接口(MII)。该DM9000支持8位、16位和32位接口访问内部存储器,以支持不同的处理器。DM9000PHY接口完全支持10MBps3类、4类、5非屏蔽双绞线100MBps5类非屏蔽双绞线。它的自动协调功能将自动完成配置以最大限度地适合其线路带宽。它还支持IEEE 802.3x全双工流量控制。

2 准备知识

物理层的任务接受一个原始的位流,并试图将它传递到目标机器。

PHY是物理层接口收发器,它实现物理层。包括MII(与介质无关接口)子层、PCS(物理编码子层)等其它子层。

PHY在发送数据的时候,接受MAC发过来的数据(对PHY来说,没有帧的概念,对它来说一切都是原始的位流)。然后每4bit增加1bit的检错码,然后把并行数据转化为串行流数据,再按照物理层的编码规则把数据编码,再变为模拟信号把数据送出去。

隔离变压器把PHY送出来的差分信号用差模耦合的线圈耦合滤波以增强信号,并通过电磁场的转换耦合到连接网线的另一端。

MII(与介质无关接口)。与介质无关表明在不对MAC硬件重新设计或交换的情况下,任何类型的PHY设备都可以正常工作。

MAC(介质访问控制协议)主要负责控制与连接物理层的物理介质,以实现无差错传输。在发送数据的时候,MAC协议可以事先判断是否可以发送数据,如果可以发送将给数据加上一些控制信息,最终将数据以及控制信息以规定的格式发送到物理层;在接收数据的时候,MAC协议首先判断输入的信息是否有传输错误,如果没有错误,则去掉控制信息发送至LLC层。

3 DM9000原理

DM9000Davicom公司的一款以太网控制芯片,在网络中它可自动获得同设定MAC地址一致的IP包,完成IP包得收发,再用一个单片机来结合完成上层协议,就构成了一个完整的网络终端。在单片机中嵌入了一个精简TCP/IP协议栈。

3.1 DM9000结构框图

3.2 DM9000的PIN

DM9000的管脚分为8大类。

第一类:MII Interface

    外部扩张接口,TQ2440没用。

第二类:Processor Interface

处理器(ARM)与DM9000的接口,包括:片选、地址、数据、命令、状态标志。

IO16:字命令标志,当内部存储器的总线是16位或32位时。

INT:中断请求。

第三类:EEPROM Interface

    控制EEPROM的接口,TQ2440没有用。

第四类:Clock Interface

    25M时钟接口。

第五类:LED Interface    

第六类:10/100M PHY/Fiber

与网线相连的。

第七类:Miscellaneous

    对TQ2440来说没什么用。

第八类:Power Pins

用在TQ2440上的管脚

管脚号

输入输出类型

管脚名称

管脚功能

1

I

IOR#

读命令

2

I

IOW#

写命令

3

I

AEN

地址使能

4

O

IOWAIT

L表示命令等待,正常情况下时H。使用上拉电阻进行上拉,增强信号。

6~13

89~82

I/O

SD0~15

数据总线

92

I

CMD

命令类型:

H:数据;L:地址

100

O

INT

中断请求

以下为不重要的

14(硬件)

I

RST

复位(H)。被接地,故不能硬件复位。

93~98(硬件)

I

SA4~9

地址总线,选择DM9000

TQ2440中,

SA9SA8H

SA7SA6SA5SA4L

80(硬件)

I

PW_RST#

低电平有效,用于上电复位。

67(硬件)

I/O

EECS

用于LED模式选择引脚。

H:模式1(TQ2440)

L:模式0

62(LED灯)

O

LINK&ACT#

与LED相连

(1)在LED mode1表示连接和内部PHY的载波侦测信号的运行情况

(2)在LED mode2 表示内部PHY的载波侦测信号的运行情况

60(LED灯)

O

SPEED100#

L表示内部PHY运行在100Mbps;

H表示内部PHY运行在10Mbps

29

I

RXI+

TP RX Input

30

I

RXI-

TP Rx Input

33

O

TXO+

TP TX Output

34

O

TXO-

TP TX Output

3.3 DM9000的寄存器

 DM9000有许多的控制和状态寄存器,我们可以通过主机控制它。这些控制和状态寄存器(CSRs)是字节对齐的。所有的CSRs被硬件被设置为它们默认的值,也可以被软件设置为制定的值。

具体请参考DM9000的datasheet。

3.4 DM9000的初始化

(1)配置相关管脚

(2)进行ID测试

(3)配置寄存器

        a) 激活内部PHY

        b) 软件复位

        c) 使能中断

       d) 清除原网络状态和中断状态

       e) 对发射和接收进行新的控制

       f) 设置MAC地址

      g) 清除原网络状态和中断状态

      h) 使能中断

注意将MMU的BANK4的权限设为NCNB

MMU_SetMTT(0x20000000,0x27f00000,0x20000000,RW_NCNB);

DM9000初始化函数如下

//================================================================
//DM9000_Init()
//1.将相关的管脚配置好
//2.将相关的寄存器配置好

//初始化寄存器主要做的事情:
//1.复位
//2.清楚原先的状态
//3.对发射、接收进行控制
//4.使能中断
//在设置时,有些地方需要重复设置。
//================================================================
void DM9000_Init()
{
	U8 i;
	
	//1.配置管脚
	EINT_INIT( EINT7, Rising_edge);
	//2.进行ID测试
	Test_DM9000_ID();
	//3.配置寄存器
	//3.1.激活内部PHY
	DM9000_Write(GPCR,0x01);//设置GPCR bit[0]=1,使DM9000为GPIO0为输出
	DM9000_Write(GPR,0x00);//GPR bit[0]=0,使GPIO0输出低电平以激活内部PHY
	uDelay(5000);
	
	//3.2 软件复位
	DM9000_Write(NCR,0x03);	//软件复位,MAC内部循环反馈(?)
	uDelay(3000);			//延时10us以上,等待软件复位完成
	DM9000_Write(NCR,0x00);	//复位完成,设置正常工作模式
	DM9000_Write(NCR,0x03);	//第二次软件复位。确保软件复位完全成功
	uDelay(3000);			
	DM9000_Write(NCR,0x00);
	
	//3.3 使能中断
	DM9000_Write(IMR,0x80);//使能指向SRAM的指针的自动返回功能
	
	
	//3.4 清除原网络和中断状态
	DM9000_Write(NSR,0x2c);	//清除各种状态标志位
	DM9000_Write(ISR,0xbf);	//清除所有中断标志位,8-bit
	
	//3.5 对发射和接收进行新的控制
	//    对中断进行新的控制
	DM9000_Write(RXCR,0x39);//接收控制
	DM9000_Write(TXCR,0x00);//发送控制
	DM9000_Write(BPTR,0x3f);//设置RX的最低阀值,小于将产生拥塞
	DM9000_Write(FCTR,0x00);//接收FIFO门限3K,8K
	DM9000_Write(FCR,0xff);//启动一些控制功能
	DM9000_Write(SMCR,0x00);//未启动特殊模式
	
	//3.6  设置MAC地址 
	for(i=0; i<6; i++)
		DM9000_Write(PAR+i, mac_addr[i]);
	//3.7  清除原网络状态和中断标志位
	DM9000_Write(NSR,0x2c);	//清除各种状态标志位
	DM9000_Write(ISR,0x3f);	//清除所有中断标志位,8-bit
	
	//3.8 使能中断
	DM9000_Write(IMR,0x81);//使能指向SRAM的指针满后自动返回功能。
						   //使能数据包接收中断
						   
	Uart_Printf("DM9000初始化结束");
	/////////////////MAC地址///////////////////////////////
	Uart_Printf("\r\nMAC = %x",DM9000_Read(PAR)&0x00ff);
	Uart_Printf("  %x",DM9000_Read(PAR+1)&0x00ff);
	Uart_Printf("  %x",DM9000_Read(PAR+2)&0x00ff);
	Uart_Printf("  %x",DM9000_Read(PAR+3)&0x00ff);
	Uart_Printf("  %x",DM9000_Read(PAR+4)&0x00ff);
	Uart_Printf("  %x\r\n",DM9000_Read(PAR+5)&0x00ff);
}


你可能感兴趣的:(ARM,网络,TQ2440,DM9000)