摘 要:采用DAVICOM公司的以太网控制芯片和TI公司的TMS320C6713设计了网络通信电路。该设计适用于各种嵌入式设备以及各种信号处理设备中。为各种设备之间的通信提供解决方案。给出了TMS320C6713和DM9000A的接口电路和软件编程实现。
关键词:DSP; 以太网; DM9000A; TCP/IP协议
随着嵌入式技术和网络技术的发展及以太网的广泛应用,各种应用设备的网络化成为未来设备发展的一个重要方向。各种嵌入式设备已经成功渗透到生产生活的各个领域,并逐渐朝着网络化、智能化的方向发展[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寄存器来判断芯片是否已经连上网络。
5 DM9000A芯片数据的发送和接收
在传送数据封包之前,需将其封包数据存放在DM9000A的内存中。DM9000A的内部RAM地址0000h~0BFFh用来存放发送数据包。用户无需关心数据存放的地址,只要向MWCMD寄存器写入数据包即可,内部数据指针会自动更新,将MWCMD寄存器的数据依次存到内部RAM。另外还需将要传送封包的大小存放在TXPLH和TXPLL寄存器中。之后再将TCR的bit0设为1,此时芯片开始进行封包的传送。而在传送完成后,会将传送是否成功的信息放在TSRI、TSRll中。
以下为数据发送的函数:datas为要发送的数据在处理器缓冲区的地址,len(两个字节)为要发送的数据长度(以字节为单位)。
void sendpacket(char *datas, unsigned int len)
{unsigned int i;
dm9000_reg_write(IMR, 0x80);//先禁止网卡中断,防止在发送数据时被中断干扰。
DM_ INDEX = MWCMD; //写命令寄存器
for(i=0; i
dm9000_reg_write(TXPLH, (len>>8) & 0x0ff);
dm9000_reg_write(TXPLL, len & 0x0ff);
dm9000_reg_write(TCR, 0x01); //请求发送数据
dm9000_reg_write(IMR, 0x81);
//DM9000网卡的接收中断使能
}
数据的发送比较简单,接收相对复杂一点。DM9000接收到数据包时,会存放于DM9000接收内存的0C00h~3FFFh中。若是读取位置超过3FFFh时,DM9000会自动将位置移到OC00h的位置。在每一个数据包前,会增加4 B存放数据包相关资料。接收数据包时首先要读取这4个字节来确定数据包的状态,第一个字节“01H”表示接下来的是有效数据包,若为“00H”则表示没有数据包,若为其他值则表示网卡没有正确初始化,需要重新初始化。在读取其他字节之前,必需要确定第1个字节是否为“01h”。第2个字节则为这个数据包的相关信息,其格式与RSR寄存器的格式一样。第3和4个字节是存放这个封包的长度大小(不包括前四个字节)。
如果接收到的数据包长度小于60 B,则DM9000会自动为不足的字节补上0,使其达到60 B。同时,在接收到的数据包后DM9000还会自动添加4个CRC校验字节。可以不予处理。于是,接收到的数据包的最小长度也会是64 B。
接收数据包的过程:(1)读MRCMDX寄存器,判断是否有数据包。(2)如有数据包,读MRCMD寄存器,根据数据包的长度信息将整个数据包读取出来。其中第一步需要做两遍,因为第一次读到的值总为0。
以下为数据包接收的函数:datas为接收到是数据存储位置,接收成功返回1,不成功返回0。
unsigned int receivepacket(unsigned char *datas)
{
unsigned int i, tem;
unsigned int status, len;
unsigned char ready;
ready = 0; //希望读取到“01H”
status = 0; //数据包状态
len = 0; //数据包长度
/*以上为有效数据包前的4个状态字节*/
ready = dm9000_reg_read(MRCMDX);
//第一次读取,一般读取到的是00H
ready = dm9000_reg_read(MRCMDX);
//第二次读取,总能读对if(ready!= 0x01)
{ if(ready!= 0x00)
//若第二次读取到的不是01H或00H,则
表示没有初始化成功
{ dm9000_reg_write(IMR, 0x80);
//屏幕网卡中断
DM9000_init();//重新初始化
dm9000_reg_write(IMR, 0x81);
//打开网卡中断
}
retrun 0;
}
}
/*以上表示若接收到的第一个字节不是“01H”,则表示没有数据包,返回0*/
status = dm9000_reg_read(MRCMD);
len = DM_DATA;
if(!(status & 0xbf00) && (len < 1522))
{ for(i=0; i
datas[i] = tem & 0x0ff;
datas[i+1] = (tem >> 8) & 0x0ff;
}
}
else
{
return 0;
}
6 网络数据传输协议
以上完成了以太网数据包的收发,应用网络传输还需要完整的网络传输协议,TCP/IP协议为互联网通用协议。TCP/IP协议族是一整套把各种系统连接在一起并保证数据准确快速传输的规定和格式[4]。通常把TCP/IP协议族抽象成为一种具有四层结构的模型:链路层、网络层、运输层、应用层。每层各负责一个或一系列独立的功能。根据各种协议的格式编写相应的数据处理函数。在有操作系统的应用中,要编写网络设备驱动程序。设备驱动程序需要完成网络设备的注册、初始化与注销以及进行发送和接收数据处理,并能针对传送超时、中断等情况进行及时处理[5]。
DM9000A的操作简单,模块独立,不会影响原设备的性能指标,为设备间的通信提供保障。在没有处理器的装备中,93C46可以正确初始化芯片,硬件协议栈能正确处理收发数据。传输协议有成熟的TCP/IP协议,在简单的通信和控制系统中,可以应用简单的数据传输协议,缩短开发周期,提高设备的效率。
参考文献
[1] 雒珊,尹岗.基于ARM 的以太网通信控制器的设计[J].电子测量技术,2009, 23(10):133-135.
[2] 赵军.嵌入式平台上Linux网络设备驱动程序的开发[J].电脑知识与技术,2009,5(33):9272-9273.
[3] 陈 峰,彭 龑,易 彬,等.基于嵌入式技术的以太网接口设计[J].通信技术,2010,43(5):127-129.
[4] 刘春燕,颜兴建.嵌入式TCP/IP协议的设计与实现[J].电脑知识与技术,2010,6(8):1815-1816.
[5] 周敬琼,周凤星.基于ARM 的Linux 网络设备驱动程序开发[J]. 计算机工程与设计,2009,30(22):5124-5127.