以太网方案简介及软硬件介绍概要_第1页
以太网方案简介及软硬件介绍概要_第2页
以太网方案简介及软硬件介绍概要_第3页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

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

文档简介

1、以太网方案简介及软硬件介绍(以太网模块图)本公司使用我们所推广的SILICON LABS 公司 C8051F023设计出功能强大、性能完善的以太网模块,此以太网方案主要实现串口通讯和以太网通讯之间的转换,其主 要应用在门禁楼宇控制,远距离数据采集,工业智能通讯, 煤矿井下各种外设挂载转换,以及相关的接口转换通讯。其 通讯速度可以实现 500KBPS以上,完全满足工业控制内的 数据通讯要求。以下为一个简单的由远程计算机和该模块通讯的示意图该232-TCP/IP模块可以挂接在世界上任意的以太网上, 只要知道其IP地址,可以在世界上任意角落进行互联。在 Internet可以随意的进行控制和访问,进行

2、远距离的控制更是得心应手。随着网络的逐渐普及,家居安全智能设备也应运而生, 232-TCP/IP模块解决了高智能性设备和以太网之接桥接的 作用,也可以使用在门禁楼宇控制上,组建局域网。主要芯片有 MAX232(串口的电平转换),24cO2(IIC 总线的 eeprom),373( 8 位锁存),62256( 32K 的 RAM).其中的 24C02 也可以不要,可以通过存取网卡芯片(RTL8019)上的93C46来实现,62256为外部32K的Ram,也可以不用,可以用网 卡心片上的RAM来代替,但是网卡上的Ram的存取比较复 杂,速度会比加62256慢。为了编程的方便,和实现快的传 输速度,

3、以及为完成更为复杂的应用,选择使用62256,用C8051F023 单片机和外加 62256,可以实现 500KBPS 以上的 传输速度操作方式 Operating Mode :跳线方式 Jumperless (不是即插即用 Plug and Play) 端口 I/O base: 0240-25FH 中断 Interrupt :2/9输入输出地址 :共 32个,地址偏移量为 00H-1FH,( 对应于 240H25FH,240H 的地址偏移量为0, 241H的地址偏移量为1,000 25FH的地址偏移量为1FH)。其中OOH 0FH共16个地址,为寄存器地址。 10H- 17H共8个地址,为

4、DMA地址。 18H- 1FH共8个地址,为复位端口。对于 8 位的操作方式,上面的地址中只有 18 个是有用的: 00H- 0FH共16个寄存器地址。10H DMA地址 (10H- 17H的8个地址是一样的,都可以用来做 DMA端口,只 要用其中的一个就可以了)仆H复位地址。(18H到1FH共8个地址都是复位地址,每个地址的功能都是一 样的,只要其中的一个就可以了,但实际上只有18H,1AH,1CH,1EH这几个复位端 口是有效的,其他不要使用,有些兼容卡不支持19H,1BH,1DH等奇数地址的复位)中的第 7 位 RST 跟复位有关0 网卡执行正确的复位之后该位为 10在 linux 或

5、windows 的驱动程序中,一般在复位之后检 查该标志位以确认是否正确复位, 特别是在即插即用的检测过程中0 对于用单片机控制网卡 来说,可以不检查该标志位,因为如果复位不正常的情况通常是网卡坏了0寄存器:00H 0FH共16个地址是寄存器地址。 寄存器分成4页PAGE0-PAGE3,但NE2000 兼容的寄存器只有 3页(Page0-Page2),(第四页是RTL8019AS自己定义的,我们不用去管这 些寄存器,因为你对第四页的寄存器的操作仅对这个网卡是有效的,序从 main() 开始执行:main()delaymsecond(10);/ 延时大约 1 秒, 保证电源稳定和网卡自身的上电完

6、成 netcardreset();/ 复位网卡的子程序网卡的复位子程序:#define reg1f XBYTE0xdf00 / 网卡的复位端口的地址,对应于网卡的地址 25FH。#define uint unsigned int /uint 代表 unsigned int ,#define uchar unsigned char /uchar 代表 unsigned char, 我比较懒,不愿 意多写sbit reset=p3A4; / 单片机的p3.4脚连接到网卡的RSTDR复位引脚void netcardreset()uint data i;uchar data temp;reset=1;

7、 /使网卡的RSTDR引脚变成高电平,网卡是高电平复位的。for(i=0;i<250;i+);/ 延时程序,至少需要reset=0; /使网卡的RSTDR引脚变成低电平,网卡上电复位完毕for(i=0;i<250;i+);temp=reg1f;/ 读网卡的复位端口 reg1f=temp; / 写网卡的复位端口 for(i=0;i<250;i+);上面实际上是网卡复位的两种情况,reset=1;reset=0 相当于冷复位 temp=reg1f;reg1f=temp 相当于热复位 对网卡的复位端口的读或写将复位网卡, 网卡内部将执行复位过程。 读写是随意 的,写入任意的数都将复

8、位网卡。实际上只要使用冷复位就可以了, 热复位程序可以不要。 热复位主要在电脑里有 用,冷复位就像电脑的冷启动,热复位相当于电脑的热启动。网卡的工作参数进行设置 .以使网卡开始工作 .子函数#define regOO XBYTE0xc000 /对应于地址240H为命令寄存器 CR地址void page(uchar pagenumber) uchar data temp;temp=reg00;/command registertemp=temp&0x3f ;pagenumber=pagenumber <<6;temp=temp | pagenumber;reg00=temp;

9、reg00命令寄存器:CR comma nd register,地址偏移量00H,为一个字节 PS1和PSO这两个位用来选择寄存器页,PS1 PSO=OO时选择寄存器页0,=01时选 择寄存器页 1, =10 时选择寄存器页 2,=11 时选择寄存器页 3.上面的程序的参数为page number,用来指定第几页。 temp=regOO ;/ 读入命令寄存器的值。temp=temp&0x3f; 将高 2 位,即 PS1,PSO清 0pagenumber=pagenumber<<6;将低 2 位移至高端 temp=temp|pagenumber, / 写入高 2 位 regO

10、O=temp; / 设置第几页 RD2,RD1,RD这3个位代表要执行的功能。=001读网卡内存=010写网卡内存二011发送网卡数据包=1*完成或结束DMA勺读写操作TXP这个位写入1时发送数据包,发完自动清零 STA STP这两个位用来启动命令或停止命令 =10启动命令=01停止命令 网卡的初始化子程序void ne2000init() reg00=0x21; / 选择页 0 的寄存器,网卡停止运行,因为还没有初始化 reg01=0x4c; / 寄存器 Pstartreg02=0x80; /Pstop reg03=0x4c; /BNRY reg04=0x45; /TPSR reg0c=0x

11、cc; /RCR reg0d=0xe0; /TCR reg0e=0xc8; /DCR 数据配置寄存器 8 位数据 dma reg0f=0x00; /IMR disable all interrupt page(1); / 选择页 1 的寄存器 reg07=0x4d; /CURR reg08=0x00; /MAR0 reg09=0x41; /MAR1reg0a=0x00; /MAR2 reg0b=0x80; /MAR3 reg0c=0x00; /MAR4 reg0d=0x00; /MAR5 reg0e=0x00; /MAR6 reg0f=0x00; /MAR7 reg00=0x22;/ 选择页

12、0 寄存器,网卡执行命令。PSTART接收缓冲区的起始页的地址。PSTOP接收缓冲区的结束页地址。(该页不用于接收)BNRY指向最后一个已经读取的页(读指针)CURR当前的接收结束页地址。(写指针)网卡含有16K字节的RAM地址为0x4000-0x7fff( 指的是网卡上的存储地址, 而不是ISA总线的地址,是网卡工作用的存储器),每 256个字节称为一页,共 有64页。页的地址就是地址的高 8位,页地址为0x40-0x7f 。这16k的ram 的一部分用来存放接收的数据包, 一部分用来存储待发送的数据包。 当然也可以 给用户使用。(例如把网卡设置成使用 8K的ram,另夕卜8K的ram就可以

13、用来给 单片机作为存储器,但我没有这样做,原因是操作网卡上的ram比较复杂)在我的程序中使用 0x40-0x4B 为网卡的发送缓冲区,共 12 页,刚好可以 存储2个最大的以太网包。使用0x4c 0x7f为网卡的接收缓冲区,共52页。因 此PSTART=0x4c,PSTOP=0x80(0x8为停止页,就是直到 0x7f ,是接收缓冲区, 不包括0x80)刚开始,网卡没有接收到任何数据包,所以,BNRY设置为指向第 一个接收缓冲区的页 0x4c) 这四个寄存器用于接收的设置。CUR是网卡写内存的指针。它指向当前正在写的页的下一页。那么初始化 它就应该指向0x4c + 1 = 0x4d。网卡写完接

14、收缓冲区一页,就将这个页地址加CUR= CURR 1。这是网卡自动加的。当加到最后的空页(这里是0x80,PSTOP)时,将CURRS为接收缓冲区的第一页(这里是 0x4c,PSTAR),也是网卡自动 完成的。当CUR= BNRY寸,表示缓冲区全部被存满,数据没有被用户读走,这 时网卡将停止往内存写数据, 新收到的数据包将被丢弃不要, 而不覆盖旧的数据。 此时实际上出现了内存溢出。而BNRR要由用户来操作。用户从网卡读走一页数据,要将BNRY加,然 后再写到BNRY寄存器。当BNRY加到最后的空页(0x80, PSTOP时,同样要将 BNRY变成第一个接收页(PSTART 0x4c)BNRY=

15、0x4c;CUR!和BNRYfc要用来控制缓冲区的存取过程,保证能顺次写入和读出)。 当CURR=BNRY+或当 BNR= 0x7f ,CURR=0x4c时,网卡的接收缓冲区里没有数 据,表示没有收到数据包。 用户通过这个判断知道没有包可以读。当上述条件 不成立时, 表示接收到新的数据包。 然后用户应该读取数据包, 直到上述条件成 立时,表示所以数据包已经读完,此时停止读取数据包。TPSR为发送页的起始页地址。初始化为指向第一个发送缓冲区的页,0x40。 RCR接收配置寄存器,设置为使用接收缓冲区,仅接收自己的地址的数据包 (以及广播地址数据包)和多点播送地址包,小于 64 字节的包丢弃(这是

16、协议 的规定,设置成接收是用于网络分析),校验错的数据包不接收。 TCR 发送配置寄存器,启用 crc 自动生成和自动校验,工作在正常模式。DCR数据配置寄存器,设置为使用FIFO缓存,普通模式,8位数据传输模 式,字节顺序为高位字节在前,低位字节在后(符合我们的习惯)(如果用 16 位的单片机,设置成 16 位的数据总线操作会更快,但 80c52 是 8 位总线的单片 机)IMR中断屏蔽寄存器,设置成0x00,屏蔽所有的中断。设置成0xff将允许中断)MAR® MAR是设置多点播送的参数,这点我也不是很清楚,我从电脑读 出来是什么数,我也将这 8 个寄存器设置成这几个数 . 由于我

17、们不使用多点播 送,所以不要紧,只要保证网卡能正常工作就可以了。网卡的物理地址(网卡地址, 48 位的地址)进行设置。网卡还不知道它应该什 么地址的数据包。 要对网卡的物理地址进行设置, 就必须知道网卡的物理地址是 多少。读取网卡的物理地址的子程序:union u uint word; structuchar high;uchar low;bytes; /我定义的数据结构,为两个字节的结构 / ,可以按照 uint(unsigned int) 来读取,也可以 按照高低字节 high 和 low 来读取。union u mynodeid3;/ 存储网卡的物理地址union u protocal;

18、 / 临时变量void readmynodeid()uchar data i,temp;page(0); reg09=0;/ 寄存器 RSAR1 dma read highaddress=0 reg08=0;/RSAR0 dma read lowaddress=0;reg0b=0; /RBCR1 read count high reg0a=12;/RBCR0 count low reg00=0x0a;/dma read and start for (i=0;i<6;i+) temp=reg10;/ 读取一个字节if (i % 2=0)temp=reg1 0;/ 读取一个重复的字节,这个字

19、节被丢弃-网卡除了 16k (地址0x4000 0X7FFFF的接收发送存储RAM之外,还有别的 RAM还有一块大小为256字节的RAM地址为0x0000- 0x00FF,这部分RAM是 eeprom 93C46的影像存储(不完全一样),存储的内容的一部分跟93C46存储的是一样的。 网卡在上电的时候将93C46的一部分内容读到这256字节的RAM 里。存储是WOR类型,其中地址:0x0000-0x000b 共 12个字节是网卡的物理地址。(网卡的物理地址是 6个字节 的,为什么要用 12 字节?因为这 12 字节是重复存储的。例如网卡物理地址 0X52544CC118CF存储在 0x0000

20、-0x000b 里是这样的:525254544C4CC1C11818CFCF可以看到单和双的地址存储的是一样的。 0x000b 后面的地址存储的是生产厂商 的代码和产品标识代码,也是单双地址重复存储,这里就不说了。这个程序又用到 4 个新的寄存器: RSAR1 RSAR0 RBCR1 RBCR0 这 4 个寄存器是专门用于读取网卡上面的 ram 的。RSAR1网卡上的RAM的起始地址高8位RSARO网卡上的RAM的起始地址低8位程序中的reg09 , reg08都设成0,所以是从网卡上的0x0000地址开始读 RBCR1要读取的字节数的计数(高8位)RBCR0要读取的字节数的计数(低8位)程序

21、中的reg0b = 0, reg0a=12,所以要读取12个字节。 reg00=0x0a的意思是进行DMA勺内存读取操作。结果将网卡地址存储在 mynodeid3 (共 6 个字节)里以下程序是设置网卡的地址, 只有符合这个地址的数据包才接收void writemynodeid() page(1);reg01=mynodeid0.bytes.high; /PAR0 reg02=mynodeid0.bytes.low; /PAR1 reg03=mynodeid1.bytes.high; /PAR2 reg04=mynodeid1.bytes.low; /PAR3reg05=mynodeid2.b

22、ytes.high; /PAR4 reg06=mynodeid2.bytes.low; /PAR5又用到几个新的寄存器 , 是页 1 的几个寄存器 :PAR0,PAR1, PAR2, PAR3,PAR4,PAR5这几个寄存器是网卡的工作时候用的地址 , 只有符合这个地址的数据包才接收 , 这个地址是可以设置为其他的值 , 不一定设置为网卡的物理地址 , 为了不跟别的 网卡地址冲突 , 最好设置为网卡的地址 ,( 如果用户需要设置为其他的值 , 也是可 以的).以太网的地址为 48位,由 ieee 统一分配给网卡制造商,每个网卡的地址都必 须是全球唯一的。共 6 个字节的长度字节 543210位

23、47。 4039。3231 oo 2423oo 1615。87oo 0例子 080009 A04AB1以太网地址的第32位是组播地址的标志位:位47oo 333231 oo 2423oo 0制造厂商标识组播标志位制造厂商标识系列号共6个字节,其中前面3个字节(除了第32位),组成制造厂商的标识,每个 制造厂商的前3个字节是不同的,如果两个网卡的前面3个字节是一样的,那么这个卡是同一个公司制造的。同时通过该3个字节就可以反过来知道这个卡是哪个厂制造的。后面3个字节为系列号,由制造厂商给自己生产的网卡分配 一个号码,不同网卡的号码必须不同,网卡地址的制造厂商的3个字节的标识中,例如上面的08:00

24、:09 ,080009是惠普公司的标识,表示这个卡是惠普公司 制造的。3个字节的第一个字节,必须为偶数,上面的08是一个偶数,是因为第32位,就是第一个字节的最低位是组播标识,必须为 0。以下X0:XX:XX:XX:XX:XXX2:XX:XX:XX:XX:XXX4:XX:XX:XX:XX:XXX6:XX:XX:XX:XX:XXX8:XX:XX:XX:XX:XXXA:XX:XX:XX:XX:XXxcxx:xx:xx:xx:xx XE:XX:XX:XX:XX:XX为合法的以太网网卡地址。上面的 X代表0F中的任一个。如果你不是购买网 卡,而是自己购买芯片制造,那么地址怎么办?可以自己使用一个还没有

25、被ieee分配的厂商编号就可以了。就算是使用已经分配的厂商编号也没有不可,只要 你能保证在你使用的局域网内,任何两个网卡的地址不一样就可以了。地址FF:FF:FF:FF:FF:FF为广播地址,只能用在目的地址段,不能作为源地址 段。目的地址为广播地址的数据包,可以被一个局域网内的所有网卡接收到。地址X1:XX:XX:XX:XX:XXX3:XX:XX:XX:XX:XXX5:XX:XX:XX:XX:XXX7:XX:XX:XX:XX:XXX9:XX:XX:XX:XX:XXXB:XX:XX:XX:XX:XXXD:XX:XX:XX:XX:XXXF:XX:XX:XX:XX:XX为组播地址,只能作为目的地址

26、,不能作为源地址。组播地址可以被支持该组 播地址的一组网卡接收到。组播地址主要用在视频广播,远程唤醒(通过发一 个特殊的数据包使网卡产生一个中断信号,启动电脑),游戏(多个人在局域 网里联机打游戏)里等。以下是一些具体的组播地址:地址 范围01:00:5E:00:00:00 -01:00:5E:7F:FF:FF 用于 ip 地址的组播 其他组播地址跟 tcp/ip 无关,不做介绍 网卡可以接收以下 3 种地址的数据包:第一种 目的地址跟自己的网卡地址是一样的数据包第二种 目的地址为 FF:FF:FF:FF:FF:FF 广播地址的数据包 第三种 目的地址为跟自己的组播地址范围相同的数据包 那么在

27、以太网的应用当中,如果你希望你的数据包只发给一个网卡,目的地址 用对方的网卡地址 如果你想把数据包发给所有的网卡,目的地址用广播地址 如果你想把数据包发给一组网卡,目的地址用组播地址。对 93c46 读或写要用到两个寄存器 ,一个是 RTL8019AS 的命令寄存器 CR, 一个是第 3 页的 9346CR 寄存器 .先向 CR 写入 0xE2 选择第 3 页的寄存器 ,然后就可以通过存取 9346CR 来进行 93c46 的读或 者写了 .读 93C46 的程序 :1.移位输出 8 位数据的子程序 :void do_93c46Nuchar address “7/93c46 co皿andH 7

28、654321a./eeHleenOncncseeseeskeedieedo'HC33kdidouchar count;£d£ (count=0;count<8;count+)i£(taddress&OxaO)!=0)(/out 1regOl'OxBa;/1000laiDb :cs=l sk*0di=lreg01-0x8e;/10001110b :cs-1 sk=ldi=l else7/out 0reg01-0x38;/丄000LOODb :cslsk=0di-0regOl-OxSc;/10001100b :cs-1sk=ldi-0ad

29、dress=addtess«l;regOI 即 9346CRregOO 为 CR对93C46读或者写必须使 EEM1=1 EEM0=0.EECS空希9 93C46的CS脚,RTL8019AS的输出,93C46的输入.EESK空希9 93c46的SK脚,RTL8019AS的输出,93C46的输入.EEDI控制93c46的DI脚,RTL8019AS的输出,93C46的输入.EEDO是 93c46的DO脚的状态,为RTL8019AS勺输入,93C46的输出.93C46读的程序:uint read 93c46uchai: address)/53c46 ccmmaiid register: /

30、7654/semieeaOncnc/ uchat: count;uint retval;包chitess=addres3 I 3x80;reg00=0xe2; /seLec匸 page 3 / first bit- is 1 re01=0xea; / 1000 1000b : reg01=0x8e; / IODO 1100b : do_33c46(address);for (count=O;counc<16;countrH-registercs-1 cs = l3 = 11eedididi-1di=l0eedodo./out. 0 reg01-0x88; / 1000 re)l=Qxec

31、; / J.000 retval=retval«l;if(regOlOxOl)'-0)1000b :LXOOb :cs=lcs=lskQsk=ldi-0di=0retval=retvalI 0x01;re)l=Qxe0 ; /1Q00 Eeg01=0x00;/0000return recval);)1000b :OOOOt :cs=lcs=0sk=O sk=Odi=O di=O注解:address为地址,为0-63,字地址,而不是字节地址.字节地址:00 ,01用字地址为0字节地址:02,03用字地址为1 最后一句reg0仁0x00,表示向9346CF写入0,退出93C46的

32、读写.这句不能忽略 返回值为16位的uint(unsigned int). 返回值中的高字节为位0-7,低字节为 8-15,注意跟单片机的相反.操作命令为上面的Instution Set 里的read.时序为上面的Read Timing.93C46的写程序:value)void write 93c46(uchar addtesS/Uint/93c46 comitarui register:/7/ eeiuI / reg00=0xe2;654eemOncnc/select page 3汗 Enable pcogi:aiming modes.ElflEN regOl-OxBa; / 1000 re

33、gOl-OxSe; / 1000 do_93c46(0x3c);regOlOxSG ; /IODO regOlOxOO; /00001010b : mot :LOOOb :0000b :32eeca eeskcsskregister co&iand=l1eedidi0eedodo0011 1100 =Qxl3c */p Do the actual write, WRITE regOl=Ox0a; / IODO lfllOb : regOlOxBe; / 1000 1110b : address=address 10x40; doSc (address); do_93c46 (value

34、»3): do_3c46 (valuefiOxff); regOl-OxBS ; /1000 lOOOto : regOl-OxDO; /OOOO OOGOb : /* wait Eor vritefinish */ tegOl-OxB® ; /I000 lQOOb :CS-13C = 0di-1CS-1sk-ldi=lcs=lsk=0di=0C3=0sk=0di-0cojiand=l iDIOxkkxxcs=lsli=Qdi=lcs = ldi=lsk«0dl-0C3 = 0st=OliDcs = Lsh=Odi = 0f ot (value=0;value&l

35、t;10000;value-H-)it(tegOlOxOl!=0)break;regOl«0xG0; /OOOO 0000b : 严 Disable programing, EW5LOlOt):1110b :reg01=0x8a; / 1000 regOl-OxSe; / 1000 do_93c46(0x00); reJoiOxBG ; /1000 reg01=0x00;7/00001000b :0000b :C3«0coiaand=X OOGO cs=l cs = l5R-0 sk=ldi-DDODC */ di*l di=lcs=l 匚s=0sk=0sk=0di=0di

36、-0注解: 写程序中,address为地址0-63,value 为16位(两个字节),必须一次性写入2 个字节wait for write finish 里的for循环是为了不至于程序死锁,比如出错时,可能 引起93c46 一直处于忙的状态.这样最多执行查询1万次就退出.这是用户必须注意的,当你编写类似的程序,比 如IIC总线的写操作,也要这样做,否则你的单片机可能死在那里.93C46写入一次的时间为1毫秒左右,最大不超过10毫秒.93C46允许最大的sk时钟为2Mhz,因为单片机的总线速度不超过 2Mhz ,所以每 两条指令之间不用插入延时.如果你用比较快的cpu,比如AVR或 DSP,可能

37、要插入 延时.reg0仁0x00,表示向9346CR写入0,每完成一个93C46的命令,都以它结束.这句 不能忽略写需要执行3个93c46命令:1. EWEN comman写 使能2. WRITE comma n写数据3. EWDS commanIS 止写软件设计对网卡的编程就是对网络接口控制器(NIC) RTL8019AS中各种寄存器进行编程控制,从而完成数据分组的正确发送和接收。所有程序采用Franclin C51语言编制,。主程序主程序可分为网络通讯和串行通讯两部分。网络通讯过程又可分为网卡初始化、发送 控制和接收控制等三部分。主程序框图如图2所示。图2主程序框图网卡初始化过程对网卡的初

38、始化就是对相关寄存器进行初始化。这些寄存器包括CR、DCR、RBCR、PSTART、PSTOP、ISR、IMR、PAR0-PAR5、MAR0-MAR5、CURR、TCR 和 RCR 等。初始化过程如下:(1)CR=0x21 :选择页0寄存器,将NIC处于离线状态;(2)DCR=0x88 : 8位内存访问,正常工作方式;(3)RBCR0=0,RBCR1=0 :远程 DMA操作时传递字节数清零;(4)RCR=0xc0 :接收到的帧存入缓冲环;(5)TCR=0xe2 :环路测试状态;(6)PSTART=0x4c ,PSTOP=0x80 :构造缓冲环;(7)ISR=0xff :中断寄存器清零;(8)I

39、MR=0x00 :屏蔽所有的中断;(9) CR=0x61 :选择页 1 ;(10) 设置网卡地址 PAR0-PAR5 ;(11 )设置多址寄存器 MAR0-MAR5 ;(12) CURR=0x4d :初始化当前页寄存器;(13) CR=0x22 :选择页1,正常工作状态;(14) TCR=OXEO :发送器正常工作状态;发送控制过程在网络中,帧传输的过程就是发送方将待发送的数据按帧格式要求封装成帧,然后通 过网卡发送到网络的传输线上。发送程序框图如图3所示。7门”图3发送程序框图接收控制过程帧的接收过程分为两步:第一步由本地DMA将帧存入接收缓冲环中;第二步由远程DMA将接收缓冲环中的帧读入内

40、存。即将网络上的数据帧接收并缓存在网卡的接收缓冲环 中,然后由主机程序将缓存在缓冲环中的帧读走并存入内存中。帧的接收工作由网卡自动完成,只需对与相关的寄存器如PSTART、PSTOP、CURR和BNRY进行适当的初始化即可。帧读入较帧接收要复杂一些。首先必须初始化相应的寄存器RSAR、RBCR,然后再启动远程DMA读操作和主机程序的读端口操作。以下是接收数据帧的子程序,为了获得数据长度,我们先读入18个字节的数据,然后根据有效数据的长度将帧完整读入。为了启动远程DMA读操作,应该令 CR=0AH,远程DMA将从接收缓冲环的 DMA地址处读入1字节并送往I/O数据端口,由主机程序读入内 存。这一

41、过程将一直持续到RBCR寄存器为0。void< -unsigned char data value,tpnip;unsigned int data datalength,i;flSAR1-Hext_PKT;RSARO=9;RBCR0=18;RBCH1=0;CR=0xfar(i=0;i<18;i+)ualuc=Data_Port;recv_bufi=value;> _datalength=(recu_buF16 j«8) + recv_buf 17J+18;Malue=datalength&0xQOf ;RBCRBualue;ualue=(datalength

42、03)>>8:RBCRIvalue;RSAR1=Hext_PKT;CRBx 眄For (0; Kdatalength ;i+)<ualue=Data_Port;recv_bufijualue;串口通讯子程序为实现数据文件的串口传输编制了一个串口通讯协议,该协议由引导帧、长度帧、数据帧和确认帧等组成。 其中引导帧是用于同步每一包数据的引导头,长度帧是这一包数据的 总长度,数据帧是其中的数据信息,确认帧是接收方对发送方的回应。每帧数据由 16 个字 节组成,每帧的第 14 个字节为标志位,第 15 字节为校验位。标志位中有 2 位帧标志位, 3 位序号位;校验采用和校验,只计算 0-13 字节,溢出值舍去。在发送方有数据发送时,先 检测线路是否空闲,如线路空闲则向接收方发送 “请求发送数据 ”命令帧。接收机收到后,如 准备就绪,则回送 “可以发送 ”的确认命令。发送方得到确认后开始发送数据。接收方对收到 的每一帧数据进行和校验,校验正确发送 “和

温馨提示

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

评论

0/150

提交评论