DM9000是以太网MAC控制器。它有一个一般处理接口、一个10/100M自适应的PHY和4K DWORD值的SRAM。它的目的是在低功耗和高性能进程的3.3V与5V的支持宽带。
DM9000还提供了介质无关接口(MII)。该DM9000支持8位、16位和32位接口访问内部存储器,以支持不同的处理器。DM9000的PHY接口完全支持10MBps下3类、4类、5类非屏蔽双绞线和100MBps下5类非屏蔽双绞线。它的自动协调功能将自动完成配置以最大限度地适合其线路带宽。它还支持IEEE 802.3x全双工流量控制。
物理层的任务接受一个原始的位流,并试图将它传递到目标机器。
PHY是物理层接口收发器,它实现物理层。包括MII(与介质无关接口)子层、PCS(物理编码子层)等其它子层。
PHY在发送数据的时候,接受MAC发过来的数据(对PHY来说,没有帧的概念,对它来说一切都是原始的位流)。然后每4bit增加1bit的检错码,然后把并行数据转化为串行流数据,再按照物理层的编码规则把数据编码,再变为模拟信号把数据送出去。
隔离变压器把PHY送出来的差分信号用差模耦合的线圈耦合滤波以增强信号,并通过电磁场的转换耦合到连接网线的另一端。
MII(与介质无关接口)。与介质无关表明在不对MAC硬件重新设计或交换的情况下,任何类型的PHY设备都可以正常工作。
MAC(介质访问控制协议)主要负责控制与连接物理层的物理介质,以实现无差错传输。在发送数据的时候,MAC协议可以事先判断是否可以发送数据,如果可以发送将给数据加上一些控制信息,最终将数据以及控制信息以规定的格式发送到物理层;在接收数据的时候,MAC协议首先判断输入的信息是否有传输错误,如果没有错误,则去掉控制信息发送至LLC层。
DM9000是Davicom公司的一款以太网控制芯片,在网络中它可自动获得同设定MAC地址一致的IP包,完成IP包得收发,再用一个单片机来结合完成上层协议,就构成了一个完整的网络终端。在单片机中嵌入了一个精简TCP/IP协议栈。
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中, SA9、SA8:H; SA7、SA6、SA5、SA4:L; |
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 |
DM9000有许多的控制和状态寄存器,我们可以通过主机控制它。这些控制和状态寄存器(CSRs)是字节对齐的。所有的CSRs被硬件被设置为它们默认的值,也可以被软件设置为制定的值。
具体请参考DM9000的datasheet。
(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);
}