随着嵌入式技术和网络技术的发展及以太网的广泛应用,各种应用设备的网络化成为未来设备发展的一个重要方向。各种嵌入式设备已经成功渗透到生产生活的各个领域,并逐渐朝着网络化、智能化的方向发展[1]。以太网因其在实时操作、可靠传输、标准统一等方面的卓越性能及其便于安装、维护简单、不受通信距离限制等优点,已发展成为一种成熟的技术。人们希望通过网络连接各种现场,协调各种设备间的工作,实现设备的网络化控制与管理。AVICOM公司的DM9000A是实现网络通信的芯片,它占用很少的硬件资源,可以在不改变设备其他性能的基础上给设备加入网络功能。开发一个嵌入式通信控制器不仅实现了设备上网的低成本解决方案,同时也提升了设备信息化水平。随着数字信息技术、网络技术和嵌入式系统的高速发展,如视频监控、远程控制、信息家电、网络摄像头都离不开嵌入式设备与网络的结合,嵌入式系统的以太网接口设计已成为目前的一个研究热点。因此嵌入式以太网接口的设计对于嵌入式网络系统的建立是十分必要的。目前,Linux 操作系统己经越来越广泛地被应用于嵌入式设备[2],编写Linux下的设备驱动程序十分有意义。
1 DM9000A芯片介绍
DM9000A是DAVICOM公司推出的一款高速以太网接口芯片,其基本特征是:集成10M/100M物理层接口;内部带有16 KB SRAM用作接收发送的FIFO缓存;支持8/16 bit两种主机工作模式;通过HP认证的AUTO-Mdix(支持直接互连自动翻转)功能;支持TCP/IP加速(IPv4 check sum offload)减轻CPU负担,提高整机效能;10 ns I/O读写时间。该电路还集成了EEPROM接口,自举时通过EEPROM接口输入到芯片中,从而实现自动初始化。在现有以太网控制器芯片中大多数速度是10 M的,其传输速率慢, DM9000A是成本低速度快的以太网控制器芯片,速度10M/100M自适应。它被设计为低功耗、高处理性能, 而其操作又非常简单, 具有通用的处理器接口,可以与多种处理器直接连接,容易完成不同系统的软件驱动开发。数据总线宽度可设置为8 bit和16 bit,IO口支持3.3 V~5 V,因此几乎可以和所有处理器连接。DM9000A以太网控制器遵循IEEE颁布的802.3以太网传输协议[3]。芯片内部集成4 KB双字节静态存取存储器, 自动收发转换功能使开发变得更加简单, 容易完成不同系统的软件驱动开发。
2 DM9000A芯片的硬件接口设计
DM9000A可以很方便地与目前主流嵌入式CPU以8 bit或16 bit的总线方式连接,本文系统的CPU为TI公司的DSP:TMS320C6713(C6713),它是业界流行的一款高性能32 bit浮点DSP,在255 MHz时钟主频下,其最高执行速度可达1 800 MIPS。C6713拥有丰富的片内资源,常用于数字处理领域,二者的接口设计如图1。
现在的设备都包含数字处理器,DM9000A可以很容易地应用到各种设备里。由图1可以看到,TMS320C6713与DM9000A硬件连接简单。系统上电时,DSP通过总线配置DM9000A内部网络控制寄存器(NCR)、中断寄存器(ISR)等,完成DM9000A的初始化。随后,DM9000A进入数据收发等待状态。该电路还集成了EEPROM接口,自举时通过EEPROM接口输入配置数据到芯片中,从而实现自动初始化。数据总线SD0-SD15可以直接挂在处理器的数据总线上,无需电平转换。如果EECS接一个10 kΩ的上拉电阻,芯片在上电时将被配置成8 bit数据总线模式,此时SD8-SD15可以用作GPIO。再加一个硬件协议栈,可以将其用在没有处理器的设备中。
3 DM9000A芯片的操作
对处理器驱动网卡芯片来说,比较关心的有以下几个引脚:IOR、IOW、CMD(A2)、INT、RST以及数据引脚SD0~SD15。IOR和IOW是DM9000的读写选择引脚,低电平有效,即在信号的上升沿进行读(IOR)写(IOW)操作。CMD为命令/数据选择引脚,低电平时读写命令操作,高电平时读写数据操作,将它接到处理器的地址线A2上。如DM9000A工作的基地址为0x80000000,则DM9000A有两个的地址:命令口地址(0x80000000)和数据口地址(0x80000004)。DM9000A有多个寄存器,通过先向命令口写寄存器地址,再向数据口写寄存器数据来配置芯片。数据总线SD0-SD15则根据数据总线的位数接到处理器数据总线上。收发数据也是通过读写相应的寄存器实现。
图2和图3分别显示了DM9000A的读写时序,由图可知,DM9000A的读写操作与一般的异步存储器相同。根据芯片资料,编写读写寄存器的子函数。
寄存器的读操作:
#define DM_INDEX *(volatile unsigned int *)0x8000000
#define DM_DATA *(volatile unsigned int *)0x8000004
int dm9000_reg_read(char reg)
{ DM_INDEX = reg;
return DM_ DATA; }
寄存器的写操作:
void dm9000_reg_write(char reg, char data)
{ DM_ INDEX = reg;
DM_ DATA = data; }
4 DM9000A芯片的初始化
对DM9000A芯片的初始化,就是向相应的寄存器写入期望的值,为芯片的稳定工作做好准备。表1列出各寄存器的名称、地址以及赋参考值,寄存器的具体功能可以参考DM9000A的用户手册。
初始化中还要对PAR(10H--15H)寄存器初始化,PAR中保存的是芯片物理地址即通常的MAC地址,芯片根据网络数据与PAR中的数据比较来确定保存或丢弃数据。初始化后,可以通过读NCR寄存器来判断芯片是否已经连上网络。