ZLIP 一个公开源码的为51单片机设计的TCP/IP协议栈

 

 


点击这里访问ZLIP 新网站

ZLIP首页
新闻
链接
文档
下载
ZLIP开发板
常见问题

常见问题

Q: 是否有对ZLIP源代码注释和解说的文章?

A:对ZLIP详细注释和解说的文章还没有,不过有一些文档可以参考。可以参考文档部分


Q:你是否有一个硬件的环境的描述,这样,我们只要设计一个硬件,就能够验证程序了。

A:在ZLIP的软件包的说明文档中给了RTL8019AS的连接电路图,根据这个电路将RTL8019AS和51单片机连接来制作硬件开发板,ZLIP0.2可以在该开发板上运行。并且通过以太网和同一个局域网中的PC机上的程序进行通信。注意PC机和开发版的子网掩码应该一样。另外可以用siniffer软件监听和调试。


Q:能否结合到UCOS51或者RTS51中,并给出一个工程DEMO。最好是UCOS51中,这样移植到其他系统就方便了。

A:ZLIP设计目标是能够在没有操作系统的环境下也能工作。但是也可以结合到UCOS51等系统中,这一步的工作现在还没有做。


Q:是否有更新的版本?

A:目前(04/10/14)最新版本为0.2,有空的话我会加以改进推出更新的版本。


Q:网卡是怎样连接的?是不是我做的网卡直接跟电脑连接还是别的方式?

A:在ZLIP的软件包的说明文档中给了RTL8019AS的连接电路图,根据这个电路将RTL8019AS和51单片机连接来制作硬件开发板,ZLIP0.2可以在该开发板上运行。


Q:我照要求移植到我刚做的网卡demo板上,但是程序运行时无任何反应,不知是如何调试?

这是一个很常见的问题,让板子工作分以下几步:

一、首先需要确认网卡(RTL8019AS)已经工作

1.确认RTL8019的地址已经和硬件电路图一致了。即修改以下两个宏定义:

/* for example if you use a1-a5 as address lines ADDRESS_SHIFT should be 0x02 */
#define ADDRESS_SHIFT 0x1

/* base address of RTL8019 */
#define RTL_BASE_ADDRESS 0x8040

注意!从本网站下载的51TCP/IP开发板已经对硬件做了一些改动,这样如果使用本站以前下载的ZLIP源代码(现在已经修正)则需要修改RTL_BASE_ADDRESS为0x8040,或下载本站最新ZLIP代码。地址为0x8040的分析如下:

RTL8019的地址SA0-SA19必须落在有效地址范围内,才能访问RTL8019as。否则D0-D7是高阻态。这里我们设置SA19-SA0为(0000 0000 0010 010x xxxx)b,其中x表示由外部地址线决定,共可决定16个地址。为了寻址方便,我们想设置8019的地址范围为8040H到805FH,这只要将51的A15接到SA9,A9接到SA15即可。

2.如果程序初始化完毕,开发板网口接上网线(另一端要接入以太网,不能悬空)则开发板的网络指示灯应该会闪动,表示RTL8019AS初始化正常。

二、发送第一个测试包

在发送TCP/IP包之前发送一个测试包,这个包就是ARP包。这一步也可以直接跳过。

1.安装sniffer程序。并将安装上sniffer的计算机和开发板的以太网连接。注意sniffer软件的Define Filter设置->Advanced中的IP和IP ARP前面都要打勾;Define Filter设置->Address中设置Hardware的一个地址为52544c302e2f(这个是开发板的默认物理地址),也就是说物理地址是这个的数据包全部接收。然后可以开始监听了。

2.发送一个ARP包

Main函数初始化完网卡后调用如下的函数(可以放在RTL8019.c中)发送一个ARP包

void RTLSendPacketTest()
{
/* send a arp request packet, src ip = 192.168.2.13, dest ip = 192.168.2.14,
if you config your computer's ip as 192.168.2.14, then after run this function,
your computer will receive the packet, and when you type "arp -a" in windows
command window(dos window) you will see a arp entry of 52 54 4c 30 2e 2f.
this indicate a packet has been successful sent
*/
/* this is a arp broad cast packet */
TestPacket[0] = 0xff;
TestPacket[1] = 0xff;
TestPacket[2] = 0xff;
TestPacket[3] = 0xff;
TestPacket[4] = 0xff;
TestPacket[5] = 0xff;
TestPacket[6] = 0x52;
TestPacket[7] = 0x54;
TestPacket[8] = 0x4c;
TestPacket[9] = 0x30;
TestPacket[10] = 0x2e;
TestPacket[11] = 0x2f;
TestPacket[12] = 0x08;
TestPacket[13] = 0x06;
TestPacket[14] = 0x00;
TestPacket[15] = 0x01;
TestPacket[16] = 0x08;
TestPacket[17] = 0x00;
TestPacket[18] = 0x06;
TestPacket[19] = 0x04;
TestPacket[20] = 0x00;
TestPacket[21] = 0x01;

/* ARPPacket->IPDestAddr = DestIP;*/
TestPacket[22] = 0xc0;
TestPacket[23] = 0xa8;
TestPacket[24] = 0x02;
TestPacket[25] = 0x0e;

/* ARPPacket->IPScrAddr = NetIf->IPAddr; */
TestPacket[26] = 0xc0;
TestPacket[27] = 0xa8;
TestPacket[28] = 0x02;
TestPacket[29] = 0x0d;

/* MemCopy(ARPPacket->EtherDestAddr,EtherAddrAny,ETHER_ADDR_LEN); */
TestPacket[30] = 0xFF;
TestPacket[31] = 0xFF;
TestPacket[32] = 0xFF;
TestPacket[33] = 0xFF;
TestPacket[34] = 0xFF;
TestPacket[35] = 0xFF;

TestPacket[36] = 0x52;
TestPacket[37] = 0x54;
TestPacket[38] = 0x4c;
TestPacket[39] = 0x30;
TestPacket[40] = 0x2e;
TestPacket[41] = 0x2f;

RTLSendPacket(TestPacket, MIN_PACKET_SIZE);
}

这样sniffer应该接收到一个数据包,说明发送成功。

三、TCP/IP发送测试:

1.确认PC机和开发板已经连接

2.确认PC机和开发板处在同一个网段。开发板默认为192.168.2.xxx网段,可以通过修改Main.c函数修改网段。

3.运行本网站现在的SocketTest程序,进行TCP/IP连接测试,ZLIP默认发起连接的主机地址是192.168.2.15,也就是说你的PC机地址必须为192.168.2.15,如果不是修改Main.c代码或者主机IP。还有默认板子在1001端口监听,向PC机发起连接的端口也是1001。板子接收的数据会在串口输出。SocketTest接收的数据会写入文件中。


Q:文档中给出的RTL8019电路图中SA6至SA9的连接和其他方案不同,能否解释一下SA6为什么接高?而SA8却接地?

A:RTL8019AS在非jumpless方式下可以通过CONFIG1寄存器设置RTL8019AS的基地址RTL_BASE_ADDRESS。从RTL_BASE_ADDRESS+00到RTL_BASE_ADDRESS+1F范围的IO地址属于RTL8019as内部寄存器。10-17的任意一个地址都对应RemoteDMAPort,而18-1F任意一个都对应ResetPort。例如设置基地址为2400的时候在SA0-SA19上给出0x2400就可以访问RTL内部第一个寄存器。在jumpless方式下,也就是JP引脚为1的情况下,外部引脚BD0-BD3对应CONFIG1寄存器的IOS3-IOS0,也就是说通过引脚就可以设置基地址。你看到的连接方案不同很可能是由于基地址设置的不同引起的。