嵌入式系统TCPIP网络解决方案.docx
《嵌入式系统TCPIP网络解决方案.docx》由会员分享,可在线阅读,更多相关《嵌入式系统TCPIP网络解决方案.docx(21页珍藏版)》请在冰豆网上搜索。
![嵌入式系统TCPIP网络解决方案.docx](https://file1.bdocx.com/fileroot1/2023-4/29/5389be99-53db-4267-8ef5-889153fdb30f/5389be99-53db-4267-8ef5-889153fdb30f1.gif)
嵌入式系统TCPIP网络解决方案
嵌入式系统TCP/IP网络解决方案
梁志明(微02)孔凡志(微02)甘珏瑜
摘要:
以单片机为核心的嵌入式系统在TCP/IP网络中的数据传送技术,远程监控、数据传送方面的应用,提供一种具体的实现方法。
关键字:
嵌入式系统单片机TCP/IP
一、综述
随着互联网应用的日益普及,以单片机应用系统为中心的小型嵌入式设备正成为当今电子界的热门话题。
本课题研究主要研究嵌入TCP/IP协议的单片机在网络通信中的数据传输技术。
包括实现TCP/IP链路层中的直接链路数据传输,网络层中的IP协议、ARP地址解析协议,传输层的TCP传输控制协议、UDP用户数据报协议,以及应用层的HTTP、TELNET等网络协议。
这种嵌入了TCP/IP协议的单片机系统,为现有的互联网提供了一种价格低廉、硬件简单、相对完善的网络接入方案,在实际应用中更会体现传输速度快、使用方便等优点,并且有着广泛的应用前景,特别是数据采集、数据传输领域。
二、硬件设计
硬件设计上采用8位的单片机系统配以太网接口芯片来完成以太网的网络通讯。
考虑到8位单片机的处理能力有限,以太网接口芯片也亦采用10M的接口芯片。
设计中采用了Topstar公司的ISA口的10M网卡TE-2500B,芯片采用Realtek公司的RTL8019AS芯片。
该芯片可以工作在8位总线模式下。
单片机采用了Winbond公司的W78E58B,该芯片支持32K的程序代码,具有3个计数器和256字节的内部RAM。
单片机使用串行口与上位机通讯,上位机通过终端向单片机发送命令或者接受单片机处理后的数据。
上位机与单片机间使用MAX232转换电平。
因为单片机需要处理大量的以太网数据报,所以大容量的RAM必不可少,设计中使用了HM62256作为单片机的扩展RAM,其大小为32K。
总线连接上也留出地址线A15作为网卡地址选择。
完成的设计原理图见附录,现在对部分电路作详细介绍。
1.单片机部分
电路为扩展的数据存储器模式,单片机的工作频率为22.1184MHz,P0和P2端口用作数据及地址总线,P3.0(RXD)和P3.1(TXD)用作串行通讯,P3.2(/INT0)用作网卡的中断IRQ,P3.4用作网卡的冷复位RESET,P3.3和P3.5用作I2C总线的SDA和SCL,扩展的32K外部RAM(62256)使用地址(0x0000-0x7FFF)。
设计中留有了I2C总线,以便于扩充各种的串行器件,以适合不同的应用场合,目前的串行器件层出不穷,比如:
E2PROM,串行DAC/ADC,串行时钟芯片等等。
未使用的P1端口保留给用户应用程序,在后面的WEB控制的Demo中,演示了如何利用WEB实现控制LED,该LED被连接到P1.7上。
图1单片机部分电路
2.串行口部分
上位机使用是RS-232-C接口,接口电气特性(RS-232-C中任何一条信号线的电压均为负逻辑关系。
即:
逻辑“1”,-5~-15V;逻辑“0”+5~+15V。
噪声容限为2V。
)都与单片机的串行口电气特性不同,需要转换电路,该电路较简单,仅使用一片MAX232和4个电容。
图2串口电平转换电路
3.网卡部分
图3ISA网卡接口部分
ISA接口分为两个部分A,B和C,D部分。
C,D部分为扩展部分,设计中只用到3个引脚,VDD、GND、/IOCS16。
/IOCS16为16位IO选择引脚,在网卡复位时,该引脚为输入,通过R10下拉地,所以网卡在复位时选择为8位IO模式。
地址线和数据线都位于ISA的A,B部分,A0-A19为ISA网卡的地址线,D0-D7为网卡的数据线。
我们所使用的8019网卡有3种配置方法:
1.跳线模式,2.即插即用P&P模式,3.串行Flash配置模式。
P&P模式用于PC机中,在我们的试验板上无法实现,能实现的为跳线模式和串行Flash配置模式,但Topstar的ISA的网卡并未在电路上提供硬跳线支持,对网卡作电路修改可能会影响网卡的正常工作,所以最后参照REALTEK公司所提供的RTL8019AS手册,使用串行Flash配置模式。
设置网卡工作的
I/O:
0x0240--0x025F,使用中断Interrupt:
IRQ9。
网卡的引脚33(RESET)连接到单片机的P3.4,引脚35(IRQ9)连接到单片机的/P3.2(INT0),引脚44(/IOR),45(/IOW)连接到单片机的P3.7(/RD),P3.6(/WD)。
网卡使用的地址为20位,而单片机可提供的总线地址只有16位,我们无法把网卡直接挂于16位的总线上。
我们使用的网卡的IO地址为0x240~0x25F共32个地址。
地址线
A19
A18
A17
A16
A15
A14
A13
A12
A11
A10
A9
A8
A7
A6
A5
A4
A3
A2
A1
A0
240H
0
0
0
0
0
0
0
0
0
0
1
0
0
1
0
0
0
0
0
0
...
0
0
0
0
0
0
0
0
0
0
1
0
0
1
0
X
X
X
X
X
25FH
0
0
0
0
0
0
0
0
0
0
1
0
0
1
0
1
1
1
1
1
图4网卡IO地址表
有图可以看出,实际使用的IO地址只有5位,分别是A0-A4,其他地址都是固定的000000000010010。
从这点出发,我们使用高位地址的7位来选中网卡已经绰绰有余了。
地址线
A6,A9(ADDR15)
A5(ADDR13)
A4(ADDR12)
A3(ADDR11)
A2(ADDR10)
A1(ADDR9)
A0(ADDR8)
值
1
0
X
X
X
X
X
P2口
P2.7
P2.5
P2.4
P2.3
P2.2
P2.1
P2.0
图5网卡IO与单片机总线映射
A7,A8,A10-A19接地,A6,A9接总线最高位P2.7,A0-A5接至总线高位地址上(P2.0-P2.5)。
那么网卡的地址0x240-0x25F就被映射到单片机总线的0x0C000-0x0DF00了。
图6访问映射后的网卡地址
三、软件设计
1.系统IO及驱动程序
1)伪多任务的实现:
单片机需要处理的3个主要任务,接受终端的命令,查询接受以太网的数据报和后台服务超时程序。
所以一个多任务的轮转机制是必不可少的,设计没有采用多任务的实时操作系统(RTOS),而只是采用一个简单的轮转调度方案。
使用RTOS需要占用一部分的系统资源,另外实验证明接受一个最大的数据报需要耗时60ms,而同时发送一个回应数据报也需要耗时70ms,而通常Internet上数据报的超时都在秒级的,所以在1s内,可以同时处理8个最大的数据报,这样只要保证接受任务处理8个数据报以内,就能保证下一个任务在超时前完成,实际上我们在一次任务中只处理了一个数据报,这样就不会因为在一个任务上停留时间过长而破坏了系统的实时性。
串口使用了终端,在串口接受缓存区允许的情况下,可以接受到实时的命令输入。
图7多任务轮转调度
2)系统时间和计时器
使用Timer2作为时间计数器,定时间隔为1ms。
系统提供的时间为一个累加的16位秒计时,计时可以达到18个小时。
系统另外提供1个8位ms级倒计时器和1个8位的100ms倒计时器。
该倒计时器可以被用作超时计时,也可用作255ms内和25s内的计时器。
图8系统时间
使用倒计时器用作ms级或100ms级的计时器,任务时对倒计时器赋0xFF,这样倒计时器就开始工作了,任务结束时对倒计时器按位取反,即得到计时的间隔。
在Ping程序中可以看到使用了ms级的计时器对目标返回的Echo数据报的时间间隔做了计时。
3)硬件的驱动程序
RTL8019AS网卡驱动程序
这里指的驱动程序不同于Windows下的VXD和WDM驱动,这里指的是实模式下一组硬件芯片的驱动子程序。
RTL8019AS的工作流程非常简单,实现只需要4个函数,分别是复位,初始化,收报和发报。
前导位PR
帧起始位SD
目标地址DA
源地址SA
类型TYPE/长度LEN
数据域DATA
填充PAD
校验FCS
62bit
2bit
48bit
48bit
16bit
<=1500Bytes
32bit
图9802.3帧结构
TYPE:
0x0800代表IP报,0x0806代表ARP报,0x814C代表SNMP报,0x8137代表IPX/SPX,小于0x0600用于IEEE802帧表明了数据的长度。
DATA:
DA+SA+TYPE+DATA<=1514,最大的数据报长度为1514字节(RFC894)
PAD:
DA+SA+TYPE+DATA<60时,即数据报长度不足60字节时,填充PAD。
(RFC894)
接受状态
下一页指针
帧长度
目的地址DA
源地址SA
类型TYPE
数据域DATA
填充PAD
校验FCS
8bit
8bit
16bit
48bit
48bit
16bit
<=1500Bytes
32bit
图10RTL8019AS接受帧结构
目的地址DA
源地址SA
类型TYPE/长度LEN
数据域DATA
填充PAD
48bit
48bit
16bit
<=1500Bytes
图11RTL8019AS发送帧结构
发送功能的实现:
待发送的数据报必须按照RTL8019AS的发送帧结构,将发送帧存入8019AS的RAM中,把数据报所在的首地址和长度告知芯片后(TPSR、TBCR),启动发送命令,即可实现数据报的发送。
接受功能的实现:
我们使用查询的方法来接受数据报。
接受缓存是一个FIFO列队,PSTART、PSTOP两个寄存器限定了列队的开始和结束页。
芯片设有2个指针CURR写指针和BNRY读指针,CURR受芯片控制。
我们在查询中判断(CURR==BNRY),如果CURR和BNRY指向不同的地址,则说明有新的数据报,那么从芯片的16kRAM中读取数据报。
使用RTL8019AS接受帧的结构体指针,就可以取得不同部分的数据了。
接受到的数据报保存到单片机RAM中,系统的实现是接受到一个处理一个。
芯片DMA结构介绍:
图12双口RAM结构
RTL8019AS使用了双口的RAM,这使操作的DMA端口分为了远端(Remote)和本地(Local)两个。
如图12所示,本地DMA接口指得是硬件收发电路侧,而远端DMA指得是连接到CPU接口侧。
这里的DMA与平时讲的DMA有不同,本地DMA由芯片控制器本身完成,而远端DMA也需要主机CPU参与读取数据。
具体的方法是,先由CPU给出首地址和长度,然后DMA读写RAM芯片,每操作一次RAM地址会自动加1,这样的DMA操作省去了普通DMA操作时需要先发地址的时间,速度较快,但是只能完成连续地址空间的DMA读写操作。
芯片初始化的具体参数和程序实现可以参阅附录的源代码8019as驱动部分。
另外设计中编写了一些外设的驱动程序:
HD4478016x2字符液晶驱动程序(见附录源代码)
I2C总线的串行E2PROM24C02(见附录源代码)
2.TCP/IP网络协议
设计使用的以太网封装格式都按照RFC894中定义的格式。
(1)ARP:
地址解析协议
在局域网内,一台主机将以太帧发送到另外一台主机上,需要根据48bit的以太网地址,设备驱动程序不检查IP数据报中的32位的IP地址。
ARP地址解析协议,为这两种地址间提供映射。
通常ARP的映射是自动完成的,用户及程序都无须关心。
图13ARP请求与应答的分组格式
OP字段指出了操作类型,ARP请求
(1)、ARP应答
(2)、RARP请求(3)、RARP应答(4)。
RARP为逆地址解析协议,在嵌入式系统中用处不大,故省略。
ARP协议的实现,发送ARP请求数据报,同时设置3秒超时,在3秒内接受到ARP回应数据报,将数据报内容ARP信息缓存,返回IP层对应ARP缓存单元的首地址。
在3秒内没有接受到ARP回应数据报,则通知IP层ARP解析失败。
ARP缓存使用双链表,结构如图14所示。
图14ARP缓存
使用Demo板的arp命令,可以在终端上进行ARP缓冲区的查看、新加、查找和删除操作,图15显示的是arp–l显示命令的输出结果。
图15Demo板ARP缓存输出
(2)IP:
网际协议
IP协议是TCP/IP协议族中最为核心的协议。
所有的TCP、UDP、ICMP及IGMP数据报都是以IP数据报的格式进行传输的。
IP数据报的格式如图16所示:
图16IP数据报格式及首部各字段
Demo板使用协议为IPV4版,不支持TOS特性,TTL生存时间为32。
IP协议层提供两个主要的函数,IP数据报的发送和IP接收数据报的处理。
使用IP数据报的发送函数,必须提供目标方的IP地址,发送程序辨别待发送的IP地址是否为子网内地址,如果为子网内地址,则向ARP层提交查询请求,待得到对应IP的以太网地址后发送IP数据报到指定的目标上。
如果目标IP非本地子网内IP地址,则查询网关以太网地址后发送到网关。
(3)ICMP:
Internet控制报文协议
ICMP报文,通常被认为IP层的一个重要部分。
上层的协议(TCP、UDP)使用ICMP报文来传递一些差错和需要注意的信息。
在嵌入式系统的ICMP报文协议中,删除了大部分的ICMP报文类型,保留了3种报文:
回显应答(类型0,代码0)、请求回显(类型8,代码0)、差错报文的端口不可达(类型3,代码3)。
前2个报文为Ping命令所使用,第3个报文被上层的TCP和UDP协议所使用。
图17端口不可达ICMP报文封装
图18端口不可达ICMP报文首部
图19ICMP回显请求和回显应答的报文首部
(4)UDP:
用户数据报协议
UDP是一种简单的面向数据报的运输层协议。
UDP不提供可靠性,所以通常用在本地子网或局域网内,更远程的通讯通常使用的是TCP连接。
UDP协议是比较简单的协议,应用程序直接把数据交给UDP层发送,接受到UDP数据也直接交给应用程序。
在本设计中,因为没有太多的运用到UDP的数据通讯,所以只是编写了最为基本的收发UDP数据包的函数,至于插口(socket)可以参照TCP中的实现。
图20UDP封装
图21UDP首部
UDP的检验和需要包含12字节的伪首部、UDP首部、UDP数据。
UDP的校验和是可选的,但是考虑到数据的可靠性和与其他系统的兼容性,这里对每个UDP数据包都要进行校验和检查。
图22UDP校验和
设计的UDP协议不支持IP的分片,因为分片的IP数据包,需要消耗大量的内存空间来重组数据。
对于分片了的数据包,UDP层将丢弃。
为节省协议栈的程序大小,这里没有发送ICMP的出错报文。
Demo板中UDP收发的示例程序。
发送示例:
在终端中键入命令:
udpIP地址Port端口(udp192.168.10.801234)
图23在PC上接受到UDP数据包的截屏
接受示例:
使用ezUDP调试工具在PC发送UDP数据到Demo板上。
发送数据为“Helloworld!
”。
图24Demo板终端上接受到UDP数据
(5)TCP:
传输控制协议
TCP协议是面向连接的协议、可靠字节流的服务。
非常多的应用都使用TCP连接,所以TCP协议也成为TCP/IP中最为重要的协议之一。
图25TCP报文
图26TCP报文首部
面对连接的两方需要在交换数据前建立TCP的连接,连接也分为主动连接和被动连接两种。
设计中采用插口来为每个连接设置详细的插口信息,另外为每个插口分配窗口大小的接受缓存。
图27Socket连接缓存输出
TCP协议是实现中最为复杂的协议,其中需要包含很多的对以外或者出错情况的处理,在设计中,把TCP的活动分为3部分,建立连接、已连接和关闭连接。
针对不同的部分,采取不同的异常处理。
比如在建立连接时受到ACK标志和已连接时收到ACK标志是不同的,前者是出现异常,而后者是正常的。
3.应用程序
(1)Ping程序
Ping程序是用于测试主机是否可达,程序发送一份ICMP的回显请求数据报,并等待主机ICMP回显应答。
一般地,Ping程序主要关心的是主机是否可达和往返主机的时间延时是否过长。
在编写嵌入式系统的Ping程序时,只考虑最为简单的Ping请求和应答。
Ping程序在本Demo板的程序实现中分为两个部分,一个是请求发送程序,另一个是Ping应答和超时的服务程序。
通常服务程序是不会运行的,只在有请求回显的ICMP数据包发出后,才激活服务程序。
服务程序主要处理两个事情,如果接收到ICMP的回显应答数据包,则调用Ping回显应答处理程序。
如果发生超时,即没有接收到ICMP的回显应答,则显示超时。
在前面已经介绍过,在Ping程序中使用ms倒计时器来进行Ping来回主机的延时时间。
通常在一个负荷不大的局域网内,需要消耗12ms时间。
图28显示了从Demo板Ping局域网主机的情况,第一个数据包通常比其后的数据包要耗费更多的时间,是因为Demo板和目标主机都需要使用ARP请求来获得物理地址,这里耗费了一些时间。
图28从Demo板Ping其他主机
和Ping相关但不又不属于Ping程序中的一个服务是Ping回显请求应答服务,该服务是ICMP一个重要组成部分。
使用在其他主机使用Ping程序来试探本主机时,Ping程序将回应请求的应答数据报。
这个是在ICMP(RFC792)中定义的,为配合Windows的Ping函数,将ICMP回应请求数据报的附加数据重新加入到ICMP回显应答数据报中,Windows需要该数据来确认主机支持的最大数据报大小。
图29和图30分别显示的是在主机(电脑)上PingDemo板时的情况,图29显示的是Windows默认数据报的请求,Demo板处理一个ICMP回显请求并发送应答,需要耗费8ms时间。
图30显示的是在最大数据报(1516字节)下,Demo板处理ICMP回显请求并发送应答需要耗费129ms时间。
图29在我的个人电脑上PingDemo板的情况
图30最大数据报时的情况
(2)Telnet
Telnet是基于TCP的一个最为广泛的应用。
Demo板所实现的Telnet服务并没有实现RFC中定义的功能,只是简单的把字符通过TCP连接发送到指定端口的一种简单实现。
所实现的Telnet功能只能工作在“一次一字符”模式下,对选项协商,只支持回显(RFC857)和抑制继续进行(RFC858)。
但这些对连接到FTP控制端口,连接到BBS,已经足够了。
对于更多的功能实现,需要在将来在程序中慢慢加入。
图31和图32显示的是使用Demo版的Telnet功能连接到bbs时的情景。
图33显示的是Telnet连接到一台ftp服务器的21端口(ftp控制端口)的情景。
图31Telnet华南木棉BBS(202.112.17.13723)
图32Telnet一塌糊涂BBS(162.105.31.22223)
图33TelnetFTP控制端口
(3)Web控制
连接万维网WWW,可能是嵌入式系统TCP/IP开发中最为火热,万维网使用超文本传输协议(HTTP)来传送超文本文档,以浏览网页或文档。
在Demo板中,我们设计的一套基于Web的控制演示程序。
即使用Web来控制连接到单片机上的LED。
这所有的状态和控制都可以在网页上完成。
在浏览器中输入Demo板的IP地址,即访问到Demo板的Web控制页面,如图34所示,“控制LED”选择的“亮”,说明了当前的LED状态为“亮”。
图中的LED图片为现场拍摄图片,可以看得到P1.7的LED灯状态为“亮”。
图35所示为提交表单后的页面,P1.7的LED灯已经“灭”。
图34打开Demo远程控制的Web页
图35选择“灭”提交后的结果
4.总结
以上嵌入式TCP/IP协议的方案,实现TCP/IP链路层中的直接链路数据传输,网络层中的IP协议、ARP地址解析协议,传输层的TCP传输控制协议、UDP用户数据报协议。
协议的提供比较全面,可以应付各种不同的应用环境。
实现的功能在最后的编译后有21K左右,所以对于32kROM的一般8位MCU则还可以有较多的空间用于用户的程序。
对于各种不同的应用,可以再继续对不必要的协议进行精简,继续精简后的协议内容也会有很大的差别。
在实际的使用中,可以删除一些不必要的协议已缩小代码的体积,加快系统执行的速度。
限于时间和能力的限制,所做的研究和制作都没有对应用作更为深入的研究。
但提供的一些方法是可以值得了解和使用的。
特别是Web远程控制的Demo,可说是一种应用浓缩,它可以被使用作远程的数据采集或设备控制中,应用的效果也是可以令人接受的。
四、应用及前景
可以看到在时钟频率仅为22MHz的8位单片机上嵌入TCP/IP协议后就可以实现很多的网络功能。
比较微机所实现的同样功能,单片机嵌入式系统更具体积小,价格低廉,工作可靠等优点及特点,具有非常广的市场和领域。
总结几个应用如下:
1.远程数据采集
小流量的数据采集,可以利用廉价的以太网网络或Internet。
对于像水表电表的抄表系统,户外温度测量,车库报警器等应用,都可以使用嵌入TCP/IP的单片机系统来实现。
2.远程设备控制
不管是使用TCP还是UDP,甚至是以太帧,都可以用作控制信号的载体。
使用TCP/IP协议,可以与PC直接进行通讯,利用廉价的Internet网络就可以实现远程的设备控制。
像Demo中使用的Web控制界面,可以让控制工作更简单易行。
3.简单家电上网
各种新家电各具特色和功能,使用网络互联的家电也成为未来家电的一个发展方向。
利用电视机上Internet浏览网页、在办公室里查看冰箱的温度、回家的路上打开家里的空调等等。
随着单片机性能的进一步提高,采用嵌入式TCP/IP的单片机系统将得到愈来愈多的应用。
参考文献:
1.ComputerNetworksThirdEditionAndrewS.Tanenbaum
2.TCP/IPIllustratedVolume1:
TheProtocolsW.RichardStevens
3.RTL8019asRealtekFull-DuplexEthernetController
4.2000、2001、2003嵌入式会议资料。
5.Atmel89系列单片机应用技术北京航空航天大学出版社2002余永
6.8-bitEmbededControllersIntelCorporation
7.微型计算机原理与接口技术
8.RFC826:
ARP
9.RFC768:
UDP
10.RFC791:
IP
11.RFC792:
ICMP
12.RFC793:
TCP
13.RFC2616-RFC2617:
HTTP1.1
14.RFC854-RFC856:
TELNET
15.单片机C语言Windows环境编程宝典北京航空航天大学出版社马忠梅等
16.