单片机的TCP IP数据传输 毕业论文.doc_第1页
单片机的TCP IP数据传输 毕业论文.doc_第2页
单片机的TCP IP数据传输 毕业论文.doc_第3页
单片机的TCP IP数据传输 毕业论文.doc_第4页
单片机的TCP IP数据传输 毕业论文.doc_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

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

文档简介

摘要 tcp/ip 协议是目前网络上应用最广泛的网络传输协议。如果单片机能够用此协议 传输数据,那就意味着单片机控制的电子产品也能进入互联网。这将带来一系列好处, 能进行远程控制,能够获得数据共享。对于实现基于 51 单片机的 tcp/ip 数据传输。 需要以单片机为载体,熟悉 tcp/ip 协议栈,熟悉 keilc 编程,熟悉电子线路知识。通 过对 tcp/ip 协议的研究和参考 uip 协议栈,在单片机上对 uip 进行了移植。最终实现 了计算机以 tcp/ip 协议的通信方式对单片机进行了监控。设计过程中主要是构架 tcp/ip 协议栈,编写网卡驱动程序,编写应用程序。此通信协议的特点是代码和 ram 使用量较小,可用在对通信速度要求不高的电子设备上。因为以单片机为载体,所以 此通信协议无需太强调对速度的提高,反而应该把重点放在减少多余的功能,来减少 对 ram 的使用。设计过程并没让单片机接入互联网,控制单片机是通过上位机在局域 网内对其进行连接的。 关键词:嵌入式,单片机,tcp/ip 协议 1 abstract tcp/ip is the most widely used protocol at the present network transport protocol. if single-chip can transmit data thought this protocol , that means those electronics controlled by single-chip can connect to the internet . this will get a series of benefits, for remote controlling, for data sharing and so on. for realizing the tcp/ip data transmission on single-chip . need to be familiar with single-chip, familiar with tcp/ip protocol stack and keilc programming, familiar with knowledge of electronic circuits. for researching the tcp/ip protocol and referencing the uip protocol stack, than transplanted the uip on single-chip. finally completed the computer communicating to single-chip used by tcp/ip . this design is mainly on finishing the tcp/ip protocol stack, writing the driver of net chip, writing application programs. this communication protocol is characteristic of less code and ram usage, can using in the low speed requirements of the electronic. because of taking single-chip as the carrier, this protocol shouldnt be stressed on the speed of communication , instead it should be focused on reducing redundant functions for reducing the use of ram. the design is not accessing the internet, it is controlled by computer using the connection by lan. keywords: embedded system , single-chip , tcp/ip 2 目录 1 绪论 1 2 tcp/ip 协议 2 2.1 tcp/ip 简介 2 2.2 tcp/ip 的分层体系结构 .2 2.3 tcp/ip 协议族 3 2.4 ip 地址、子掩码 .5 3 uip 介绍 6 3. 1 u i p 协议栈及其体系结构 .6 3.2 协议栈接口 .7 3.2.1 设备驱动程序接口 7 3.2.2 应用程序接口 9 3.3 uip 协议栈提供的主要接口汇总 9 4 uip 在单片机上移植 .10 4.1 了解 uip 的的主循环代码架构并改写 main 函数 .10 4.2 仿照 uip-1.0unixtapdev.c 写网卡驱动程序 .12 3.2.1 以太网的帧结构 12 4.2.2 以太网的芯片 rtl8019 介绍 13 4.3 设置配置文件 uipopt.h/uip-conf.h17 5 基于 51 单片机的 tcp/ip 协议通信 18 5.1 硬件原理图设计 .18 5.2 主要代码文件说明 .19 5.3 计算机以 tcp/ip 协议通信方式监控单片机 .20 6结论 21 参考文献 22 致谢 22 附录 23 3 1 绪论 现在互联网开始向物联网发展,几乎所有电子产品都有入网的必要性。一旦电子 产品能入网,就能做到对远在千里之外的电子产品进行控制。这将解决在某些恶劣环 境下由人亲自操作电子设备而带来的危险。而单片机自带的串行通信又因传输距离太 短而阻碍其应用范围。而且 tcp/ip 已成为当今计算机网络最成熟、应用最广的互联协 议。internet 采用的就是 tcp/ip 协议,网络上各种各样的计算机上只要安装了 tcp/ip 协议,它们之间就能相互通信。所以只要在单片机上实现居于 tcp/ip 协议的通信,就 能让单片机控制的电子设备进入互联网,实现远程操作,数据共享。这里研究的 tcp/ip 协议栈可在各种 8 位 cpu 上运用。设计过程在保留协议的基本构架的基础上尽 可能进行精简,以提高传输速度。并且对数据缓存进行压缩,以减少对单片机 ram 的 使用。在国外已有专门机构对在嵌入式设备上实现 tcp/ip 进行研究。例如由瑞典计算 机科学学院(网络嵌入式系统小组) 的 adam dunkels 开发的 uip。uip 协议栈是专门为嵌 入式系统而设计的协议栈,其源代码由 c 语言编写,并完全公开。还有 uc/ip(mew- kip)是为为控制其设计的一个 tcp/ip 协议栈。代码基于 bsd(很像所有其它栈)但对非 常小的覆盖范围功能有所减少。它当前为 linux 和 dos 目标而建。在国内 zlip 是专门 为 51 单片机设计的嵌入式 tcp/ip 协议栈,可以在有操作系统和没有操作系统情况下运 行,具有代码量适中、运行速度快、用户接口简单、兼容 bsd socket 接口的特点。实 现了 tcp、udp、icmp 、 arp 协议,zlweb 实现了 http 协议。支持多 tcp 连接、多 udp 连接同时运行,可以用于 51 单片机 tcp/ip 上网解决方案。但目前不管国内还是国 外在单片机 tcp/ip 协议的研究上,都存在以下的问题:数据传输速度慢,对 ram 的使 用量都大于单片机自带 ram。要在单片机上实现 tcp/ip 协议需要对计算机网络知识有 所了解。清楚理解 tcp/ip 协议在计算机网络的位置和作用。深入了解 tcp/ip 协议栈的 构成。对单片机结构功能熟悉,能驱动一般的以太网卡,掌握 c 编程。本文主要对 uip 移植到单片机上进行研究,难点是了解 tcp/ip 协议栈的构成和对网卡的驱动。在实现 计算机通过网络对单片机控制的电子设备进行监控的功能时还要对计算机进行相应的 配置。 4 2 tcp/ip 协议 2.1 tcp/ip 简介 tcp/ip(transmission control protocol/internet protocol)的简写,中文译 名为传输控制协议/因特网互联协议,又叫网络通讯协议,这个协议是 internet 最基 本的协议、internet 国际互联网络的基础,简单地说,就是由网络层的 ip 协议和传输 层的 tcp 协议组成的。tcp/ip 定义了电子设备(比如计算机)如何连入因特网,以及 数据如何在它们之间传输的标准。tcp/ip 是一个四层的分层体系结构。高层为传输控 制协议,它负责聚集信息或把文件拆分成更小的包。低层是网际协议,它处理每个包 的地址部分,使这些包正确的到达目的地。 tcp/ip 已成为当今计算机网络最成熟、应用最广的互联协议。internet 采用的就是 tcp/ip 协议,网络上各种各样的计算机上只要安装了 tcp /ip 协议,它们之间就能相互 通信。运行 tcp/ip 协议的网络是一种采用包(分组)交换网络。tcp/ip 协议是由 100 多个协议组成的协议集,tcp 和 ip 是其中两个最重要的协议。tcp 和 ip 两个协议分别 属于传输层和网络层,在 internet 中起着不同的作用。 2.2 tcp/ip 的分层体系结构 tcp/ip 是一个分层体系结构。 最高层:应用层为协议的最高层,在该层应用程序与协议相配合,发送或接 收数据。tcp/ip 协议集在应用层上有远程登录协议(telnet) 、文件传输协议(ftp) 、 电子邮箱协议(smtp) 、域名系统(dns)等,它们构成了 tcp/ip 的基本应用程序。 高层:即传输层,其主要协议有 udp(user data protocol)和传输控制协议 (tcp,transmission control protocol) 。tcp 协议是在 ip 协议提供的服务基础上, 支持面向连接的、可靠地传输服务,是负责聚集信息或把文件拆分成更小的包。这些 包通过网络传送到接收端的 tcp 层,接收端的 tcp 层把包还原为原始文件;udp 协议时 直接利用 ip 协议进行 udp 数据报的传输,因此 udp 协议提供的是无连接、不保证数据 5 完整到达目的地的传输服务。由于 udp 不使用很繁琐的流控制或错误恢复机制,只充 当数据报的发送者和接收者,因此,udp 比 tcp 简单得多。 低层:是网际协议(ip,internet protocol),它处理每个包的地址部分,使 这些包正确的到达目的地。网络上的网关计算机根据信息的地址来进行路由选择。即 使来自同一文件的分包路由也有可能不同,但最后会在目的地汇合。 tcp/ip 使用客户 端/服务器模式进行通信。tcp/ip 通信是点对点的,意思是通信是网络中的一台主机与 另一台主机之间的。tcp/ip 与上层应用程序之间可以说是“没有国籍的” ,因为每个客 户请求都被看做是与上一个请求无关的。正是它们之间的“无国籍的”释放了网络路 径,才使每个人都可以连续不断的使用网络。 许多用户熟悉使用 tcp/ip 协议的高层 应用协议。包括万维网(www,world wide web)的超文本传输协议(http) ,文件传 输协议(ftp) ,远程网络访问协议(telnet)和简单邮件传输协议(smtp) 。这些协议通 常和 tcp/ip 协议打包在一起。 使用模拟电话调制解调器连接网络的个人电脑通常是 使用串行线路接口协议(slip)和点对点协议(p2p) 。这些协议压缩 ip 包后通过拨号 电话线发送到对方的调制解调器中。 与 tcp/ip 协议相关的协议还包括用户数据报协 议(udp) ,它代替 tcp/ip 协议来达到特殊的目的。其他协议是网络主机用来交换路由 信息的,包括 internet 控制信息协议(icmp) ,内部网关协议(igp) ,外部网关协议 (egp) ,边界网关协议(bgp) 。 2.3 tcp/ip 协议族 之所以说 tcp/ip 是一个协议族,是因为 tcp/ip 协议包括 tcp、ip、udp、icmp、rip、telnet、ftp、smtp、arp、tftp 等许多协议,这些协议一 起称为 tcp/ip 协议。以下是协议族中一些常用协议英文名称和用途: tcp(transport control protocol)传输控制协议 ip(internet protocol)因特网协议 udp(user datagram protocol)用户数据报协议 icmp(internet control message protocol)互联网控制信息协议 smtp(simple mail transfer protocol)简单邮件传输协议 snmp(simple network manage protocol)简单网络管理协议 6 ftp(file transfer protocol)文件传输协议 arp(address resolution protocol)地址解析协议 tcp/ip 协议簇分为四层,ip 位于协议簇的第二层(对应 osi 的第三层),tcp 位于协议簇的第三层(对应 osi 的第四层)。 tcp 和 ip 是 tcp/ip 协议簇的中间两层,是整个协议簇的核心,起到了承上启 下的作用。 1.ip 网际协议 ip 是 tcp/ip 的心脏,也是网络层中最重要的协议。 ip 层接收由更低层(网络接口层例如以太网设备驱动程序)发来的数据包, 并把该数据包发送到更高层-tcp 或 udp 层;相反,ip 层也把从 tcp 或 udp 层接收来 的数据包传送到更低层。ip 数据包是不可靠的,因为 ip 并没有做任何事情来确认数据 包是按顺序发送的或者没有被破坏。ip 数据包中含有发送它的主机的地址(源地址) 和接收它的主机的地址(目的地址) 。 高层的 tcp 和 udp 服务在接收数据包时,通常假设包中的源地址是有效的。 也可以这样说,ip 地址形成了许多服务的认证基础,这些服务相信数据包是从一个有 效的主机发送来的。ip 确认包含一个选项,叫作 ip source routing,可以用来指定 一条源地址和目的地址之间的直接路径。对于一些 tcp 和 udp 的服务来说,使用了该 选项的 ip 包好像是从路径上的最后一个系统传递过来的,而不是来自于它的真实地点。 这个选项是为了测试而存在的,说明了它可以被用来欺骗系统来进行平常是被禁止的 连接。那么,许多依靠 ip 源地址做确认的服务将产生问题并且会被非法入侵。 2.tcp 如果 ip 数据包中有已经封好的 tcp 数据包,那么 ip 将把它们向上传送 到 tcp 层。tcp 将包排序并进行错误检查,同时实现虚电路间的连接。tcp 数据包中包 括序号和确认,所以未按照顺序收到的包可以被排序,而损坏的包可以被重传。 tcp 将它的信息送到更高层的应用程序,例如 telnet 的服务程序和客户程序。 应用程序轮流将信息送回 tcp 层,tcp 层便将它们向下传送到 ip 层,设备驱动程序和 物理介质,最后到接收方。 面向连接的服务(例如 telnet、ftp、rlogin、x windows 和 smtp)需要高度 的可靠性,所以它们使用了 tcp。dns 在某些情况下使用 tcp(发送和接收域名数据库) , 7 但使用 udp 传送有关单个主机的信息。 3.udp udp 与 tcp 位于同一层,但它不管数据包的顺序、错误或重发。因此,udp 不 被应用于那些使用虚电路的面向连接的服务,udp 主要用于那些面向查询 -应答的服 务,例如 nfs。相对于 ftp 或 telnet,这些服务需要交换的信息量较小。使用 udp 的 服务包括 ntp(网络时间协议)和 dns(dns 也使用 tcp) 。 欺骗 udp 包比欺骗 tcp 包更容易,因为 udp 没有建立初始化连接(也可以称 为握手) (因为在两个系统间没有虚电路) ,也就是说,与 udp 相关的服务面临着更大 的危险。 4.icmp icmp 与 ip 位于同一层,它被用来传送 ip 的的控制信息。它主要是用来提供 有关通向目的地址的路径信息。icmp 的redirect信息通知主机通向其他系统的更 准确的路径,而unreachable信息则指出路径有问题。另外,如果路径不可用了, icmp 可以使 tcp 连接体面地终止。 ping 是最常用的基于 icmp 的服务。 5. tcp 和 udp 的端口结构 tcp 和 udp 服务通常有一个客户/服务器的关系,例如,一个 telnet 服务进程 开始在系统上处于空闲状态,等待着连接。用户使用 telnet 客户程序与服务进程建立 一个连接。客户程序向服务进程写入信息,服务进程读出信息并发出响应,客户程序 读出响应并向用户报告。因而,这个连接是双工的,可以用来进行读写。 两个系统间的多重 telnet 连接是如何相互确认并协调一致呢?tcp 或 udp 连 接唯一地使用每个信息中的如下四项进行确认: 源 ip 地址 发送包的 ip 地址。 目的 ip 地址 接收包的 ip 地址。 源端口 源系统上的连接的端口。 目的端口 目的系统上的连接的端口。 端口是一个软件结构,被客户程序或服务进程用来发送和接收信息。一个端 口对应一个 16 比特的数。服务进程通常使用一个固定的端口,例如,smtp 使用 25、xwindows 使用 6000。这些端口号是广为人知的,因为在建立与特定的主机或 服务的连接时,需要这些地址和目的地址进行通讯。 8 2.4 ip 地址、子掩码 目前,在 internet 里,ip 地址是一个 32 位的二进制地址,为了便于记忆,将它 们分为 4 组,每组 8 位,由小数点分开,用四个字节来表示,而且,用点分开的每个 字节的数值范围是 0255,如 ,这种书写方法叫做点数表示法。 ip 地址可确认网络中的任何一个网络和计算机,而要识别其它网络或其中的计算 机,则是根据这些 ip 地址的分类来确定的。一般将 ip 地址按节点计算机所在网络规 模的大小分为 a,b,c 三类,默认的网络屏蔽是根据 ip 地址中的第一个字段确定的。 以下只对 c 类进行详述: c 类地址的表示范围为: 到 55,默认网络屏蔽为: ;c 类地址分配给小型网络,如一般的局域网,它可连接的主机数量是 最少的,采用把所属的用户分为若干的网段进行管理。c 类网络用前三组数字表示网络 的地址,最后一组数字作为网络上的主机地址。 一个 c 类地址是由 3 个字节的网络地址和 1 个字节的主机地址组成,网络地 址的最高位必须是 “110” ,即第一段数字范围为 192223。每个 c 类地址可连接 254 台主机,internet 有 2097152 个 c 类地址段(32*256*256) ,有 532676608 个地址 (32*256*256*254) 。 rfc 1918 留出了 3 块 ip 地址空间(1 个 a 类地址段,16 个 b 类地址段,256 个 c 类地址段)作为私有的内部使用的地址。在这个范围内的 ip 地址不能被路由到 internet 骨干网上;internet 路由器将丢弃该私有地址。 ip 地址类别 rfc 1918 内部地址范围 a 类 到 55 b 类 到 55 c 类 到 55 子网掩码是一个 32 位地址,用于屏蔽 ip 地址的一部分以区别网络标识和主机标识, 并说明该 ip 地址是在局域网上,还是在远程网上。用于子网掩码的位数决定 于可能的 子网数目和每个子网的主机数目。在定义子网掩码前,必须弄清楚本来使用的子网数 和主机数目。 通过 ip 地址的二进制与子网掩码的二进制进行与运算进行定某个设备 9 的网络地址。也就是说通过子网掩码分辨一个网络的网络部分和主机部分子网掩码一 旦设置,网络地址 和主机地址就固定了。相对于使用子网掩码来识别网络地址,早期 的使用类别进行网络地址的分类存在着地址大量浪费的不足。 10 3 uip 介绍 3. 1 u i p 协议栈及其体系结构 uip 由瑞典计算机科学学院 (网络嵌入式系统小组)的 adam dunkels 开发。其源代码 由 c 语言编写,并完全公开,所有代码和相关说明文档可以到 /adam/uip/下载。最新版本是 uip1.0 版本,u l p 1.0 是一个适用于 8 /1 6 位机上的小型嵌入式 tcp/ ip 协议栈 ,简单易用 ,资源占用少是它的设计特点。 其设计重点放在 ip、 icmp 和 tcp 协议的实现上 ,协议虽然也同时实现了 udp 和 arp 协议,但仅将其作为可选模块 。uip 1.0 处于网络通信的中间层 ,其上层协议在 这里被称之为应用程序 ,而下层硬件或固件被称之为网络设备驱动。tcp / ip 协议组 中的链路层协议如 ppp 等可由 uip 之下的设备驱动实现;应用层协议如 http、 ftp、smtp 等可由 ulp 之上的应用程序实现。这样的设计方式大大减小了协议 代码量和 ra m 占用量。表 1 列出了 ulp 在 stc89c516rd 上代码和 ram 占用情况。 表 3.1 uip 代码和 ram 占用情况 协议模块 代码大小/b 使用 ram/b arp 1324 118 ip/icmp/tcp 3304 360 http 994 110 校验和函数 636 0 数据包缓存 0 400 总和 6258 988 3.2 协议栈接口 ulp 协议通过一系列接口函数与底层系统和上层应用程序通信,它内部的协议集合 对外部系统来说是透明的,从而增强了该协议的通用性和独立性,可以非常方便地移 植到不同系统和应用平台。图 1 描述了 ulp、底层系统和应用程序三者之间的调用关系。 其中 ulp 提供了 3 个函数给底层系统 : uip_init ( ) ,uip_input ( ), uip_periodic ( ) 11 。应用程序向 ulp 提供一个调用函数 uipappcall ( ) ,在网络事件或计时事件发生时进 行调用,同时 uip 也要向应用程序提供一些与协议栈的接口函数,应用程序根据接口函 数提供的信息或者状态 ,执行相应的操作。 图 3.1 u l p 底层系统和应用程序之间的调用关系 3.2.1 设备驱动程序接口 u i p 内核中有两个函数直接提供给底层设备驱动程序。一个是 uip_ input ( ) , 当 设备驱动程序从网络层收到的一个数据包时要调用这个函数 ,设备驱动程序必须事先 将数据包存入到 uipbur 中包长放到 uip_len,然后交由 uip_input ( ) 处理。当函数返回 时,如果 uip_ len 不为 0,则表明有带外数据( 如 syn,ack 等) 要发送。当需要 arp 支 持时,还需要考虑更新 arp 表示 或发出 arp 请求和回应。以下代码即为设备驱动程 序从网络层收到的一个数据包后的处理过程 : #define buf ( ( struet uip_ethhdr *) i0) uip_arp_out(); ethemet_devicedriver_send(); 从本质上来说 uip_nput()和 uip_periodic()在内部是一个函数,即 uip_process(u8_flag) uip 的设计者将 uip_process (uip-data)定义成 uip_input ( ) ,而将 13 uip_process(uip_timer)定义成 uip_periodic(),因此从代码实现上来说是完全复用的。 3.2.2 应用程序接口 uip 使用基于事件的程序模式,应用程序由 c 语言函数实现。当收发数据 、新连 接建立或者数据需要重新传输时,uip 都会调用应用程序。同时,应用程序还要周期查 询是否有新的数据收发。因为应用程序只提供了一个回调函数 ,所以应用程序还要把 不同的网络服务映射到不同的端口和连接。uip 在接受到底层传来的数据包后 ,如果 需要送上层应用程序 处理 ,就调用 uip_appcll()。同时,uip 设置结构体 uip_eonn 指针指向当前连接。uip_conn 记录一条 tcp 连接的所有相关信息,它是维持 uip 运行 的关键结构,定义如下 : struct tcp_conn u8_t tcpstateflags;/ t c p 的状态和标志 u16_t lport,rpert ;/ 当地和远端端口 u16_t fipodar 2 ;/ 远端的地址 u8_t rcv_nxt 4 ; / 下一个要接收的序列号 u8_t sod _xt 4 ;/上一个已发送的序列号 u8_t aek -nxt 4 ;/对端下一个应答序列号 u8_t timer ;/ 重传时间 u8_t nrtx ;/计算特殊段的重发数量 u8_t mss ;/ 连接中最大分段的大小 u8_t appstate uip_appstate_size ; 为了将用户的应用程序挂接到 uip 中, 必须将宏 uip_appcall ( ) 定义成实际的 应用程序函数名,这样每当某个 ulp 事件发生时,内核就会调用该应用程序进行处理 。如果要加入应用程序状态的话 ,必须将宏 uip_appstate_size 定义成应用程序状态 结构体的长度。在应用程序函数中,依靠 ulp 事件检测函数来决定处理的方法,另外可 以通过判断当前连接的端 口号来区分处理不同的连接。 14 3.3 uip 协议栈提供的主要接口汇总 提供的接口在 uip.h 中,为了减少函数调用造成的额外支出,大部分接口函数以 宏命令实现的。 1初始化 uip 协议栈:uip_init() 2处理输入包:uip_input() 3处理周期计时事件:uip_periodic() 4开始监听端口:uip_listen() 5连接到远程主机:uip_connect() 6接收到连接请求:uip_connected() 7主动关闭连接:uip_close() 8连接被关闭:uip_closed() 9发出去的数据被应答:uip_acked() 10在当前连接发送数据:uip_send() 11在当前连接上收到新的数据:uip_newdata() 12告诉对方要停止连接:uip_stop() 13连接被意外终止:uip_aborted() 15 4 在单片机上移植 uip 4.1 了解 uip 的的主循环代码架构并改写 main 函数 下面是 uip 协议栈的主控制循环。 void main(void) /*省略部分代码*/ /*设置 tcp 超时处理时间和 arp 老化时间*/ tim er_set( tim er_set( /*定时器初始化*/ init_t imer(); /*协议栈初始化*/ uip_init(); uip_arp_init(); /*应用层初始化*/ exam ple1_init(); /*驱动层初始化*/ etherdev_init(); /*ip 地址、网关、掩码设置*/ uip_ipaddr(ipaddr , 192,168,1,9); uip_sethostaddr(ipaddr); uip_ipaddr(ipaddr , 192,168,1,16); uip_setdraddr(ipaddr); uip_ipaddr(ipaddr , 255,255,255,0); uip_setnetm ask(ipaddr); /*主循环*/ while(1) 16 /*从网卡读数据*/ uip_len = etherdev_read(); /*如果存在数据则按协议处理*/ if(uip_len 0) /*收到的是 ip 数据,调用 uip_input()处理*/ if(buf-type = htons(uip_ethtype_ip) uip_arp_ipin(); uip_input(); /*处理完成后,如果 uip_buf 中有数据,则调用 etherdev_send 发 送出去*/ if(uip_len 0) uip_arp_out(); etherdev_send(); /*收到的是 arp 数据,调用 uip_arp_arpin()处理*/ else if(buf-type = htons(uip_ethtype_arp) uip_arp_arpin(); if(uip_len 0) etherdev_send(); /*查看 0.5s 是否到了,到了则调用 uip_periodic 处理 tcp 超时程序*/ 17 els e if(timer_expired( for(i = 0; i 0) uip_arp_out(); etherdev_send(); /*查看 10s 是否到了,到了则调用 arp 处理程序*/ if(tim er_expired( uip_arp_ timer(); return ; 4.2 仿照 uip-1.0unixtapdev.c 写网卡驱动程序 4.2.1 使用以太网的帧结构 下面以 ieee 802.3 数据帧来分析数据链路层和网卡的工作内容。ieee 802.3 是电气 和电子工程师协会(ieee )制定的一种描述物理层和数据链路层的实现方法的网络协议, 18 主题是在多种物理媒体上以多种速率采用 csma/cd 访问方式。其规定的帧结构如下: 表 4.1 以太网(802.3 )帧结构 pr(前导码) :包括了 7 个字节的二进制“1” 、 “0”间隔的代码,即 101010 共 56 位。当帧在链路上传输时,接收方就能建立起同步,因为这种“1” 、 “0”间隔 的传输波形为一个周期性方波。同时也指明了传输的速率(10m 和 100m 的方波频率 不一样,所以 100m 网卡可以兼容 10m 网卡) 。 sd(帧数据定界符) :它是长度为 1 个字节的 10101011 二进制序列,此码表 示表示下面跟着的是真正的数据。 da(目的地址) :目的以太网的物理地址,由 48 位二进制组成(6 个字节),说 明该帧传输给哪个网卡。如果地址为 ffffffffffff(广播地址) ,则该网络上的所有 网卡都能接收到本帧数据。这个地址和下面的 sa 就是我们常说的网卡的 mac 地址。 具体信息我们待会介绍。 sa(源地址) :48 位,说明该帧的数据是哪个网卡发的,即发送端的网卡物理 地址(mac ) 。 length/type (长度/数据类型):指示后面的数据属于什么类型。如 0800h 表示 数据为 ip 包,0806h 表示数据为 arp 包。这样,交给网络层后就可以由相应的协议 对后面的数据解析。如果这个字段小于 0600h 的值,则表示数据包的长度,在单片机 的网络编程中不考虑这种用法。 data(数据段) :由网络层负责发送和解析的数据,因为以太网帧传输的数据包 最小不能小于 64 字节,最大不能超过 1518 字节。除去 14 字节为 da、sa、 type 以及 4 字节的 fcs,data 不能超过 1500 字节。如果不够 46(6418) 字节,余下的由 pad 填充。 pad(填充位) :当 data 的数据不足 46 字节时,缺少的字节需要补上(可补 任意值) 。 fcs(帧校验序列) :由 32 位(4 字节)循环冗余校检码(crc)组成,其校验 范围不包括前导码 fr 及帧数据定界符 sd。此序列由发送端网卡自动生成,自动填充 19 到帧的最后。一般情况下,接收端网卡对收到的数据校验后也不会将 fcs 放到数据中 上报。由于网卡的自动管理,并且前导码 fr 和帧数据定界符 sd 的值是固定的,也由 网卡自动生成和插入。所以,网络层向网卡发送的数据或者网络层接收到的数据一般 是由 da、sa、type 和 data 组成(data 不足 46 字节需要用 pad 补齐) 。如表二。 假如网络层的一个 ip 包要发送出去,首先要填充接收网卡的地址和本网卡的地址 (mac 地址) ,同时将 type 填充成 0800h,紧跟着就是发送的数据。网卡获取到这些 数据后会组成物理传输帧发送出去。 表 4.2 网络层管理的帧结构 由以太网的帧结构知道,在数据链路层就需要使用 mac 地址(即物理地址)进 行通讯,mac 地址是数据的第一道关卡,由硬件自动识别来接收。因此, mac 地址 就像是是网络设备的“身份证”一样,需要具有全球唯一性。在做测试时,可以修改 mac 地址,但也应该保证本地网络里 mac 的唯一性。 以太网的 mac 地址由 48bit (6 字节) 组成,如 08:02:10:3a:85:23 就是一个 mac 地址。前 24 位(08:02:10)是由生产网卡的厂商向 ieee 申请的厂商地址,后 24 位 (3a:85:23)是由厂家自己分配。每个厂商必须确保它所制造的每个以太网设备都具有 相同的前三个字节以及不同的后三个字节,这样就可保证世界上每个以太网设备都具 有唯一的 mac 地址。网卡的 mac 地址通常是由生产厂家烧入网卡的 eprom 中 (ne2000 系列网卡常用 93c46,在网卡上可以找到) 。 mac 地址又可以分成 3 类: (1)广播地址:只能用作目的地址。如果一个以太网帧的目的地址是广播地 址,则网络中的所有设备都能接收和处理该帧。广播地址的每一位都是 1,即: ff:ff:ff:ff:ff:ff。 (2)组播地址:也只能用作目的地址。如果一个帧的目的地址是组播地址, 那么网络中预先定义的一组设备都能接收并处理该设备。以太网网 mac 的最高有 效字节的最低位为 1 表示以太网帧是组播帧。如 01:03:52:3a:85:23 就是组播 地址。101 的最低位为 1。 20 (3)单机地址:除了广播和组播的地址就是单机地址,非广播和组播数据包 就要与这个地址匹配了才能被接收和处理。 4.2.2 使用以太网的芯片 rtl8019 rtl8019 是 ne2000 系列中一种,因此其它 ne2000 系列网卡编程思路也相符合 的。 (ne2000 是一个由 novell 公司所创立并且被业界广泛采用的网络卡的标准,大多 数 isa 网卡都与 ne2000 兼容,如 nat sem i 的 dp83902,davicom 的 dm9008,nsi 的 dp8390,mxic 的 mx98905 等) 。rtl8019 是 10m 网卡芯片。 rtl8019 有 3 种工 作方式:(1)跳线方式,网卡的 i/o 和中断由跳线决定。 (2)免跳线方式,网卡的 i/o 和中断由外接的 93c46 里的内容决定。 (3)即插即用方式,由软件进行自动配置 plug and play(pnp ) 。电脑上常使用即插即用方式,单片机不予考虑。对免跳线方式, 需要在芯片外部接 eeprom 93c46(很多电脑用的网卡上能找到这芯片,大家有兴趣可 以看下) ,用来保存网卡的 mac 地址等参数,同时,需要单片机操作 rtl8019 来控制 93c46 的读写,不仅费钱还费力,一般也不采用。参数保存可放在单片机自身的 eeprom 里,上电后写入网卡芯片就可以了。因此,单片机比较适合使用跳线方式。 怎么才能让 rtl8019 工作在跳线方式下呢?这个由 jp 管脚(第 65 脚)决定。当 jp 管脚为低电平时,rtl8019 工作在即插即用方式或免跳线方式,高电平时处于跳线方 式。因此,我们将 jp 管脚接高电平(vcc ) ,使用跳线方式,网卡的 i/o 和中断就不是 由 93c46 的内容决定而是由跳线决定。主要使用的跳线如下: ios3,ios2,ios1,ios0 管脚(第 85,84,82,81 脚)决定了芯片的 i/o 地址。 如下表,我们将 is03-io0 都悬空(内部下拉,即都为 0) ,则芯片 i/o 的起始地址是 300h。 21 表 4.3 iosx 引脚接法对应的芯片 i/o 地址 芯片的 btrm 地址由 bs4,bs3,bs2,bs1 管脚(第 72,71,69,68,67)决定, btrm 在电脑里用来做无盘工作站的时候用到,这样可以从网卡进行引导,而需要从 硬盘的 c 盘等引导系统。由于单片机里不需要使用,可以不管。aui 管脚(第 64 脚) ,该管脚决定使用 aui 还是 bnc 接口。高电平时使用 aui 接口,悬空(为内部下拉 的低电平)时使用 bnc 接口。网卡的接口一般是 bnc 的可以支持 8 线双绞或同轴电 缆。因此将该引脚悬空即可。网络媒体类型由 pl0,pl1(第 74,77 脚)决定。 表 4.4 plx 引脚功能 其它重要管脚的连线: 22 所有 gnd 管脚接地,vcc 管脚接5v 的电源。 rstdrv(第 33 脚):用来复位网卡,我们一般将它连到单片机的管脚上,用来 快速复位 rtl8019,这个管脚拉高复位持续时间至少 2ms,建议拉高 100ms 左右再拉 低来达到复位效果。 iocs16b 管脚(第 96 脚)是 16 位/8 位数据位的选择脚。如果这个管脚下 拉,则选择 8 位模式,如果这个管脚接高电平,将选择 16 位的模式。由于单片机是 8 位的数据总线,因此这个管脚需要下拉。 iowb (第 30 脚) , iorb (第 29 脚)接到单片机的 p3.6, p3.7 (/wr , /rd) ,用来控制读写时序。 x1 和 x2(第 50,51 脚)用来接 20m 的晶振。tpin+,tpin- 管脚(59, 8)和 hd,ld 管脚(45, 46)都接隔离变压器上,通过 rj45 接口与网络相连。 由于 使用 8 位数据位,sd0 sd7 管脚接到单片机的 p0.0p0.7 管脚,sd8sd15 不需要 使用。 sa0sa19 为网卡的地址线, 共 20 根,这个需要怎么接呢?前面说过, ios3, ios2,ios1,ios0 管脚决定了芯片的 i/o 地址。假如将 is03-io0 都悬空(内部 下拉,即都为 0) ,则芯片 i/o 的起始地址是 300h。从 rtl8019 的芯片手册中知道, i/o 访问的寄存器只有 32 个,在后面会介绍这些寄存器。即需要直接访问的网卡寄存 器是 300h31fh。将它转化为二进制的地址线的电平就很直观了。如下表。 表 4.5 地址线电平 地址 线 a 19 a 18 a 1 7 a 16 a 15 a 14 a 13 a 12 a 11 a 10 a 9 a 8 a 7 a 6 a 5 a 4 a 3 a 2 a 1 a 0 300h 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 x x x x x 31fh 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 1 1 1 1 从表中知道,sa19sa10,sa7sa6 固定接低电平(地) ,sa9-sa8 固定接高电 平(vcc) 。只要控制 sa4sa0 就可以访问到 300h 到 31fh 的 32 个寄存器。于是, 我们将这 5 根地址线接到单片机的 p0.4p0.1 上。为了采用外部地址访问,将 p2 口的 p2.7 接到 rtl8019 的片选 cs 上。这样,如果单片机访问 8000h 地址就相当于 访问 rtl8019 的 300h 了,访问 801fh 地址就相当于访问 rtl8019 的 31fh。地址映射 关系为: 表 4.6 单片机 p2,p0 引脚与 rtl8019 地址映射关系 单片机地址端口 p2,p0 网卡(i/o) 10000000 00000000(8000h) 300h 10000000 000xxxxx 3xxh 10000000 0001 1111 (801fh) 31fh 23 程序里对寄存器使用如下定义来访问: #define address_shift 0x0100 #define rtl_base_address 0x8000 #define cr (rtl_base_address + address_shift * 0x00) #define pstart_wpage0 (rtl_base_address + address_shift * 0x01) #define pstart_rpage2 (rtl_base_address + address_shift * 0x01) #define pstop_wpage0 (rtl_base_address + address_shift * 0x02) #define pstop_rpage2 (rtl_base_address + address_shift * 0x02) #define bnry_wpage0 (rtl_base_address + address_shift * 0x03) #define bnry_rpage0 (rtl_base_address + address_shift * 0x03) #define curr_wpage1 (rtl_base_address + address_shift * 0x07) #define curr_rpage1 (rtl_base_address + address_shift * 0x07) #define tpsr_wpage0 (rtl_base_address + address_shift * 0x04) #define tpsr_rpage2 (rtl_base_address + address_shift * 0x04) #define tbcrl_wpage0 (rtl_base_address + address_shift * 0x05) #define tbcrh_wpage0 (rtl_base_address + address_shift * 0x06) #define isr_wpage0 (rtl_base_address + address_shift * 0x07) #define isr

温馨提示

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

评论

0/150

提交评论