基于单片机以太网通信模块的软件设计_第1页
基于单片机以太网通信模块的软件设计_第2页
基于单片机以太网通信模块的软件设计_第3页
基于单片机以太网通信模块的软件设计_第4页
基于单片机以太网通信模块的软件设计_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第1章绪论1.1选题的目的与意义随着信息技术的飞速开展,Internet应用己经深入到生活的方方面面。传统的互联网应用以PC为中心,现在已开始转向以嵌入式设备为中心,许多嵌入式设备尝试着接入Internet。嵌入式系统己经广泛地渗透到航空、汽车电子、工业生产、通信、消费电子以及人们日常生活的方方面面。IA〔InternetAppliance〕概念现在甚为流行,这说明互联网应用进入嵌入式互联网的时代己经来临。中国计算机学会〔ChinaComputerFederation〕于1999年6月举行了“嵌入式系统及产业化在中国的开展前景〞研讨会,专家们探讨了嵌入式系统在当今计算机工业中的地位及其网络化问题,认为下一代网络设备中嵌入式设备将大大增加,互联网上传输信息的70%将会来自小型嵌入式系统。随着嵌入式系统更广泛的应用以及网络的进一步普及,嵌入式系统接入网络已成为嵌入式系统应用的一个重要方向和必然结果。嵌入式Web效劳器是嵌入式系统网络化应用的重要方面。把嵌入式系统作为Web效劳器与Internet相连接很适合于远程监控和生产过程控制等系统,通过特定的手段采集数据,利用远程浏览器通过访问嵌入式Web效劳器就可以直接监控现场设备的运行,提高生产效率和管理水平。在嵌入式系统上实现WEB效劳器,不仅克服了嵌入式系统用户界面死板甚至无界面的缺点,同时也为嵌入式系统的远程应用提供了一种人机可交互的方便的操作方式,从而使嵌入式MCU以WEB效劳器的方式提供应客户端。在嵌入式系统网络化应用日趋流行的今天,设计和实现微处理器的网络接入是一个很有现实意义的问题,可以实现基于Internet的远程数据采集、远程控制、自动报警、上传/下载数据文件、自动发送E-mail等功能,同时也为IST〔InternetSensorTechnology网络传感器技术〕、HVAC〔家庭环境自动控制〕、局部环境自动监测、智能小区管理、网络自动抄表等技术的应用与开展提供技术保证。8051系列微处理器被广泛应用于参军事、自动控制到PC机上的键盘上等各种应用系统中,很多制造商都可提供8051内核系列单片机,像Intel、Philips、Atmel、Siemens等。这些制造商给51系列单片机参加了大量的性能和外部功能,像I2C总线接口、模拟量到数字量的转换、看门狗、PWM输出等,更加丰富了8051单片机的功能和外围接口。不少芯片的工作频率到达40MHz,工作电压下降到1.5V,由于这些功能都是基于同一个内核,使得8051单片机很适合作为厂家产品的根本构架。同时由于基于8051系列微处理器的硬件系统价格低廉,因此对于那些需要开发低本钱产品的工程来说是一种不错的选择。而伴随着Internet遍布于全世界的每个角落,对于大量低端的以8051系列微处理器为核心的小型嵌入式设备来说,把其作为一个简单的WEB效劳器,借助于Internet来传送各种测量和控制信息,可以使人们在任何时候,任何地方实时监控现场设备和数据,还可以在远方对现场设备进行诊断和软件升级,具有快速、方便、可靠的特点。因此单片机如何控制以太网网卡控制器进行数据传输,如何嵌入TCP/IP协议使其连接到互联网,这些都具有深远的意义。1.2本课题在国内外的开展现状近几年来,国外投入嵌入式Internet研究的公司逐渐增多,参与研究的公司规模差异也越来越大,大的如Philips、Microsoft、NEC、Motorola等公司,小的那么是一些刚刚成立的高科技公司。下面主要介绍一些国外公司在嵌入式Internet领域的研究状况。1〕iReady公司致力开发各种TCP/IP堆栈处理器硅片解决方案。它己成功开发TCP/IP堆栈技术,这种独特的技术可提供全面的传送卸载支持,确保以太网网络可以发挥极高的性能。多家公司已获许可使用iReady的硬件加速TCP/IP堆栈技术,有关公司包括Toshiba、SeikoInstruments、Sony及AgilenteSeiko公司在此根底上推出IC芯片S7600A芯片,将TCP/IP协议栈用硬件方法予以实现。2〕AcceleratedTechnologies公司开发的NucleusPlus实时核心软件,提供了完整的TCP/IP协议栈,包括全部源程序〔称为NucleusNet,价格约为14995美元〕。3〕美国EmWare公司提出嵌入式微互联网EMIT〔EmbeddedInternetTechnology〕运行技术,即嵌入式微型网络技术,将串口设备接入Internet,实现基于Internet的远程数据采集、智能控制、上传/下载数据文件等功能。松下电工的家庭网络中间件,核心技术即采用的EmWare公司开发的EMIT构架。4〕在工业测控领域,1999年成立的“工业以太网协会〞〔IEA〕正在积极致力于工业以太网现场总线的研究开发,美国OPT022公司采用嵌入式Internet技术,研制开发了“以太网I/O系统〞-SNAPI/O系统,成功应用于工业控制过程、楼宇智能化监控等多项工程中。此外,惠普公司应用IEEE1451.2标准,生产的嵌入式以太网控制器具备10-BaseT接口,运行FTP/HTTP/TCP/UDP协议,应用于传感器、驱动器等现场设备。而国内嵌入式Internet技术的研究才刚刚起步,有一些公司也正在积极研究嵌入式Internet技术,但成果没有国外的丰硕,且大多停留在理论阶段。对工业控制网络领域的理论研究主要局限于现场总线网络上,对建立工业以太网控制网络还未进入到实质研究阶段。在产品开发方面,北京英贝多公司研发出了基于芯片的微型Internet网关和瘦效劳器,为迎接Internet向嵌入式领域开展的第三阶段做好根底性准备。另外武汉力源公司也推出了专用网络接口芯片PS2000以及一款用于连接电子设备和Internet网络的集成电路Webchip,其内部固化了MCUNET协议,该协议与EmGateway和OSGI协议兼容。这种应用系统通过Webchip网络芯片与Gateway连接,再接入Internet。目前国内己经有基于该芯片的相关应用开发。可见,如何通过互联网共享以“微控制器〞〔MCU,MicroControllerUnit〕为中心的小型嵌入式设备相关的信息,也即如何使MCU成为Web效劳器是当今嵌入式研究领域中的一项重要内容。1.3本课题要解决的主要问题本文主要是针对以RAT8019AS单片机为硬件平台的中低档嵌入式系统,用C5l编程语言开发一个适合小型系统使用的轻型嵌入式TCP/IP协议。具体的工作主要有:(1)RTL8O19AS的驱动编程,为TCP/IP协议栈的开发提供易用的接口。(2)从实际本钱出发,本文采用低档单片机直接控制网卡芯片,在单片机中实现TCP/IP协议的方案。(3)在本文对网络协议做了详细的阐述,特别是本设计中需要进行设计的几个协议,IP协议、ARP协议、UDP协议。(4)精简TCP/IP协议的编程,这是本课题的重点所在。(5)联机调试,完成各层协议的测试。第2章TCP/IP协议TCP/IP协议即传输控制协议/网际协议是开展至今最成功的通信协议,它被成功应用于当今所构筑的最大的开放式网络系统Internet之上就是其成功的明证。Internet最初的设计是为了满足美国国防部的需要,今天Internet已经开展得更加商业化,更加面向消费者,尽管根本目的发生了改变,但其最初的所有质量标准(也就是开放式、抗毁性和可靠性)依然是必需的。这些特性包括可靠传输数据、自动检测和防止网络发生错误的能力。TCP/IP是一个开放式的通信协议,开放性意味着在任何组合间,不管这些设备的物理特征有多大差异,都可以进行通信。本章主要介绍了TCP/IP协议分层模型及其工作原理,并按照由下向上的顺序介绍了TCP/IP协议族中最重要的一些协议如ARP、IP、ICMP、UDP、TCP、HTTP等。其中结合本课题的需要,重点介绍了IP协议和TCP协议。如同0SI参考模型,TCP/IP也是一种分层模型。它是由基于硬件层次上的四个概念性层次构成,即应用层、传输层、IP层和数据链路层。图2.1给出了TCP/IP的概念性层次结构图。概念性层次层次之间的传递对象报文或字节流传输协议分组IP数据包特定网络帧图2.1TCP/IP概念性层次结构2.1TCP/IP分层模型的工作原理TCP/IP协议是一个大的协议族,其中一些常用协议在TCP/IP分层模型中所处的位置如表2.1所示。数据包在TCP/IP在协议栈中流动的时候,也是由上至下或由下至上,逐层进行传输的。在TCP/IP参考模型中,每个实体和另一个系统的同层实体按协议进行通讯,而一个系统内实体和上下层间的通讯,那么通过接口进行。表2.1协议在TCP/IP分层模型中的位置应用层HTTPFTPTelnetE-mailDNS等传输层TCPUDPIP层IPICMPARP数据链路层介质访问控制协议MAC,以太网协议物理层网路接口芯片不同系统间同层实体间的数据传输过程如图2.2所示。图2.2数据包在TCP/IP分层模型中的传输过程在整个协议层次结构中,通信协议使用了复用和分解的技术。发送方在报文中参加报文的类型、选用的协议等附加信息,在接收方收到分组后,参考附加信息对收到的分组进行分解,根据其中的协议类型选择相应的协议进行处理,图2.3是IP包的去复用过程。图2.3IP数据报的去复用过程2.2数据链路层协议数据链路层(DataLinkLayer)是TCP/IP协议族的最底层,它负责接受IP数据报并把数据报通过选定的网络发送出去,或者从网络上接收物理帧,抽取出IP数据报,交给IP层。数据链路层一般可再细分为介质访问控制子层MAC和逻辑链路控制子层LLC。MAC子层的协议实现一般是由MAC接口芯片来完成的;而LLC子层的实现一般是由网络接口芯片的驱动程序来完成的。除此之外,数据链路层典型的协议就是地址解析协议ARP(AddressResolutionProtocol)。以太网的网络接口层支持的是48位以太网地址,而网络层支持的是32位的IP地址。ARP协议的功能是为32位IP地址到对应的48位以太网物理地址之间提供动态映射,将上层的仲地址与底层的物理地址进行绑定,它形成了只能使用IP地址的上层协议软件与只能使用物理地址的下层设备驱动程序软件之间的分界线。以太网首部位功能描述48以太网目的地址48以太网源地址16以太网帧类型〔ARP-0X0806IP-X0800〕以太网ARP字段16硬件类型〔以太网-1〕16协议类型〔ARP-0X0806IP-X0800〕8硬件地址的长度〔以字节数计算,ARP请求或应答为6〕8协议地址的长度〔以字节数计算,ARP请求或应答为4〕16操作码〔ARP请求1,ARP应答2〕6发送端以太网地址4发送端的协议地址〔IP地址〕6目的端以太网地址4目的端的协议地址〔IP地址〕图2.4ARP报文格式图当某主机要向以太网中另一台主机发送IP数据时,它首先根据目的主机的IP地址在ARP高速缓存中查询相应的以太网地址,ARP高速缓存是主机维护的一个IP地址到相应以太网地址的映射。如果查到匹配结点,那么相应的以太网地址被写入以太网帧首部,数据包被参加输出队列等候发送。如果查询失败,APR会先播送一个询问目的主机硬件地址的APR报文,等到收到答复后再将数据包发送出去。APR包格式如图2.4所示。2.3IP层协议IP层主要提供传输层数据分片、封装和路由功能以及控制报文的生成与传送效劳。IP层是TCP/IP协议族的核心。IP层的主要协议是网际协议IP(InternetProtocol)和网络控制报文协议ICMP(InternetControlMessageProtocol)。IP协议提供了一种不可靠的、尽最大努力传送的、无连接分组传送效劳。所谓不可靠,指的是不能保证正确传送,分组可能丧失、重复、延迟或不按序传送,而且效劳不检测这种情况,也不通知发送方和接收方。所谓无连接,是指每个分组都是独立处理的,可能经过不同的路径,有的可能丧失,有的可能到达。所谓尽最大努力传递,指的是协议栈软件尽量传送每个分组,只有当资源用尽或底层网络出现故障时,才会出现不可靠效劳。2.3.1IP首部结构IP数据报的首部格式如图2.5所示。普通的IP首部长为20个字节,除非含有选项字段。01516314位版本4为首部长度8位效劳类型〔TOS〕16位总长度〔字节数〕20字节16位标识3位标志13位偏移8位生存时间〔TTL〕8位协议16位首部效验和32位源IP地址32位目的IP地址选项〔如果有〕数据图2.5IP数据报的首部格式IP数据报首部各数据域的含义分析如下:◆IP版本号:目前的协议版本号是4,因此IP有时也称为工Pv4。IP协议的下一个版本是Ipv6,这也是当今互联网界研究的热点。◆首部长度:指明IP首部中32bit字的数目,包括任何选项。由于它是一个4比特的字段,因此IP首部最长为60个字节。.◆效劳类型:TOS(TypeofService)指效劳是否是最小时延,最大吞吐量,最高可靠性,或最小费用之中的一种。目前大多数TCP/IP栈的实现都不支持TOS特性。◆总长度:总长度字段是指整个IP数据报的长度,以字节为单位。利用首部长度字段和总长度字段,就可以知道IP数据报中数据内容的起始位置和长度。由于该字段长16比特,所以IP数据报最长可达65535字节。◆标识:标志字段唯一的标志主机发送的每一份数据报,通常每发送一份报文,它的值就会加1。◆标志和片偏移:这两个数据域主要用于IP数据报的分片。◆生存时间TTL:生存时间字段TTL(time-to-1ive)设置了数据报可以经过的最多路由器数,它指定了数据报的生存时间。◆协议字段:该字段说明IP数据报所采用的上层协议的类型。IP数据报的去复用就是根据该协议字段进行的。◆首部校验和:首部检验和字段是根据IP首部计算的检验和码。为了计算一份数据报的IP检验和,首先把检验和字段置为0。然后,对首部中每个16bit进行二进制反码求和(整个首部看成是由一串16bit的字组成),结果存在检验和字段中。它不对首部后面的数据进行计算。当收到一份IP数据报后,同样对首部进行校验。由于接收方在计算过程中包含了发送方存在首部中的校验和,因此,如果首部在传送过程中没有发生任何错误,那么接收方计算的结果应该为全1。如果不是全1(即校验和错误),那么IP就丢弃收到的数据报,但是IP层并不生成过失报文,而是由上层协议去发现数据报的丧失并进行重传。2.3.2ICMP协议简介最初设计的ICMP仅仅为了路由器向主机报告投递出错原因,但开展到现在ICMP在两台主机上的协议软件之间能提供了通信,因此产生了多种ICMP报文。尽管每个ICMP报文有自己的格式,但它们都以相同的三个字段开始:比特整数的报文类型(TYPE)字段用来标识报文;一个8比特的代码(CODE)字段提供有关报文类型的进一步信息,以及一个16比特校验(CHECKSUM)字段。各种报文类型如下列图2.6所示。类型字段ICMP报文类型0回送应答3目的地不可达4源站抑制5重定向8回送请求11数据报超时12数据报参数错13时间戳请求14时间戳应答17地址掩码请求18地址掩码应答图2.6ICMP报文类型2.4传输层协议传输层(TransportLayer):传输层为其上层运行的应用层协议提供不同层次的端到端的通信效劳。TCP/IP协议模型定义了两个传输层协议:传输控制协议TCP(TransmissionControlProtocol)和用户数据报协议UDP(UserDatagramProtocol)。UDP提供无连接的、开销最小的、快速但不可靠的端到端通信效劳。主要应用于三个领域:1)依赖播送方式传输的TCP/IP控制应用,例如域名解析效劳DNS、引导协议BOOTP和动态主机配置协议DHCP等;2)有规那么重传信息的面向网络的效劳,例如路由信息协议RIP和简单网络控制协议SNMP等;3)对一传输实时性和效率要求高且对分组丧失不敏感的Web多媒体业务。TCP为应用层协议提供了面向连接的、可靠的效劳。应用于数据传输量大且可靠性要求高的业务,例如远程通信网络协议Telnet、文件传输协议FTP、简单邮件传输协议SMTP和超文本传输协议HTTP等。TCP全权负责确保所有数据段都已平安正确地到达了目的端,并且能重组成正确的序列。TCP协议包括:面向连接的效劳、分组确认、过失检测、分组重传、分组排序和流量控制。2.4.1UDP首部UDP协议首部(包含UDP伪首部)的各字段如图2.7所示。32位源IP地址UDP伪首部32位目的IP地址08位协议16位UDP长度16位源端口号16位目的端口号16位UDP长度16位UDP效验和数据填充字节〔0〕图2.7UDP首部格式UDP首部各字段的含义:◆源、目的端口号:端口号是用来区分同样使用UDP协议的不同发送进程和接收进程的。◆UDP长度:UDP的长度字段指的是UDP首部和UDP数据的总长度。◆UDP校验和:UDP的校验和不同于仲校验和,它覆盖UDP首部和UDP数据,但校验算法跟IP校验是相同的。2.4.2TCP首部TCP数据被封装在一个IP数据包内。首部的数据格式如下列图2.8所示,如果不计任选字段,它通常是20个字节。015163116位源端口号16位目的端口号32位序列号32位确认序号4位首部长度保存〔6位〕URGACKPSHPSTSYNFIN16位窗口大小16位效验和16位紧急指针选项数据图2.8TCP首部格式TCP首部各字段的含义和功能:◆端口号:源端口号和目的端口号,用于寻找发端和收端的应用进程。这两个端口值加上IP首部中的源端IP地址和目的端IP地址组成四元组,可以唯一确定一个TCP连接。◆序号:TCP序号用来标志从TCP发端向TCP收端发送的数据字节流,它表示在这个数据报文端中的第一个数据字节。序号是32bit的无符号数,序号计满后缭绕到0开始计数。当建立一个新的TCP连接时,在发送出去的同步包中,序号字段包含由这个主机选择的该连接的初始序号ISN(InitialSequenceNumber),该主机要发送的第一个数据字节的序号为工SN加l。◆确认序号:确认序号包含发送确认的一端所期望收到的下一个序号,确认序号应该是上次已成功收到的数据字节序号加1。只有ACK标志为1时,确认序号字段才有效。◆今首部长度:该字段给出TCP首部中32bit字的数目。◆6个标志位:这6个标志位用处很大。1)URG紧急指针有效。2)ACK确认序号有效。3)PSH接收方应该尽快将这个报文段交给应用层。4)RST重建连接。5)SYN同步序号用来发起一个连接。6)FIN发端完成发送任务。◆窗口大小:该字段TCP的滑动窗口协议中用到。标志着当前可用的数据发送、接收缓冲区的大小。◆校验和:校验和覆盖了整个TCP报文段,是一个强制性的字段,一定由发端计算和存储,并由收端进行验证。◆紧急指针:紧急指针是一个正的偏移量,和序号字段的值相加表示紧急数据的最后一个字节的序号。TCP的紧急方式是发送端向另一端发送紧急数据的一种方式。2.5应用层协议应用层(ApplicationLayer):应用层功能有许多不同的形式,包含所有产生网效劳请求的高层协议,为希望通信的进程提供端到端的、与网络无关的传输效劳。HTTP协议(HypertextTransferProtocol,超文本传输协议)是用于从WWW(WorldWideWeb)效劳器传输超文本到本地浏览器的传送协议。它可以使浏览器更加高效,使网络传输减少。由于HTTP协议是基于请求/响应模式的(相当于客户机/效劳器模式)。一个客户机与效劳器建立连接后,发送一个请求给效劳器,请求方式的格式为:统一资源标识符(URL)、协议版本号,后边是MIME(通用Internet邮件扩充)信息包括请求修饰符、客户机信息和其它可能的内容。第3章网络接口芯片的驱动在OSI网络模型中,数据链路层的逻辑链路控制子层(LLC)的局部工作是由网络接口芯片驱动程序来做的,其它局部那么集成在网络接口芯片中由硬件实现。本章首先分析了RTL8019AS的内部RAM结构,然后在此根底上分复位和初始化,数据包的接收以及数据包的发送三个局部,重点分析了RTL8019AS的驱动程序的编写过程,并给出了相应的程序编制流程图。驱动程序封装了网络接口芯片的底层操作,为以后协议栈程序的编写带来了很大的方便。3.1RTL8019AS的内部RAM结构RTL8029AS和RTL8019AS的内核其实是一样的,都是NE2000兼容的存放器结构,都有一样大小的RAM,读取和操作的方法都是一样的。事实上对RTL8029AS的驱动跟RTL8019AS的驱动除了PCI接口配置局部不同外,其余NE2000兼容的存放器局部的驱动都是一样的。下面只对RTL8019AS进行讨论。D15D0PROMALIASEDPROM8K*16BUFFERRAMALIASEDPROMALIASEDBUFFERRAM0000H001FH4000H7FFFH8000HC000H图3.1RTL8019AS的内部RAM结构图RTL8019AS有两块RAM,一块16k字节的RAM的地址为0x4000~0x7fff,一块32字节的RAM的地址为0x0000~0x00lf。其内部RAM的存储是分页的,每256个字节称为一页。RTL8019AS的内部RAM分布如图3.1所示。其16位内部RAM地址的高8位表示的是RAM的页地址,例如:0x4000~0x40ff是一页,我们称该页为第0x40页。整个RAM空间的利用情况如表3.1所示:表3.1RTL8019AS内部RAM的利用情况页码地主范围附注00x00000x00ff可以使用0x010x3F0x01000x3fff空,不能使用0x400x7F0x40000x7fff可以使用0x800xFF0x80000xffff跟0x00000x7fff的内容是一样的〔不要使用它〕其中,第0页的内存又叫Prom,是Ne2000兼容的网络接口芯片都有的。Prom实际上只有32字节,地址范围为0x0000~0x00lF,其它地址0x0020~0x00FF存储的内容跟0x0000~0x00lf局部是完全重复的。RTL8019AS内部RAM的0x0000~0x001F地址段存储的内容为:表3.2RTL8019AS的内部RAM的0x0000~0x001F段的内容地址内容地址内容0x0000以太网地址第1个字节0x0001以太网地址第1个字节0x0002以太网地址第2个字节0x0003以太网地址第2个字节0x0004以太网地址第3个字节0x0005以太网地址第3个字节0x0006以太网地址第4个字节0x0007以太网地址第4个字节0x0008以太网地址第5个字节0x0009以太网地址第5个字节0x000A以太网地址第6个字节0x000B以太网地址第6个字节0x000C--0x001F其他内容〔不同公司生产芯片的定义可能不同〕我们可以发现以太网地址被重复存储。这主要是为了适应RTL8019AS的8位和16位的两种数据总线宽度。我们一般使用8位的数据总线,一次传输一个字节,而16位宽度的数据总线是一次传输2个字节,适合使用16位的单片机或DSP作为处理器。对于己经做在网卡上的RTL8019AS来说,它的prom是网卡在复位的时候从网卡上的EEPROM(一般使用93C46)里读出来的。网卡上的EEPROM一般是用来存储本网卡的物理地址及其它一些配置信息的。因此可以直接读取RTL8019AS的Prom来获得本地的物理地址。但是本地的物理地址最终是由RTL8019AS中的存放器MARO,MARI,MAR2,MAR3,MAR4,MAR5决定,而不是93C46,也不是prom。而这几个存放器的内容需要用户自己编写程序写入。一般可以读出Prom里的物理地址,然后写入到这6个存放器里。如果没有使用93C46,那么Prom也是可以不使用的,这时要在RTL8019AS的初始化程序中指定一个物理地址。在本课题中,我虽然预留了EEPROM(93C46)的位置,但为了节省资源没有使用,而是将本地的物理地址放在了RTL8019AS的驱动程序中,在其初始化的时候予以配置。RTL8019AS的RAM中从0x4000到0x7fff共16k字节的这段内存是网络接口芯片用来作为接收和发送数据包的缓冲区用的。该16k字节的RAM实际上是双端口的RAM,可以同时被网络接口芯片内部的本地总线读写,也可以被外部用户(比方CPU)读写,相互之间不影响。但其内部的本地总线的读写优先级要比外部用户读写的优先级高。图3.2RTL8019AS内部RAM的总线仲裁逻辑所谓16kB的双端口RAM就是说有两套总线连结到该RAM,一套总线A是网络接口芯片的本地总线读写16kB的双端口raln,另一套总线B是主处理器用来读写这16k双端口RAM的。总线A又叫LocalDMA,总线B又叫RemoteDMA。在图3.2中,虚线框住的局部为RemoteDMA,也就是处理器对RTL8019AS的RAM进行读写的总线,对8019来说就是ISA总线。没有框住的局部(左边的局部),就是LocalDMA即网络控制器对其本身的RAM进行读写的总线。其中的地址总线没有画出来,只画了数据总线。实际在RAM的内部还有一些总线仲裁的逻辑,这里也没有画出来。所谓总线仲裁的逻辑就是为了实现两套总线都能进行对RAM的读写而不互相冲突,而进行的一些判断、控制逻辑。RTL8019AS的LocalDMA读写网卡RAM的优先级比处理器读写其RAM的优先级要高的意思是:1.当两者都要请求控制总线时,LocalDMA优先获得控制权。2.高优先级的LocalDMA可以中断RemoteDMA,而RemoteDMA不能中断LocalDMA。3.在RemoteDMA,也就是处理器对网卡RAM读写的过程进行中可以被LocalDMA中断。LocalDMA中断RemoteDMA,然后进行LocalDMA的数据传输,LocalDMA传输完毕之后继续刚刚被中断的RemoteDMA,以完成RemoteDMA的传输。RemoteDMA被打断多久的时间取决于FTI,FT0的取值,其中FT1和FT0是RTL8019AS的DCR配置存放器的位。在本课题中,主处理器用的是单片机,单片机的总线要比RTL8019AS的DMA总线慢很多。RTL8019AS的DMA总线大概在10Mhz,而单片机的总线大概1Mhz,所以在RemoteDMA的过程中不需要特别的等待时序。3.2RTL8019AS驱动过程3.2.1RTL8019AS的复位及初始化RTL8019AS在进行具体操作之前,需要进行一系列的系统复位及初始化工作。其具体过程如下:1.对RTL8019AS进行复位:这是RTL8019AS驱动程序需要做的第一个内容,由于我们将RTL8019AS设置为跳线模式,而不是即插即用的模式,RTL8019AS.PDF中介绍的PLUGandPLAY的一些过程,我们不需要做,因为单片机的资源有限,能够减少的操作都尽量减少。对RTL8019AS的复位端口(1FH)的读或写都将复位RTL8019AS,RTL8019AS内部将执行复位过程,读写是随意的。2.选择存放器页面:向命令存放器CR(00H)写入21H,选择存放器页面0,以进行后面的操作。3.设置数据结构存放器DCR(0EH)为49H。4.设置方式状态存放器TCR(0DH)为00H。5.设置接收状态存放器RCR(0CH)为1FH。6.划分缓冲区为接收缓冲区和发送缓冲区,并建立接收缓冲环。具体的工作是设PSTART和PSTOP存放器的值。7.设置CR为61H,选择页面1。8.设置RTL8019AS的物理地址存放器,把PAR0(0lH)-PARS(06H)设置为适宜的物理地址。9.设置当前页面存放器CURR(07H)为PSTART+1,即4DH。10.去除组播地址存放器,即MAR(08H)-MAR(OFH)为00H。11.设置CR为21H,选择存放器页面0。12.去除中断状态存放器ISR(07H)为OFFH。13.设置中断屏蔽存放器IMR(0FH)为0FFH,即屏蔽掉所有的中断。14.设置发送配置存放器TCR(0DH)为00H。15.设置CR为22H,芯片进入工作状态。驱动程序提供应上层协议的复位及初始化函数是Init8019()。3.2.2RTL8019AS的数据包接收程序的编写RT18019AS的16k字节RAM地址范围为0x4000~0x7fff,一共有64页,这64页RAM是被用来接收和发送数据包的。一般把前面的12页用来存放发送的数据包,后面的52页用来存放接收的数据包。当然也可以配置成前面52页用来接收,而后面的12页用来发送。或者也可以不使用那么多的缓冲区,比方只用32页来作为缓冲区,前面的6页用来发送,接下来的26页用来接收,而把空出来的32页给单片机使用,用来存储别的数据。图3.3RTL8019AS数据包接收缓冲示意图RT18019AS的16k的RAM中哪些页被用来做接收缓冲区,哪些页被用来做发送缓冲区由两个存放器决定:PSTART(pagestartregister)页起始存放器PSTOP(pagestopregister)页终止存放器在设置了接收缓冲区之后,那么接收到的第一个数据包放在哪里呢?这是由CURR存放器决定的。控制接收缓冲区操作的有两个存放器:当前指针存放器CURR和边界指针存放器BNRY。CURR是RTL8019AS写缓冲区的指针,指向此时要写的页。BNIW是读指针,指向用户已经读走的页。我们可以通过判断CURR指针和BNRY指针的距离确定是否收到新数据包,当CURR和BNRY不等时说明收到新数据包。这里收到的数据包中,在正常的以太包前面还有4个字节的附加信息,尾部还有4个字节的CRC校验码。前4个字节的格式如下:ReceiveStatusNextPacketPointerReceiveByteCount0ReceiveByteCount1图3.4以太包前面4个字节的含义第一个字节表示接收包的状态,其内容和RSR接收状态存放器的值完全一样。第二个字节表示下一个包的存放页地址,读取该数据包后要根据该值更新BNRY存放器。后两个字节表示数据包的大小。在接收一个数据包的时候要先读出这4个字节,通过第一字节的接收状态判断数据包接收是否正确,如果是正确接收的数据包,那么根据ReceiveBytecount的值修改远程DMA计数器RBCRI、RBCR0的值,读出整个数据包。最后根据NextPacketPointer的值更新BNRY存放器,以进行下一个包的接收。对于数据包的接收,驱动程序提供应上层协议的接口函数有两个。一个是判断有无数据包到达的函数B00LPacketAvailable(),如果有包到达那么返回1,如果没有那么返回0值。另一个重要的接口函数是unsignedintReadPacket(void*buf),该函数的参数是指向接收缓冲区的指针,返回值是接收到数据包的大小,如果读取失败那么返回0值。ReadPacket函数的工作流程如图3.5所示。图3.5数据包接收流程在读取数据包的时候可以根据编程的需要,读出包末尾的4字节CRC校验码或者不读出,而直接废弃掉。3.2.3RTL8019AS的数据包发送程序的编写数据包的发送局部也提供两个接口函数,一个是SendPacketReady()用来查询RTL8019AS是否已将前面的数据包发送完,如果是那么返回1,否那么返回0值。该函数实现起来很简单,只是查询一下状态存放器即可。另一个发送函数SendPacket(void*buf,intlen)有两个参数,一个是指向发送缓冲区的数据指针,另一个是需要发送的数据包的长度。发送的过程分两步,首先将数据从系统内存通过RemoteDMA传到RTL8019AS的发送存储区,然后进行LocalDMA将数据传到FIFO并发送出去,其流程如下。图3.6数据包的发送流程第4章精简TCP/IP协议的设计与实现4.1TCP/IP协议的设计结构TCP/IP协议的设计是本课题的重点与难点所在。协议是用C51语言编程实现的,采用的是Keil公司的KeilC51编译器。本章将重点给出TCP/IP协议的总体设计及各个协议的实现过程。TCP/IP协议是一个由许多协议组成的协议族,TCP/IP协议具有很强的灵活性、可扩展性和适应性,可以满足各种网络环境下的不同需求。下面就是我设计的TCP/IP协议所支持的协议及该协议栈的性能指标。ARP协议:ARP协议用来做IP地址到物理地址的映射工作。如果把嵌入式系统作为一个Web效劳器的话,远端的客户机只是知道效劳器的冲地址,这就需要ARP协议的支持来获得对应的效劳器物理地址。IP协议:IP协议是TCP/IP协议的根底。IP协议和UDP协议、TCP协议结合紧密,本协议的IP协议完成IP包的分解与复用,不支持IP分包功能,支持主机路由选择。ICMP协议:ICMP协议用来实现检测目的站的可达性和状态的功能。给客户端提供一个检测网络状态的手段。UDP协议:UDP协议提供不可靠的快速连接。在协议栈中实现这一功能主要是满足我们的协议栈用在工业以太网时的需求。局域网内通信不像跨路由器的远程通信,网络环境良好,丢包的现象较少发生。可靠性问题可以由UDP协议之上的应用层的软件来保证。TCP协议:TCP协议提供一种可靠的数据通讯。TCP协议是TCP/IP协议栈中必不可少的,也是最为复杂的一种协议。我们要实现的应用层的HTTP协议就是基于TCP协议而实现的。本课题协议的设计就是基于TCP/IP协议参考模型进行的,如图4.1所示。TCP/IP参考模型精简TCP/IP协议结构图4.1精简TCP/IP协议结构与TCP/IP参考模型的比照从图中可以看出,TCP/IP协议中各个模块分工明确,分别完成各自的功能,所以在协议编程时可以有一个清晰的思路。设计协议时,只需按照要求调用驱动程序提供的封装好的标准接口函数即可,底层的细节问题这里无需考虑。TCP/IP协议栈与应用层程序的接口设计成类似于SocketAPI标准的一种API接口,将整个TCP/IP协议的内部实现封装起来,并提供应一个方便易用的编程接口。由于整个TCP/IP协议栈比拟复杂,在设计过程中需要编写很多的函数,这就需要作一个系统的规划。在协议栈软件的设计中,在纵向层面上贯穿始终的有两条主线:数据包的接收与协议解包过程,数据的协议打包与发送过程。下面我将以软件流程图的方式分别讲述一下它们的工作过程。图4.2数据的协议打包与发送流程图4.3数据包的接收与解包流程TCP/IP协议中一些很重要的参数是作为协议的全局参数(可以是全局变量,也可以是全局常量)来定义的。通过修改这些全局参数,可以灵活的改变协议的某些重要特性,比方设定本地IP地址、网关地址、网络掩码,修改发送、接收数据缓冲区的大小,改变协议栈各种定时器的定时间隔等。这些修改可以动态的进行,就是在协议运行的过程中进行动态的设置。当然也可以静态的进行设置,修改完后再重新编译协议即可。下面列举一些重要的全局参数,它们的定义都包含在协议的头文件tcpip.h中。◆本地IP地址:#defineMYIP_1192//LocalIPAddress#defineMYIP_2168#defineMYIP_30#defineMYIP_41◆子网掩码:#defineSUBMASK_1255//subnetmask#defineSUBMASK_2255#defineSUBMASK_3255#defineSUBMASK_40◆网关地址:#defineGWIP_1192//standardgateway#defineGWIP_2168//usedifRemoteIP#defineGWIP_30//isnopartofour#defineGWIP_4100//localsubnet◆发送缓冲区的最大值:#defineMAX_TCP_TX_DATA_SIZE512◆接收缓冲区的最大值:#defineMAX_TCP_RX_DATA_SIZE256◆以太帧中的协议类型:#defineFRAME_ARP0x0806#defineFRAME_IP0x0800◆全局Socket状态变量SocketStatus:这一个字节的全局状态变量包含4个状态位和4的错误标志位,分布如图4.4所示:Bit7SOCK_ERRBit6SOCK_ERRBit5SOCK_ERRBit4SOCK_ERRBit3SOCK_TX_BUF_RELEASEDBit2SOCK_DATAAVAILABLEBit1

SOCK_CONNECTEDBit0SOCK

_ACTIVE图4.4SocketStatus标志位分布图4.2ARP协议的实现ARP协议功能是进行IP地址与以太网地址之间的转换。因为我们在向对方主机发送数据的时候,知道对方的IP地址,但可能并不知道其以太网物理地址,而要想发送基于以太网的IP包就必须知道目的物理地址,这个任务就是由ARP协议来完成的。ARP的具体工作包括发送ARP请求和响应对方的ARP请求,以及动态的维护一个ARP高速缓存。当TCP/IP协议的IP包发送之前需要填充IP头部和以太协议头部,即需要填充目的物理地址,这时IP协议模块就会查询系统的ARP高速缓存,看是否有对应于目的IP地址的物理地址,如果有那么直接将之填充到协议头部中。如果没有找到,那么会调用ARP协议模块以播送的形式发送ARP即请求,同时翻开一个ARP定时器,如果在规定的时间内没有响应的话,那么将IP包以播送的形式发送出去。如果在规定的时间内收到对方的ARP应答包的话,如果目的IP地址跟本机IP地址一致,那么取出ARP应答包的源物理地址填充到,等待发送包的目的物理地址字段。同时还要把该IP地址、物理地址对添加到系统ARP高速缓存中。如果收到一份目的端为本机的ARP请求包后,ARP协议模块会把本机硬件地址填充进去,然后用两个目的端地址分别替换两个发送端地址,并把操作字段置为2,然后调用网络接口芯片驱动程序提供的发送函数将该ARP应答包发送出去。ARP请求、应答包的头部格式如下,其中ETH_DATA_OFS是以太帧的数据段相对偏移量。//ARP头部定义#defineARP_HARDW_OFSETH_DATA_OFS+0//硬件类型#defineARP_PROT_OFSETH_DATA_OFS+2//协议类型#defineARP_HLEN_PLEN_OFSETH_DATA_OFS+4//硬件地址长度#defineARP_OPCODE_OFSETH_DATA_OFS+6//协议地址长度#defineARP_SENDER_HA_OFSETH_DATA_OFS+8//发送端硬件地址#defineARP_SENDER_IP_OFSETH_DATA_OFS+14//发送端IP地址#defineARP_TARGET_HA_OFSETH_DATA_OFS+18//目的硬件地址#defineARP_TARGET_IP_OFSETH_DATA_OFS+24//目的IP地址在ARP协议模块的设计中比拟关键的一块是ARP高速缓存的设计。在通用计算机系统中,ARP高速缓存一般设计成双向数据链的形式,这样整个缓存可以方便的动态增减。4.3ICMP协议的实现我们这里要实现ICMP协议,主要是为了响应对方主机使用的PING命令发出的回显请求,这主要是为对方提供一个测试本地的Web效劳器是否可达的一个手段。本系统的ICMP只要求实现很简单的功能,所以编程很简单。如果收到的是ICMP包那么IP协议模块会将之转给ICMP模块处理,ICMP判断如果是回显请求包的话,那么按要求构造回显应答包,然后调用底层协议函数发送出去即可。下面是ICMP包的定义://ICMPdefinitions#defineICMP_TYPE_CODE_OFSIP_DATA_OFS+0//typeofmessage#defineICMP_CHKSUM_OFSIP_DATA_OFS+2//checksum#defineICMP_DATA_OFSIP_DATA_OFS+4//data#defineICMP_HEADER_SIZE44.4IP协议的实现针对嵌入式应用的特点,本系统的TCP/IP协议栈的IP模块不支持路由器对IP模块要求的功能,从而省去了IP_Forward程序的实现过程。该IP模块也不支持多IP地址,也无需实现IP包的分组与重装,这样IP模块局部实现起来就比拟简单了。它主要由处理IP输入的IP_Input程序和处理IP输出的IP_Output两局部组成。IP_Input是用来从网络接口芯片接收到IP数据包后,首先验证IP包的正确性,如果无误那么根据IP包头部的协议字段进行分发,送到相应的传输层协议进行处理。图4.5IP_Input的处理流程图IP_Input中验证IP包的正确性是要验证IP的版本号是否为IPv4和IP包的长度是否不小于IP包的最小长度,如果不满足那么说明是无效数据包,应该丢弃。IP协议字段用于IP包分发,定义如下:#definePROT_ICMP1//ICMP包#definePROT_TCP6//TCP包#definePROT_UDP17//UDP包IP_Output的工作是将上层协议送来的数据包加上IP头部信息,选路并发送出去。这里说的IP选路是指主机选路而不是路由器的选路,发送IP包前查看发送的目的IP地址是否和本机处在同一个子网中,如果是那么直接发送,否那么需要将IP包发送到默认的路由器上。IP数据包格式定义如下://IPv4layerdefinitions#defineIP_VER_IHL_TOS_OFSETH_DATA_OFS+0#defineIP_TOTAL_LENGTH_OFSETH_DATA_OFS+2#defineIP_IDENT_OFSETH_DATA_OFS+4#defineIP_FLAGS_FRAG_OFSETH_DATA_OFS+6#defineIP_TTL_PROT_OFSETH_DATA_OFS+8#defineIP_HEAD_CHKSUM_OFSETH_DATA_OFS+10#defineIP_SOURCE_OFSETH_DATA_OFS+12#defineIP_DESTINATION_OFSETH_DATA_OFS+1#defineIP_DATA_OFSETH_DATA_OFS+20#defineIP_HEADER_SIZE204.5UDP协议的实现UDP协议的实现比拟简单。UDP协议模块把上层应用程序传来的数据包加上源端口和目的端口号,计算校验和并填充,然后发给IP模块即可。DP如果接收到IP模块送来的数据包只需进行校验,无误后根据端口号送给上层应用程序即可。这里边比拟重要的一块就是UDP校验和的计算问题。该算法称为网际校验和算法,它是把被校验的数据每16位进行累加,然后取反,假设数据字节长度为奇数,那么数据尾部补一个字节的0凑成偶数。此算法适用于Ipv4、ICMPv4、IMPV4、ICMPv6、UDP和TCP校验和,更详细的信息可以参考RFC1071。下面是Cheeksum的程序:unsignedintCalcCheeksum(void*add,unsignedintcount){registerlongsum=0;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论