基于DM9000A和LPC2214的嵌入式以太网接口设计
2009-01-19 15:56:42
基于DM9000A和LPC2214的嵌入式以太网接口设计
作者:刘伟明、杜林 单位:重庆大学高电压与电工新技术教育部重点实验室 转载:电子测量技术 发布时间:2008-11-28
引言
互联网的迅速发展使得网络用户呈指数增长,在使用计算机进行网络互联的同时,各种家电设备、仪器仪表以及工业生产中的数据采集与控制设备也在逐步地走向网络化,以便共享网络中庞大的信息资源。以太网技术以其灵活方便的连接方式、良好的开放性、高效、低廉等优点,已经广泛地应用于各种计算机网络,并且还在不断地发展。目前基于以太网的新技术和联网设备不断出现,以太网已经成为事实上最常用的网络标准之一。
以太网控制芯片是以太网接口的核心器件,其性能是影响网络性能的关键的因素之一,如何正确使用网络控制器是设计以太网接口的关键。本文介绍了一种以高性能的以太网控制芯片DM9000A和32位ARM处理器LPC2214为核心的嵌入式以太网接口的实现方法。
1、以太网控制器DM9000A介绍
DM9000A是DAVICOM公司推出的一种高度集成、功能强大、少引脚、性价比高的单片快速以太网控制芯片,非常适用于嵌入式系统设计。
图1为 DM9000A内部结构框图。DM9000A具有一个通用的微处理器接口,内部集成了16kB SRAM(其中13kB用作接收缓冲区,3kB作为发送缓冲区),对内部存储器访问支持8位和16位数据接口以适用于不同的微处理器;内部集成了一个 10/100M自适应PHY,可以连接到3类、4类、5类的10M无屏蔽双绞线和5类的100M无屏蔽双绞线。
图1 DM9000A内部结构框图
DM9000A体积小,只有48个引脚,有利于缩小PCB面积;它完全支持IEEE802.3u规格,还支持IEEE802.3x全双工流控制。DM9000A功耗非常低,单电源3.3V工作,内置 3.3V变2.5V电源电路,I/O端口支持3.3V到5V的容差。
2、网络接口硬件电路设计
网络接口硬件电路使用的芯片主要有处理器LPC2214、复位芯片CAT1025、以太网控制芯片DM9000A以及网卡驱动变压器HS9016等。LPC2214为NXP公司推出的基于ARM7TDMI内核的16/32位RISC处理器,功能强大,内置PLL锁相环可以设置CPU的工作频率达60MHz,为高速处理网络协议提供了保证;内部带256kB FLASH和16kB RAM,同时外扩了256k字的SRAM,为嵌入式TCP/IP协议栈提供了必要的内存空间。复位监控芯片CAT1025内部集成了2k位EEPROM,可以将网卡的物理地址、制造厂商等基本信息保存到CAT1025中,网络控制器DM9000A保持默认配置,这样可以省去网卡的配置存储器,减少硬件平台的面积。网络接口硬件框图如图2所示。
系统采用16位模式, DM9000A的EECS引脚保持默认的悬空状态,数据线SD0-SD15直接与LPC2214数据线的低16位D0-D15连接。
为了对DM9000A进行可靠硬件复位,复位引脚PWRST上的复位信号至少保持20ms,CPU的复位芯片CAT1025的复位脉冲宽度典型值为200ms,PWRST与处理器的复位信号nRST同为低电平有效,因此可将这两个引脚相连,这样在系统上电复位处理器的同时也对网络控制器进行复位。
DM9000A的IO 读信号线IOR、写信号线IOW分别与LPC2214的读信号线RD、写信号线WR相连;片选信号CS与处理器的Bank3片选信号CS3相连,因此网络控制器的端口地址IOaddress为0x83000000。读写信号与片选信号都是保持默认设置的低电平有效。
在DM9000A中只有INDEX端口与DATA端口两个寄存器可以直接被CPU直接访问,其它所有内部控制和状态寄存器都是通过这两个端口寄存器间接访问的。网络控制器CMD引脚决定了处理器访问的是哪个端口寄存器:当CMD=0时,主机访问的是INDEX端口寄存器;当CMD=1时,访问的是DATA端口寄存器。设计中将CMD引脚与处理器的地址线A2相连,则DM9000A的2个外部接口端口地址分别为:
INDEX端口地址 = IOaddress+0x00
DATA端口地址 = IOaddress+0x04
实际中INDEX端口寄存器保存的是访问DATA端口寄存器的内部寄存器的地址,因此对DM9000A控制或状态寄存器访问的命令顺序是:
1)写要访问寄存器的地址到INDEX端口;
2)通过DATA端口来读/写数据。
3、网络接口的软件设计
以太网接口电路的工作原理是:在系统上电时,处理器通过总线对DM9000A完成初始化后,DM900A进入数据收发等待状态;当处理器要向以太网发送数据帧时,先通过上层协议函数对数据进行封装,然后通过总线逐字节发送到DM9000A的发送缓冲区中,将数据长度等信息填充到DM9000A相应的寄存器中,使能发送命令后,DM9000A自动将数据进行MAC组帧并发送出去;当接收到以太网数据帧时,处理器首先检测帧的合法性,保存正确的数据帧,然后将正确的数据帧发送到上层协议进行处理。
网络接口的软件设计主要有底层网卡驱动程序和上层通信协议两大部分,网卡的驱动程序包括网卡芯片的初始化、以太网数据帧发送和接收。
3.1 DM9000A的初始化
为了启动网络控制器DM9000A,并使之处于接收和发送就绪状态,必须对其进行初始化。DM9000A的初始化主要是设置一些关键的寄存器,具体流程如下:
1)设置通用寄存器GPR的Bit[0](PHYPD位)为0,启动PHY。
2)设置网络控制寄存器NCR的Bit[0] (RST位)为1,进行软件复位。
3)设置网络控制寄存器NCR,进行网络工作模式设置。
4)设置中断屏蔽寄存器IMR的Bit[7](PAR位)为1,使能RX/TX缓冲器的内存读/写地址指针的自动返回功能。
5)写6字节的以太网节点地址到物理地址寄存器PAR中。
6)读取网络状态寄存器NSR清除TX状态标志,读取中断状态寄存器ISR清除中断状态标志。
7)设置中断屏蔽寄存器IMR的Bit[0]/Bit[1],使能发送和接收中断。
8)设置接收控制寄存器RCR的Bit[0](RXEN)为1,使能接收功能。
完成上述初始化后,网络控制器就可以正常启动和收发数据包了。
3.2 发送数据包
DM9000A内部有16kB的SRAM用来作为收发数据的缓冲区,其中地址从0x0000到0x0BFFF共3kB空间用来作为发送数据缓冲区,可以同时保存2个完整的以太网帧,在设计中将发送缓冲区看作2个独立发送缓存区,可分别标记为index I和index II。发送过程如下:
LPC2214首先通过写寄存器MWCMD将要发送的一帧数据写入index I中,将该帧数据的长度写入长度寄存器FCH和FDH中;然后将发送控制寄存器TCR的bit[1]置位,启动发送该帧数据,DM9000A自动对发送缓存区中的数据进行以太网组帧后,开始发送index I中的数据。在发送index I中数据同时,将下一帧数据写入index II中,当index I中的数据发送完成后,将index II中数据长度写入长度寄存器,启动网络控制器发送index II中的数据,同时将要发送的下一帧数据写入index I。在程序中可以通过检测网络状态寄存器NSR的Bit[2](TX1END位)、Bit[3](TX2END)是否为1判断哪个缓存区中的数据发送完毕。通过对这两个发送缓存区进行如此轮流操作,不仅可以避免在单一发送缓冲区模式下向发送缓存区写入数据包时容易产生覆盖了上一次没有发送完的数据的错误操作,也不必等待上次数据发完后再向发送缓存区写入当前的数据,从而有效的避免了处理器的等待时间,提高数据发送的效率和速度。
实际中为了提高效率,可采用中断方式发送数据包。首先CPU利用上层协议函数将要发送的数据按照规定的格式进行封装并写到DM9000A发送缓冲区中;然后由上层协议函数启动发送数据包的第一帧数据,利用发送结束中断程序来对发送结果作相应处理。产生发送完成中断后,中断程序先读取网络状态寄存器NSR来判断是哪个发送缓存区中的数据发送完成,然后读取相应的发送状态寄存器来判断数据是否发送成功,若失败则重发该缓存区数据,若成功则判断是否还有数据帧要发送,若有,则启动发送另一个缓冲区中的数据,同时通知上层协议函数将下一帧数据写入空的发送缓存器中。中断服务程序流程图如图3所示。
3.3 数据接收程序
在16kB的内部SRAM中地址为0x0C00~0x3FFF的13kB空间用来作为数据接收缓存区,它是一个环形结构。当使能数据接收功能后,DM9000A就会自动接收数据,一旦它接收完一帧数据后就会产生一个接收中断,接收的数据包的格式为:
前4个字节为一个数据包的包头,它包含了一个数据包的基本信息。第一个字节为接收标志:若是01H表明收到数据,若是00H则说明没有收到数据,若是其他值则需要重新启动PHY;第二个字节为状态标志,由此可以判断接收到的数据包类型以及数据正确与否;接下来的2个字节为数据包的长度,低字节在前,高字节在后;最后是接收到的数据。
通过MRCMDX寄存器来读取接收标志,通过MRCMD寄存器来读取接收状态、数据包长度和数据包数据等内容。根据帧的格式可以分析接收到的数据的正确性,保存正确的数据并上层协议处理。接收数据包的中断服务程序流程图如图4所示。
3.4 上层通信协议
嵌入式系统的以太网互连采用的通信协议都是TCP/IP协议。TCP/IP协议一般分为4层,即网络接口层、网络层、传输层和应用层。TCP/IP协议是一个网络协议族,协议按上面所述不同的网络层次进行开发,每一层分别负责不同通信功能,相应的有不同的协议。由于嵌入式硬件资源和实时性要求的限制,其TCP/IP协议要求占用存储资源尽可能小,处理速度足够快,因此要针对应用的特点对TCP/IP进行必要的裁减与优化。LwIP是瑞士计算机科学院的Adam Dunkels等开发的一套用于嵌入式系统的开放源代码TCP/IP协议栈,其大部分源码是用ANSIC语言编写的便于移植。LwIP既可以移植到操作系统上,又可以在无操作系统的情况下独立运行。LwIP协议栈实现的重点是在保证主要功能的基础上占用尽量少的RAM,很适合在嵌入式系统中使用[7]。
μC/OS-II是专门为嵌入式应用设计的实时操作系统,它采用了基于优先级的占先式实时内核,包含了任务管理、时间管理、任务间的同步(信号量、邮箱、消息队列)和内存管理等功,具有源代码开放、方便裁减,可移植性强等特点[8]。在μC/OS-II操作系统下移植LwIP主要注意以下几点:
(1)修改头文件中一些与CPU和C编译器相关的定义,如数据长度、CPU存储字的高地位顺序等,这些都要与μC/OS-II定义的数据长度等参数一致。此外,一般情况下C语言的结构体struct是4字节对齐的,但是在处理数据包的时候,LwIP使用的是通过结构体中不同数据的长度来读取相应的数据的,因此一定要在定义struct的时候使用mpacked关键字,让编译器放弃struct的字节对齐。
(2)LwIP 协议在设计时为了适应不同的操作系统,没有在代码中使用和某一个操作系统相关的系统调用和数据结构,而是在LwIP 和操作系统之间增加了一个操作系统的封装层,该封装层主要完成系统的初始化、任务的同步、时间管理和内存管理的功能。因此需要利用μC/OS-II操作系统的函数完成LwIP 中信号量、消息队列、定时器和线程创建等功能的封装。这部分内容都在sys_arch.h和sys_arch.c两个函数中。
(3)原始API函数接口是基于回调(callback)的应用程序接口,调用这种接口虽然增加变成难度,但有利于提高应用程序的性能,节约系统资源。
4、结论
本文介绍的以ARM处理器LPC2214为核心,采用DM9000A作为网络接口芯片的嵌入式以太网接口结构简单、体积小、功耗低、价格适中,在工业、信息家电等领域有广泛的应用前景。