广州周立功单片机发展有限公司 Tel,(020) 38730916 38730917 38730976 38730977 Fax,38730925
ZLG/IP 嵌入式TCP/IP协议栈简要说明
TCP/IP 协议和以太网协议是使用最广泛的通讯协议,而基于底层的以太网协议的实现就由以太网控制器来负责了,目前比较常用的嵌入式以太网控制芯片有 RTL8019AS,CS8900
等,我们先以 RTL8019AS 为例子介绍以太网的控制芯片。
1 RTL8019AS简介
RTL8019AS 是一种高度集成的以太网控制芯片,能简单的实现 Plug and Play 并兼容
NE2000、掉电等特性。在全双工模式下,如果是连接到一个同样是全双工的交换机或集线器,就可实现同时接收和发送。这个特性虽然不能把传输速率从 10Mbps 提高到 20Mbps,
但是在执行以太网 CSMA/CD 协议时,可以避免更多的冲突的发生。而 Microsoft's Plug and
Play 功能就可以为用户减轻对资源配置的烦恼 (如 IRQ,I/O address 等) 。 又或者是 在一些特殊的场合,为了对一些不支持 Microsoft's Plug and Play 的器件的兼容,RTL8091AS 还可以选择跳线模式或非跳线模式。
null 支持 PnP 自动检测模式;
null 支持 Ethernet II 和 IEEE802.3 10Base5,10Base2,10BaseT;
null 软件兼容 8 位 或 16 位 的 NE2000 模式;
null 支持跳线和非跳线模式;
null 支持在非跳线模式下的 Microsoft‘s Plug and Play 配置;
null 支持在全双工模式下的双倍信道带宽;
null 支持 UTP、AUI,BNC 的自动检测
null 在 10BaseT 下支持自动极性修正
null 支持 8 路中断请求(IRQ)
null 支持 16 位 I/O 地址
null 内建 16K SRAM
null 支持四盏可编程诊断 LED
RTL8019AS 管脚排列及内部功能框图如图 1 所示。
- 1 -
广州周立功单片机发展有限公司 Tel,(020) 38730916 38730917 38730976 38730977 Fax,38730925
FIFO ISA总线接 口系统 I/O端 口本地 DMA
远程 DMA
16K SRAM
本地地址远程地址本地总线数据发送
16位
16位 /8位网络 数 据
图1 RTL8019AS管脚排列及内部功能框图
如图 1 所示,RTL8019AS 芯片内部集成了 DMA 控制器,ISA 总线控制器和集成 16K
SRAM、网络 PHY 收发 器。用户可以通过 DMA 方式把需要发送的数据写入片内 SRAM 中,让芯片自动将数据发送出去;而芯片在接收到数据后,用户也可以通过 DMA 方式将其读出。
RTL8019AS 的详细介绍请见 RTL8019AS 数据手册。
明白了 RTL8019AS 所提供的资源与硬件接口,便可以设计 RTL8019AS 与 LPC2200 的硬件电路了。
2 RTL8019AS与LPC2200的硬件电路设计
RTL8019AS 与 LPC2200 一般通过外部总线进行连接。 我们假 设 RTL8019AS 与 LPC2200
的连接关系如表 1 所示。
表1 RTL8019AS与LPC2200连接关系
RTL8019AS 功 能 LPC2200
SD0 ~ SD15 RTL8019AS 数据总线 D0 ~ D15
SA0~SA4 RTL8019AS 地址总线 A1~A5
SA8 RTL8019AS 地址总线 A22
SA5 RTL8019AS 地址总线 nCS2
IORB RTL8019AS 读使能 (低电平有效 ) nOE
IOWB RTL8019AS 写使能 (低电平有效 ) nEW
INT0 RTL8019AS 中断输出信号 INT_N( P0.7)
RSTDRV RTL8019AS 复位输入信号 NET_RST( P0.6)
由以上关系,可知 RTL8019AS使用 LPC2200外部存 储控制的 Bank2部分,而 RTL8019AS
的 IO 地址为 0X00300~0X0031F,所 以 RTL8019AS 在 SA8=1;SA5=0 的时候选 通,其地址 如下,
数据地址 0x83400000~0x83400001F
- 2 -
广州周立功单片机发展有限公司 Tel,(020) 38730916 38730917 38730976 38730977 Fax,38730925
NET_RST 为 LPC2200 输出引脚,RTL8019AS 中断信号为中断输入信号,且为外部中断。
RTL8019AS 的 SD0~SD15 串了一个 470 欧姆电阻连接到 LPC2200 的 D0~D15。
3 ZLG/IP 概述
3.1 ZLG/IP简介
ZLG/IP 是广 州周立功单 片机发展有 限公司开发 的面向嵌入 式系统开发 的 TCP/IP 协议栈,是 ZLG 系列中间件的重要成员之一。 ZLG/IP 提供实现 Internet 网络 上 IP 接点的功能,
是个高性能的嵌入式 TCP/IP 协议栈软件。它使用 μC/OS-II 实时操作系统的信号机制来实现一个多任务并行并可重入的协议栈,完全使用 ANSI C 进行 编写,可以象 μC/OS-II 那样支持多种 CPU。 ZLG/IP 还具有层次清晰,易于升级和修改等特点。 目前,ZLG/IP 的最新版本为
1.0。
3.2 ZLG/IP的特点
null Socket 库兼容 BSD 标准
ZLG/IP 带有 Socket API 接口函数,方便用户进行应用层协议的开发。
null 可移植
全部代码由 ANSI C 编写,并且与目标处理器的存储器结构无关(即与无论存储器是大端结构 还是小端结 构均不影响 程序的执行),方便用户 移植到自己 的目标系统中。
null 可固化
ZLG/IP 为嵌入系统设计,如果您有固化手段,它可以嵌入到您的产品中成为产品的一部分。
null 支持多任务操作系统
基于 μC/OS-II 实时多任务操作系统,具有良好的实时性能,所有 Socket API 接口函数库都可以工作在非阻塞方式。
null 为嵌入系统做过优化
代码可 重入,简易的 路由 协议处 理,可以跨 越网 关收发 数据,支持 RFC 标准 TCP,
TCP 层代码小而且速度快。
null 提供源代码
需要购买源码的用户可以与广州周立功单片机发展有限公司联系。
null 可配置
得到源码的用户可以对一些参数进行配置或裁减代码。
null 基本完整的 TCP 栈支持,TCP 模块处理支持以下功能,
(1) 发送确认;
(2) 带外数据;
(3) 数据重传;
(4) 数据校验;
(5) 流模式;
(6) 连接数目只受内存大小限制。
3.3 已实现的特性
null 支持 TCP,UDP,IP,ICMP,ARP,ETHERNET 等协议;
null 兼容 BSD 标准的 Socket API 接口函数库;
null ICMP 实现 PING 的功能和 UDP 无效端口返回;
- 3 -
广州周立功单片机发展有限公司 Tel,(020) 38730916 38730917 38730976 38730977 Fax,38730925
null 支持 TCP 的流控制和超时重传;
null 支持 TCP 主动连接和被动连接;
null 支持在多任务中建立多个不同的 TCP 连接,支持各连接同时收发数据;
null 提供 WebSever 和 UDP 服务器范例。
3.4 暂时未实现的特性
null IP 报的处理不支持分段
在多个网络接口的应用是两个网络间的最大报大小要基本相等。
null ICMP 协议还不是非常完整
目前 ICMP 协议只支持 PING 的功能和 UDP 无效端口返回。
null TCP 协议不支持紧急数据
这一版本的 ZLG/IP 不对 TCP 传输中的紧急数据报进行处理。
null 不支持 IGMP 协议
这一版本的 ZLG/IP 不支持 IP 组播和广播。
null 不支持 Socket API 发送函数发送大于 PMTU
用 Socket API 发送函数发送数据时,数据长度不可大于一个 TCP 或 UDP 报有效数据的长度。
ZLG/IP 的升级版将逐步解决上述问题。
4 ZLG/IP的结构视图
4.1 概述
ZLG/IP 采用模块化层次结构设计,其结构如图 2 所示。
IP处理
ARP处理
IP发 送
ETHERNET接收 驱动 ETHERNET发送驱 动
UDP
处理
ICMP处理
TCP
处理
TCP/IP应用程序TCP/IP应用 程 序
SOCKET API 接口网络 硬 件其它应 用程 序
注释,(1) 实线箭头表示正常调用关系。
(2) 模块所在水平位置代表其所在的网络层次
(3) 灰色模块表示操作系统中的任务。
- 4 -
广州周立功单片机发展有限公司 Tel,(020) 38730916 38730917 38730976 38730977 Fax,38730925
图2 ZLG/IP逻辑结构图
4.2 应用程序
TCP/IP 应用程序是用户自己编写的 μC/OS-II 任务,是 ZLG/IP 的使用者,位于整个程序的最高层。 TCP/IP 应用程序调用 ZLG/IP 提供的 Socket API 接口函数对网络进行相应的操作。
4.3 Socket API接口
位于 TCP/IP 协议与应用程序之间,是用户操作协议栈程序的工具,在应用程序中通过调用 Socket API 接口函数来对协议栈软件进行操作。
4.4 TCP、UDP处理
是协议栈程序中处理传输层协议的模块。 负责对传输层的数据进行封装和解拆,保存传输层连接状态。
4.5 接收处理
最大的灰框内部的就是接收处理。它包括 IP 报的处理,ARP 报的处理,ICMP 报的处理及以太网层的数据接收驱动。 接收驱动模块接收到数据后进行分类,是 IP 报就 IP 由处理模块处理,是 ARP 报就进行 ARP 协议处理,是 ARP 请求报则调用以太网发送模块发送 ARP
应答报。是 IP 处理模块把数据分类分别由 ICMP 处理模块处理,对 TCP 或 UDP 报 则转由上层的传输层模块处理。而 ICMP 协议处理模块负责对 ICMP 协议进行。
4.6 IP发送
负责封装 IP 报,并把封装好的 IP 报传送的下层发送模块。 IP 发送模块有 4 个上层模块调用,分别是 Socket API 接口,UDP 处理,TCP 处理和 ICMP 处理,他们把相应的参数传送给 IP 发送模块,由 IP 发送模块来封装。
4.7 以太网发送驱动
它是属于以太网层的处理模块,负责封装以太网报和数据的发送。 调用它的模块有 ARP
处理模块和 IP 发送模块。
5 Socket API函数集
5.1 系统配置手册
表 2 ZLG/IP配置
功能 常量名
取值范围
所属文件描述、注意点
ARP 表的表项数目
MAX_ARP_TERM 1~ 255 cfg_net.h 它于网络中的节点数有关,默认是 50
TCP 报的最大数据长度数据
MAX_TCP_DATA
1~
1460
cfg_net.h
它是指一帧 TCP 报可以发送的字节数,默认是 1460
TCP 的最大连接数
MAX_TCP_LINKS 1~ 255 cfg_net.h 同时可以建立的 TCP 连接数量
本地 MAC
地址
My_Mac_1ID cfg_net.h 默认是 0x52,0x54,0x4c,0x19,0xf8,0x72
本地 IP 掩码 IP_MARK_1ID cfg_net.h 默认是 255,255,255,0
- 5 -
广州周立功单片机发展有限公司 Tel,(020) 38730916 38730917 38730976 38730977 Fax,38730925
本地 IP 地址 MY_IP_1ID cfg_net.h 默认是 192.169.0.174
本地网关地址
MY_GATEWAY_1ID cfg_net.h 默认是 192.169.0.1
系统的操作方式
Little_End cfg_net.h
分为大端( Big_End)和小端( Little_End)
两种,它与 CPU 的类型有关,默认是小端接收缓存区的数目
MAX_REC_BUFF 1~ 255
Hardwear.
h
默认为 5
网络接口数 MAX_NET_PORT 1~ 255 Ethernet.h
是指可以同时控制的以太网接口数目,默认为 1
UDP 接收缓存区的数目
UdpMaxRec 1~255 Udp.h 默认是 3
UDP 可建立的 SOCKET

MAX_UDP_LINKS 1~255 Udp.h
它的数目是于 UDP 通讯的 SOCKET 数目有关,它等于 UDP 通讯的 SOCKET 数目就可以了,默认为 5
以太网控制芯片的复位脚
NET_RST
Hardwear.
c
复位脚的管脚号,它与硬件有关在
EASY2200 板上是 P0.6 脚,所以
NET_RST= 0X00000040
以太网控制芯片的基地址
NET_BASE_ADDR
Hardwear.
c
它与硬件有关在 EASY2200 板上是
0X83400000
5.2 SOCKET API 函数参考手册
表 3 socket函数
函数名称 socket() 所属文件 zlg_socket.c
函数原型 SOCKET *socket( uint16 af,uint16 type,uint16 protocol)
功能描述 创建一个 SOCKET
编译开关 无 调用者 用户任务
函数参数 af:保留( 0) type:通讯类型 protocol:通讯协议
函数返回值 创建的 SOCKET 结构指针
调用模块 无
特殊说明和注意点
必须先建立一个 SOCKET 结构 ;该函数可用于 TCP 或 UDP 通讯任务
表 4 bind函数
函数名称 bind() 所属文件 zlg_socket.c
函数原型 int bind( SOCKET * s,struct sockaddr * name,uint16 namelen)
功能描述 对已创建的 SOCKET 绑定本地 IP 地址和本地端口
编译开关 无 调用者 用户任务
函数参数 s:已创建的 SOCKET 指针 name:保存 IP 地址和端口的结构 namelen,name 的长度
函数返回值 通讯协议,0 为 TCP 通讯,1 为 UDP 通讯
调用模块 无
- 6 -
广州周立功单片机发展有限公司 Tel,(020) 38730916 38730917 38730976 38730977 Fax,38730925
特殊说明和注意点
如果调用本函数来绑定本地 IP 和本地端口,系统自动使用默认 IP 和一个 空闲的端口 ; 该函数可用于 TCP 或 UDP 通讯任务
表 5 listen函数
函数名称 listen() 所属文件 zlg_socket.c
函数原型 int listen( SOCKET * s,uint16 backlog )
功能描述 设定 TCP 服务器需要监听的连接数
编译开关 无 调用者 用户的 TCP 服务器任务函数参数 s:已创建的 SOCKET 指针 backlog:需要监听的连接数
函数返回值
-1:需要监听的连接数比最多可建立的连接数还大
-2,backlog= 0
-3:已创建的 SOCKET 所使用的通讯协议不是 TCP 协议
-4:需要监听的连接数比可建立的连接数还大
backlog 的值:表示设定成功
调用模块 无
特殊说明和注意点
只适用于 TCP 连接
表 6 accept函数
函数名称 accept() 所属文件 zlg_socket.c
函数原型 uint8 accept( SOCKET * s,struct sockaddr * addr,int *addrlen )
功能描述 用于 TCP 服务器确认客户机的连接
编译开关 无 调用者 用户的 TCP 服务器任务
函数参数 s:已创建的 SOCKET 指针 addr:连接后保存对方的 IP 和端口 addrlen,addr 的长度
函数返回值
0xFF:没有客户机的连接
返回值小于 MAX_TCP_LINKS:已经与客户机建立连接,返回值是“连接序号”
调用模块 无
特殊说明和注意点
只适用于 TCP 连接,本函数不阻塞,它属于超时退出。
表 7 recv函数
函数名称 recv() 所属文件 zlg_socket.c
函数原型 uint16 recv( uint8 num,uint8 *buf,uint16 len,int flags )
功能描述 TCP 通讯连接建立后,读取所得到的数据。
编译开关 无 调用者 用户的 TCP 任务
函数参数 num:从 accept()(或 connect()函数)函数获取的,连接序号”
buf:接收缓存区起始地址
len:接收的数据长度
flags:保留
函数返回值
读取的数据长度,为 0 表示没有数据
调用模块 OSTimeDly(10);
- 7 -
广州周立功单片机发展有限公司 Tel,(020) 38730916 38730917 38730976 38730977 Fax,38730925
特殊说明和注意点
只适用于 TCP 连接,本函数不阻塞,它属于超时退出。
表 8 send函数
函数名称 send() 所属文件 zlg_socket.c
函数原型 uint16 send( uint8 num,uint8 *buf,uint16 len,int flags )
功能描述 TCP 通讯连接建立后,发送数据。
编译开关 无 调用者 用户的 TCP 任务
函数参数 num:从 accept()(或 connect()函数)函数获取的,连接序号”
buf:发送数据起始地址
len:发送的数 据长度(不可大于 MAX_TCP_DATA,MAX_TCP_DATA 默认是 1460 个 字节)
flags:保留
函数返回值
发送的数据长度,为 0 表示发送失败
调用模块 Send_Ip_Frame()
特殊说明和注意点
只适用于 TCP 连接,本函数不阻塞,超时重发一次,再超时退出。
表 9 close函数
函数名称 close() 所属文件 zlg_socket.c
函数原型 uint8 close(uint8 num)
功能描述 关断 TCP 连接
编译开关 无 调用者 用户的 TCP 任务
函数参数 num:从 accept()函数(或 connect()函数)获取的,连接序号”
函数返回值
1:正常断开
0:非正常断开
调用模块 Send_Ip_Frame()
特殊说明和注意点
只适用于 TCP 连接,本函数不阻塞,超时退出。
表 10 connect函数
函数名称 connect() 所属文件 zlg_socket.c
函数原型 uint8 connect(SOCKET * s,struct sockaddr * addr,uint16 addrlen)
功能描述 用于 TCP 主动连接(一般是 TCP 客户端)
编译开关 无 调用者 用户的 TCP 客户 机任务
函数参数 s:已创建的 SOCKET 指针 addr:对方 IP 地址和端口 addrlen,addr 的长度
函数返回值
< MAX_TCP_LINKS:返回创建的“连接序号”
MAX_TCP_LINKS:连接失败返回 MAX_TCP_LINKS
调用模块 Send_Ip_Frame()
特殊说明和注意点
只适用于 TCP 客户机连接,本函数不阻塞,超时退出。
表 11 closesocket函数
- 8 -
广州周立功单片机发展有限公司 Tel,(020) 38730916 38730917 38730976 38730977 Fax,38730925
函数名称 closesocket() 所属文件 zlg_socket.c
函数原型 int closesocket( SOCKET s )
功能描述 删除已建立的 SOCKET
编译开关 无 调用者 用户任务
函数参数 s:已创建的 SOCKET
函数返回值
1:正确删除
调用模块 无
特殊说明和注意点
该函数可用于 TCP 或 UDP 通讯任务
表 12 recvfrom函数
函数名称 recvfrom() 所属文件 zlg_socket.c
函数原型 uint16 recvfrom( SOCKET s,uint8 *buf,uint16 len,int flags,struct sockaddr *from,uint16
*fromlen )
功能描述 用于 UDP 通讯时接收数据
编译开关 无 调用者 用户 UDP 任务
函数参数 s:已创建的 SOCKET
buf:接收缓存区起始地址
len:接收的数据长度
flags:保留
from:保存发送方的 IP 地址和端口
fromlen,from 的长度
函数返回值
接收到的数据的长度
调用模块 无
特殊说明和注意点
仅适用与 UDP 通讯,使用前必须先建立 SOCKET
表 13 sendto函数
函数名称 sendto() 所属文件 zlg_socket.c
函数原型 uint16 sendto( SOCKET s,uint8 *buf,uint16 len,int flags,struct sockaddr *to,uint16 tolen )
功能描述 用于 UDP 通讯时发送数据
编译开关 无 调用者 用户 UDP 任务
函数参数 s:已创建的 SOCKET
buf:发送数据起始地址
len:发送的数据长度(不大于以太网中的 UDP 最大数据 1478 个字节)
flags:保留
to:目标方的 IP 地址和端口
tolen,to 的长度
函数返回值
发送的数据的长度
调用模块 无
- 9 -
广州周立功单片机发展有限公司 Tel,(020) 38730916 38730917 38730976 38730977 Fax,38730925
特殊说明和注意点
仅适用与 UDP 通讯,使用前必须先建立 SOCKET
- 10 -