以太网方案简介及软硬件介绍(以太网模块图)本公司使用我们所推广的SILICON LABS 公司C8051F023设计出功能强大、性能完善的以太网模块,此以太网方案主要实现串口通讯和以太网通讯之间的转换,其主要应用在门禁楼宇控制,远距离数据采集,工业智能通讯,煤矿井下各种外设挂载转换,以及相关的接口转换通讯。
其通讯速度可以实现500KBPS以上,完全满足工业控制内的数据通讯要求。
以下为一个简单的由远程计算机和该模块通讯的示意图。
该232-TCP/IP模块可以挂接在世界上任意的以太网上,只要知道其IP地址,可以在世界上任意角落进行互联。
在Internet可以随意的进行控制和访问,进行远距离的控制更是得心应手。
随着网络的逐渐普及,家居安全智能设备也应运而生,232-TCP/IP模块解决了高智能性设备和以太网之接桥接的作用,也可以使用在门禁楼宇控制上,组建局域网。
主要芯片有MAX232(串口的电平转换),24c02(IIC总线的eeprom),373(8位锁存),62256(32K的RAM).其中的24C02也可以不要,可以通过存取网卡芯片(RTL8019)上的93C46来实现,62256为外部32K的Ram,也可以不用,可以用网卡心片上的RAM来代替,但是网卡上的Ram的存取比较复杂,速度会比加62256慢。
为了编程的方便,和实现快的传输速度,以及为完成更为复杂的应用,选择使用62256,用C8051F023单片机和外加62256,可以实现500KBPS以上的传输速度操作方式Operating Mode:跳线方式Jumperless(不是即插即用Plug and Play)端口I/O base:0240-25FH中断Interrupt:2/9输入输出地址:共32个,地址偏移量为00H--1FH,(对应于240H--25FH,240H 的地址偏移量为0,241H的地址偏移量为1,。
25FH的地址偏移量为1FH)。
其中00H--0FH共16个地址,为寄存器地址。
10H--17H共8个地址,为DMA地址。
18H--1FH共8个地址,为复位端口。
对于8位的操作方式,上面的地址中只有18个是有用的:00H--0FH共16个寄存器地址。
10H DMA地址(10H--17H的8个地址是一样的,都可以用来做DMA端口,只要用其中的一个就可以了)1FH 复位地址。
(18H到1FH共8个地址都是复位地址,每个地址的功能都是一样的,只要其中的一个就可以了,但实际上只有18H,1AH,1CH,1EH这几个复位端口是有效的,其他不要使用,有些兼容卡不支持19H,1BH,1DH等奇数地址的复位)中的第7位RST跟复位有关。
网卡执行正确的复位之后该位为1。
在linux或windows的驱动程序中,一般在复位之后检查该标志位以确认是否正确复位,特别是在即插即用的检测过程中。
对于用单片机控制网卡来说,可以不检查该标志位,因为如果复位不正常的情况通常是网卡坏了。
寄存器:00H--0FH共16个地址是寄存器地址。
寄存器分成4页PAGE0--PAGE3,但NE2000兼容的寄存器只有3页(Page0-Page2),(第四页是RTL8019AS自己定义的,我们不用去管这些寄存器,因为你对第四页的寄存器的操作仅对这个网卡是有效的,序从main()开始执行:main(){delaymsecond(10);//延时大约1秒,保证电源稳定和网卡自身的上电完成。
netcardreset();//复位网卡的子程序。
}网卡的复位子程序:#define reg1f XBYTE[0xdf00] //网卡的复位端口的地址,对应于网卡的地址25FH。
#define uint unsigned int //uint 代表unsigned int ,#define uchar unsigned char //uchar 代表unsigned char,我比较懒,不愿意多写sbit reset=p3^4; //单片机的p3.4脚连接到网卡的RSTDRV复位引脚void netcardreset(){uint data i;uchar data temp;reset=1; //使网卡的RSTDRV引脚变成高电平,网卡是高电平复位的。
for(i=0;i<250;i++);//延时程序,至少需要reset=0; //使网卡的RSTDRV引脚变成低电平,网卡上电复位完毕for(i=0;i<250;i++);temp=reg1f;//读网卡的复位端口reg1f=temp; //写网卡的复位端口for(i=0;i<250;i++);}上面实际上是网卡复位的两种情况,reset=1;reset=0相当于冷复位temp=reg1f;reg1f=temp相当于热复位对网卡的复位端口的读或写将复位网卡,网卡内部将执行复位过程。
读写是随意的,写入任意的数都将复位网卡。
实际上只要使用冷复位就可以了,热复位程序可以不要。
热复位主要在电脑里有用,冷复位就像电脑的冷启动,热复位相当于电脑的热启动。
网卡的工作参数进行设置.以使网卡开始工作.子函数#define reg00 XBYTE[0xc000] //对应于地址240H 为命令寄存器CR地址void page(uchar pagenumber){ uchar data temp;temp=reg00;//command registertemp=temp&0x3f;pagenumber=pagenumber <<6;temp=temp | pagenumber;reg00=temp;}reg00命令寄存器:CR,command register,地址偏移量00H,为一个字节PS1和PS0这两个位用来选择寄存器页,PS1 PS0=00时选择寄存器页0,=01时选择寄存器页1, =10时选择寄存器页2,=11时选择寄存器页3.上面的程序的参数为pagenumber,用来指定第几页。
temp=reg00 ;//读入命令寄存器的值。
temp=temp&0x3f;//将高2位,即PS1,PS0清0pagenumber=pagenumber<<6;//将低2位移至高端temp=temp|pagenumber, //写入高2位reg00=temp; //设置第几页--RD2,RD1,RD0这3个位代表要执行的功能。
=001 读网卡内存=010 写网卡内存=011 发送网卡数据包=1** 完成或结束DMA的读写操作---TXP这个位写入1时发送数据包,发完自动清零---STA,STP这两个位用来启动命令或停止命令=10 启动命令=01 停止命令网卡的初始化子程序void ne2000init(){ reg00=0x21; //选择页0的寄存器,网卡停止运行,因为还没有初始化。
reg01=0x4c; //寄存器Pstartreg02=0x80; //Pstopreg03=0x4c; //BNRYreg04=0x45; //TPSRreg0c=0xcc; //RCRreg0d=0xe0; //TCRreg0e=0xc8; //DCR 数据配置寄存器 8位数据dmareg0f=0x00; //IMR disable all interruptpage(1); //选择页1的寄存器reg07=0x4d; //CURRreg08=0x00; //MAR0reg09=0x41; //MAR1reg0a=0x00; //MAR2reg0b=0x80; //MAR3reg0c=0x00; //MAR4reg0d=0x00; //MAR5reg0e=0x00; //MAR6reg0f=0x00; //MAR7reg00=0x22;//选择页0寄存器,网卡执行命令。
}PSTART 接收缓冲区的起始页的地址。
PSTOP 接收缓冲区的结束页地址。
(该页不用于接收)BNRY 指向最后一个已经读取的页(读指针)CURR 当前的接收结束页地址。
(写指针)--网卡含有16K字节的RAM,地址为0x4000-0x7fff(指的是网卡上的存储地址,而不是ISA总线的地址,是网卡工作用的存储器),每256个字节称为一页,共有64页。
页的地址就是地址的高8位,页地址为0x40--0x7f 。
这16k的ram 的一部分用来存放接收的数据包,一部分用来存储待发送的数据包。
当然也可以给用户使用。
(例如把网卡设置成使用8K的ram,另外8K的ram就可以用来给单片机作为存储器,但我没有这样做,原因是操作网卡上的ram比较复杂)---在我的程序中使用0x40-0x4B为网卡的发送缓冲区,共12页,刚好可以存储2个最大的以太网包。
使用0x4c-0x7f为网卡的接收缓冲区,共52页。
因此PSTART=0x4c,PSTOP=0x80(0x80为停止页,就是直到0x7f,是接收缓冲区,不包括0x80)刚开始,网卡没有接收到任何数据包,所以,BNRY设置为指向第一个接收缓冲区的页0x4c)这四个寄存器用于接收的设置。
--CURR是网卡写内存的指针。
它指向当前正在写的页的下一页。
那么初始化它就应该指向0x4c+1=0x4d 。
网卡写完接收缓冲区一页,就将这个页地址加一,CURR=CURR+1。
这是网卡自动加的。
当加到最后的空页(这里是0x80,PSTOP)时,将CURR置为接收缓冲区的第一页(这里是0x4c,PSTART),也是网卡自动完成的。
当CURR=BNRY时,表示缓冲区全部被存满,数据没有被用户读走,这时网卡将停止往内存写数据,新收到的数据包将被丢弃不要,而不覆盖旧的数据。
此时实际上出现了内存溢出。
---而BNRR要由用户来操作。
用户从网卡读走一页数据,要将BNRY加一,然后再写到BNRY寄存器。
当BNRY加到最后的空页(0x80,PSTOP)时,同样要将BNRY变成第一个接收页(PSTART,0x4c)BNRY=0x4c;---CURR和BNRY主要用来控制缓冲区的存取过程,保证能顺次写入和读出)。
当CURR=BNRY+1(或当BNRY=0x7f ,CURR=0x4c)时,网卡的接收缓冲区里没有数据,表示没有收到数据包。
用户通过这个判断知道没有包可以读。
当上述条件不成立时,表示接收到新的数据包。
然后用户应该读取数据包,直到上述条件成立时,表示所以数据包已经读完,此时停止读取数据包。
--TPSR 为发送页的起始页地址。
初始化为指向第一个发送缓冲区的页,0x40。
--RCR 接收配置寄存器,设置为使用接收缓冲区,仅接收自己的地址的数据包(以及广播地址数据包)和多点播送地址包,小于64字节的包丢弃(这是协议的规定,设置成接收是用于网络分析),校验错的数据包不接收。