[ZLG-ARM] 请教ZLG/IP驱动程序中Rec_Packet()的疑问

[复制链接]
3510|17
 楼主| mydearm 发表于 2008-1-22 19:09 | 显示全部楼层 |阅读模式
在Rec_Packet()中有一段程序:<br />&nbsp;&nbsp;&nbsp;&nbsp;if(bnry!=curr)&nbsp;&nbsp;&nbsp;&nbsp;//此时表示有新的数据包在缓冲区里<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//在任何操作都最好返回page0<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(REC_BUFF_NUM==MAX_REC_BUFF)//接收缓冲区号清零<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;REC_BUFF_NUM=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;REC_BUFF_PTR_WORDS=REC_BUFF[REC_BUFF_NUM].words;//设定接收缓冲区的起始地址<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//=======================================<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WriteToNet(0x09,bnry);&nbsp;&nbsp;&nbsp;&nbsp;//RSAR1写入读页地址的高字节<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WriteToNet(0x08,0x00);&nbsp;//RSAR0写入读页地址的低字节<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WriteToNet(0x0b,0x00);&nbsp;&nbsp;&nbsp;&nbsp;//RSCR1写入读取字节计数高字节<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WriteToNet(0x0a,18);&nbsp;&nbsp;&nbsp;//RSCR0写入读取字节计数高字节<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WriteToNet(0x00,0x0a);&nbsp;//启动Remote&nbsp;DMA读操作<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//读取一包的前4个字节:4字节的8019头部<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i&lt2;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*REC_BUFF_PTR_WORDS=ReadFromNet(0x10);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp=*REC_BUFF_PTR_WORDS;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;REC_BUFF_PTR_WORDS++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />上面程序中在读取包的前4个字节前对RSCR1和RSCR0的设置分别是WriteToNet(0x0b,0x00);&nbsp;&nbsp;WriteToNet(0x0a,18);&nbsp;&nbsp;&nbsp;我的疑问是:既然接下来的程序是读取包的前4个字节,那么对RSCR0设置应该是WriteToNet(0x0a,4);但程序为什么是设的18呢?我怎么也想不通.想请教一下各位大侠!万分感谢啦!<br /><br />
 楼主| mydearm 发表于 2008-1-23 09:07 | 显示全部楼层

求救啊!

自己顶一下!
sunny_jgp 发表于 2008-1-23 10:00 | 显示全部楼层

RE

我也并到过,改成WriteToNet(0x0a,4);也没问题哦
 楼主| mydearm 发表于 2008-1-23 10:03 | 显示全部楼层

谢谢sunny_jgp !

哦,是这样的吗?呵呵,看来我的理解没错啊!谢谢!
sunny_jgp 发表于 2008-1-23 10:06 | 显示全部楼层

LZ

LZ,你用的是SMARTARM2200吗,你可否把你的光盘里的SMART2200_ISP1161A的驱动(电脑端的)和USB_I2C.EXE的发到我信箱吗;uye123456@yahoo.com.cn
 楼主| mydearm 发表于 2008-1-23 10:22 | 显示全部楼层

re:sunny_jgp

不好意思,我用的是EASYARM2200
sunny_jgp 发表于 2008-1-23 10:25 | 显示全部楼层

lz

那也谢谢你
 楼主| mydearm 发表于 2008-1-23 10:49 | 显示全部楼层

再请教一个问题!

我还有一个关于Rec_Packet()疑问:<br />Rec_Packet()中有一段程序:<br />&nbsp;<br />else//表示数据包是完好的.读取剩下的数据<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WriteToNet(0x09,bnry);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//RSAR1写入读页地址的高字节//read&nbsp;page&nbsp;address&nbsp;high<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WriteToNet(0x08,4);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//RSAR0写入读页地址的低字节//read&nbsp;page&nbsp;address&nbsp;low<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WriteToNet(0x0b,tmp[1]&gt&gt8&0x00ff);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//RSCR1写入读取字节计数高字节//read&nbsp;count&nbsp;high<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WriteToNet(0x0a,tmp[1]);&nbsp;&nbsp;&nbsp;&nbsp;//RSCR0写入读取字节计数低字节//read&nbsp;count&nbsp;low;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WriteToNet(0x00,0x0a);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//启动Remote&nbsp;DMA读操作<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//read&nbsp;dma<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;length=tmp[1];//计算出要读取的帧的长度<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(ii=0;ii&lt((length+1)/2);ii++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*REC_BUFF_PTR_WORDS=ReadFromNet(0x10);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;REC_BUFF_PTR_WORDS++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />其中:我对于for(ii=0;ii&lt((length+1)/2);ii++)的理解是:由于是16位总线,故只要读(length+1)/2次就可以整个数据包读完,但当包的长度是奇数(即length为奇数),就会多读的一个字节.那多读的一个字节如何处理呢????????????????请教各位大侠!万分感谢啦!&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 楼主| mydearm 发表于 2008-1-23 14:09 | 显示全部楼层

帮忙啊!

自己再顶一下!<br />
我是火光 发表于 2008-1-23 20:28 | 显示全部楼层

这个DEMO程序,,,

<br />&nbsp;&nbsp;这个DEMO程序,,,有许多多余的成分,你需要精简一把!<br />&nbsp;&nbsp;
我是火光 发表于 2008-1-23 20:52 | 显示全部楼层

我改进过的RTL8019AS部分,你可以看看

#include&nbsp;&quot;config.h&quot;<br />#include&nbsp;&quot;LPC2294.h&quot;<br />#include&nbsp;&quot;general.h&quot;<br /><br />#define&nbsp;&nbsp;&nbsp;&nbsp;INT_N&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x00000080<br />#define&nbsp;&nbsp;&nbsp;&nbsp;NET_RST&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x00000040<br />#define&nbsp;&nbsp;&nbsp;&nbsp;NET_BASE_ADDR&nbsp;&nbsp;&nbsp;0x83400000<br /><br />//{0x52,0x54,0x4c,0x19,0xf7,0x42}<br /><br />#define&nbsp;&nbsp;&nbsp;&nbsp;The_PAR0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x52<br />#define&nbsp;&nbsp;&nbsp;&nbsp;The_PAR1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x54<br />#define&nbsp;&nbsp;&nbsp;&nbsp;The_PAR2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x4C<br />#define&nbsp;&nbsp;&nbsp;&nbsp;The_PAR3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x19<br />#define&nbsp;&nbsp;&nbsp;&nbsp;The_PAR4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0xF7<br />#define&nbsp;&nbsp;&nbsp;&nbsp;The_PAR5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x42<br /><br />uint8&nbsp;&nbsp;&nbsp;&nbsp;Tx_Buff_Page&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;0x46;<br /><br />void&nbsp;WriteToNet(uint8&nbsp;ADDR_16,&nbsp;uint16&nbsp;WRITEDATA)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;(*((volatile&nbsp;unsigned&nbsp;short&nbsp;*)NET_BASE_ADDR&nbsp;+&nbsp;ADDR_16))&nbsp;=&nbsp;WRITEDATA;&nbsp;&nbsp;&nbsp;&nbsp;//0x83400000<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;return;&nbsp;&nbsp;&nbsp;&nbsp;<br />}<br /><br />uint16&nbsp;ReadFromNet(uint8&nbsp;ADDR_16)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;uint16&nbsp;temp_uint16;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;temp_uint16&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;(*((volatile&nbsp;unsigned&nbsp;short&nbsp;*)NET_BASE_ADDR&nbsp;+&nbsp;ADDR_16));&nbsp;&nbsp;&nbsp;&nbsp;//0x83400000<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;&nbsp;&nbsp;&nbsp;temp_uint16;<br />}<br /><br />void&nbsp;SetPage(uint8&nbsp;pagenumber)&nbsp;&nbsp;<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;uint8&nbsp;temp_uint8;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;temp_uint8&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;ReadFromNet(0);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//command&nbsp;register<br />&nbsp;&nbsp;&nbsp;&nbsp;temp_uint8&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;temp_uint8&nbsp;&&nbsp;0x3B;&nbsp;&nbsp;&nbsp;&nbsp;//注意txp位不能要<br />&nbsp;&nbsp;&nbsp;&nbsp;pagenumber&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;pagenumber&nbsp;&lt&lt&nbsp;6;<br />&nbsp;&nbsp;&nbsp;&nbsp;temp_uint8&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;temp_uint8&nbsp;|&nbsp;pagenumber;<br />&nbsp;&nbsp;&nbsp;&nbsp;WriteToNet(0,&nbsp;temp_uint8);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;return;<br />}<br /><br />void&nbsp;InitNic(void)&nbsp;&nbsp;<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;temp_i;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;PINSEL0&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;PINSEL0&nbsp;&&nbsp;~0x0000F000;<br />&nbsp;&nbsp;&nbsp;&nbsp;IO0DIR&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;(IO0DIR&nbsp;&&nbsp;~INT_N)&nbsp;|&nbsp;NET_RST;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;IO0CLR&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;NET_RST;<br />&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(temp_i&nbsp;=&nbsp;0;&nbsp;temp_i&nbsp;&lt&nbsp;40000;&nbsp;temp_i++);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;IO0SET&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;NET_RST;<br />&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(temp_i&nbsp;=&nbsp;0;&nbsp;temp_i&nbsp;&lt&nbsp;40000;&nbsp;temp_i++);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;IO0CLR&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;NET_RST;<br />&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(temp_i&nbsp;=&nbsp;0;&nbsp;temp_i&nbsp;&lt&nbsp;40000;&nbsp;temp_i++);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;//WriteToNet(0x1F,&nbsp;0x00);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;//for&nbsp;(temp_i&nbsp;=&nbsp;0;&nbsp;temp_i&nbsp;&lt&nbsp;40000;&nbsp;temp_i++);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;WriteToNet(0x00,&nbsp;0x21);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//使芯片处于停止模式,这时进行寄存器设置&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(temp_i&nbsp;=&nbsp;0;&nbsp;temp_i&nbsp;&lt&nbsp;40000;&nbsp;temp_i++);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;SetPage(0);<br />&nbsp;&nbsp;&nbsp;&nbsp;/////////////////////////////////////////////<br />&nbsp;&nbsp;&nbsp;&nbsp;WriteToNet(0x0F,&nbsp;0x00);<br />&nbsp;&nbsp;&nbsp;&nbsp;WriteToNet(0x07,&nbsp;0xFF);<br />&nbsp;&nbsp;&nbsp;&nbsp;///////////////////////////////////<br />&nbsp;&nbsp;&nbsp;&nbsp;WriteToNet(0x0E,&nbsp;0xCB);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//DCR&nbsp;???<br />&nbsp;&nbsp;&nbsp;&nbsp;WriteToNet(0x0C,&nbsp;0xE0);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//RCR&nbsp;???<br />&nbsp;&nbsp;&nbsp;&nbsp;WriteToNet(0x0D,&nbsp;0xE0);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//TCR&nbsp;???<br />&nbsp;&nbsp;&nbsp;&nbsp;///////////////////////////////////<br />&nbsp;&nbsp;&nbsp;&nbsp;WriteToNet(0x01,&nbsp;0x4C);<br />&nbsp;&nbsp;&nbsp;&nbsp;WriteToNet(0x02,&nbsp;0x80);<br />&nbsp;&nbsp;&nbsp;&nbsp;WriteToNet(0x03,&nbsp;0x4C);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;WriteToNet(0x09,&nbsp;0x40);<br />&nbsp;&nbsp;&nbsp;&nbsp;WriteToNet(0x08,&nbsp;0x00);<br />&nbsp;&nbsp;&nbsp;&nbsp;WriteToNet(0x0B,&nbsp;0x00);<br />&nbsp;&nbsp;&nbsp;&nbsp;WriteToNet(0x0A,&nbsp;0x00);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;WriteToNet(0x04,&nbsp;0x40);<br />&nbsp;&nbsp;&nbsp;&nbsp;WriteToNet(0x06,&nbsp;0x00);<br />&nbsp;&nbsp;&nbsp;&nbsp;WriteToNet(0x05,&nbsp;0x00);<br />&nbsp;&nbsp;&nbsp;&nbsp;/////////////////////////////////////////////<br />&nbsp;&nbsp;&nbsp;&nbsp;SetPage(1);<br />&nbsp;&nbsp;&nbsp;&nbsp;/////////////////////////////////////////////<br />&nbsp;&nbsp;&nbsp;&nbsp;WriteToNet(0x07,&nbsp;0x4D);<br />&nbsp;&nbsp;&nbsp;&nbsp;///////////////////////////////////<br />&nbsp;&nbsp;&nbsp;&nbsp;WriteToNet(0x01,&nbsp;The_PAR0);<br />&nbsp;&nbsp;&nbsp;&nbsp;WriteToNet(0x02,&nbsp;The_PAR1);<br />&nbsp;&nbsp;&nbsp;&nbsp;WriteToNet(0x03,&nbsp;The_PAR2);<br />&nbsp;&nbsp;&nbsp;&nbsp;WriteToNet(0x04,&nbsp;The_PAR3);<br />&nbsp;&nbsp;&nbsp;&nbsp;WriteToNet(0x05,&nbsp;The_PAR4);<br />&nbsp;&nbsp;&nbsp;&nbsp;WriteToNet(0x06,&nbsp;The_PAR5);<br />&nbsp;&nbsp;&nbsp;&nbsp;///////////////////////////////////<br />&nbsp;&nbsp;&nbsp;&nbsp;WriteToNet(0x08,&nbsp;0x00);<br />&nbsp;&nbsp;&nbsp;&nbsp;WriteToNet(0x09,&nbsp;0x00);<br />&nbsp;&nbsp;&nbsp;&nbsp;WriteToNet(0x0A,&nbsp;0x00);<br />&nbsp;&nbsp;&nbsp;&nbsp;WriteToNet(0x0B,&nbsp;0x00);<br />&nbsp;&nbsp;&nbsp;&nbsp;WriteToNet(0x0C,&nbsp;0x00);<br />&nbsp;&nbsp;&nbsp;&nbsp;WriteToNet(0x0D,&nbsp;0x00);<br />&nbsp;&nbsp;&nbsp;&nbsp;WriteToNet(0x0E,&nbsp;0x00);<br />&nbsp;&nbsp;&nbsp;&nbsp;WriteToNet(0x0F,&nbsp;0x00);<br />&nbsp;&nbsp;&nbsp;&nbsp;/////////////////////////////////////////////<br />&nbsp;&nbsp;&nbsp;&nbsp;SetPage(0);<br />&nbsp;&nbsp;&nbsp;&nbsp;WriteToNet(0x0C,&nbsp;0xC4);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//RCR&nbsp;???<br />&nbsp;&nbsp;&nbsp;&nbsp;WriteToNet(0x07,&nbsp;0xFF);<br />&nbsp;&nbsp;&nbsp;&nbsp;WriteToNet(0x00,&nbsp;0x22);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;Tx_Buff_Page&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;0x46;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;return;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />}<br /><br />void&nbsp;Send_Packet(uint16&nbsp;*&nbsp;buf,&nbsp;uint32&nbsp;len)&nbsp;&nbsp;<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;uint32&nbsp;&nbsp;&nbsp;&nbsp;temp_len;<br />&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp_i,&nbsp;temp_j;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(len&nbsp;&lt&nbsp;60)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;len&nbsp;=&nbsp;60;<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(len&nbsp;&&nbsp;1)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;len++;<br />&nbsp;&nbsp;&nbsp;&nbsp;temp_len&nbsp;=&nbsp;len&nbsp;&gt&gt&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(Tx_Buff_Page&nbsp;==&nbsp;0x40)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Tx_Buff_Page&nbsp;=&nbsp;&nbsp;0x46;<br />&nbsp;&nbsp;&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Tx_Buff_Page&nbsp;=&nbsp;&nbsp;0x40;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;SetPage(0);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//切换至第0页<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;WriteToNet(0x09,&nbsp;Tx_Buff_Page);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//设置发送页地址&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;WriteToNet(0x08,&nbsp;0x00);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//写入RSAR0<br />&nbsp;&nbsp;&nbsp;&nbsp;WriteToNet(0x0b,&nbsp;len&nbsp;&gt&gt&nbsp;8);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//写入RSCR1<br />&nbsp;&nbsp;&nbsp;&nbsp;WriteToNet(0x0a,&nbsp;len&nbsp;&&nbsp;0xFF);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//写入RSCR0<br />&nbsp;&nbsp;&nbsp;&nbsp;WriteToNet(0x00,&nbsp;0x12);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//启动DMA写write&nbsp;dma,&nbsp;page0<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(temp_i&nbsp;=&nbsp;0;&nbsp;temp_i&nbsp;&lt&nbsp;temp_len;&nbsp;temp_i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WriteToNet(0x10,&nbsp;*buf++);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;WriteToNet(0x0b,&nbsp;0x00);&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;WriteToNet(0x0a,&nbsp;0x00);<br />&nbsp;&nbsp;&nbsp;&nbsp;WriteToNet(0x00,&nbsp;0x22);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//结束或放弃DMA操作<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;WriteToNet(0x04,&nbsp;Tx_Buff_Page);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//txd&nbsp;packet&nbsp;start;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;WriteToNet(0x06,&nbsp;len&nbsp;&gt&gt&nbsp;8);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//high&nbsp;byte&nbsp;counter<br />&nbsp;&nbsp;&nbsp;&nbsp;WriteToNet(0x05,&nbsp;len&nbsp;&&nbsp;0xFF);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//low&nbsp;byte&nbsp;counter<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;WriteToNet(0x07,&nbsp;0xFF);<br />&nbsp;&nbsp;&nbsp;&nbsp;WriteToNet(0x00,&nbsp;0x3E);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//to&nbsp;sendpacket;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(temp_i&nbsp;=&nbsp;0;&nbsp;temp_i&nbsp;&lt&nbsp;6;&nbsp;temp_i++)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//最多重发6次<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(temp_j&nbsp;=&nbsp;0;&nbsp;temp_j&nbsp;&lt&nbsp;1000;&nbsp;temp_j++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;((ReadFromNet(0)&nbsp;&&nbsp;0x04)&nbsp;==&nbsp;0)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//检查CR寄存器的txp位是否为低,为1说明正在发送,为0说明发完或出错放弃&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(ReadFromNet(0x04)&nbsp;&&nbsp;0x01)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//表示发送成功,判断发送状态寄存器TSR,决定是否出错<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WriteToNet(0x00,0x3E);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//to&nbsp;sendpacket;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;WriteToNet(0x07,&nbsp;0xFF);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;return;<br />}<br /><br />int&nbsp;&nbsp;&nbsp;&nbsp;Rec_Packet(uint16&nbsp;*&nbsp;buf)&nbsp;<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;uint8&nbsp;&nbsp;&nbsp;&nbsp;temp_BNRY,&nbsp;temp_CURR;<br />&nbsp;&nbsp;&nbsp;&nbsp;uint16&nbsp;&nbsp;&nbsp;&nbsp;temp_buf0,&nbsp;temp_buf1;<br />&nbsp;&nbsp;&nbsp;&nbsp;uint32&nbsp;&nbsp;&nbsp;&nbsp;temp_len;<br />&nbsp;&nbsp;&nbsp;&nbsp;uint8&nbsp;&nbsp;&nbsp;&nbsp;temp_uint8;<br />&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp_i;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;SetPage(0);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;/*<br />&nbsp;&nbsp;&nbsp;&nbsp;temp_uint8&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;ReadFromNet(0x07);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//读取中断状态<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(temp_uint8&nbsp;&&nbsp;0xAC)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InitNic();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;-1;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;*/<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;temp_BNRY&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;ReadFromNet(0x03);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//bnry&nbsp;page&nbsp;have&nbsp;read&nbsp;读页指针<br />&nbsp;&nbsp;&nbsp;&nbsp;SetPage(1);<br />&nbsp;&nbsp;&nbsp;&nbsp;temp_CURR&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;ReadFromNet(0x07);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//curr&nbsp;writepoint&nbsp;8019写页指针<br />&nbsp;&nbsp;&nbsp;&nbsp;SetPage(0);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;temp_BNRY++;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//bnry++;<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(temp_BNRY&nbsp;&gt&nbsp;0x7F)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp_BNRY&nbsp;=&nbsp;0x4C;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(temp_BNRY&nbsp;!=&nbsp;temp_CURR)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//此时表示有新的数据包在缓冲区里<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WriteToNet(0x09,&nbsp;temp_BNRY);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//RSAR1写入读页地址的高字节<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WriteToNet(0x08,&nbsp;0x00);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//RSAR0写入读页地址的低字节<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WriteToNet(0x0b,&nbsp;0x00);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//RSCR1写入读取字节计数高字节<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WriteToNet(0x0a,&nbsp;0x04);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//RSCR0写入读取字节计数低字节<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WriteToNet(0x00,&nbsp;0x0a);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//启动Remote&nbsp;DMA读操作<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp_buf0&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;ReadFromNet(0x10);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp_buf1&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;ReadFromNet(0x10);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WriteToNet(0x0b,0x00);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//RSCR1写入读取字节计数高字节<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WriteToNet(0x0a,0x00);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//RSCR0写入读取字节计数高字节<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WriteToNet(0x00,0x22);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//结束或放弃DMA操作<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp_buf1&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;temp_buf1&nbsp;-&nbsp;4;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(((temp_buf0&nbsp;&&nbsp;0x0001)&nbsp;==&nbsp;0)&nbsp;||&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((temp_buf0&nbsp;&&nbsp;0xFF00)&nbsp;&lt&nbsp;&nbsp;0x4C00)&nbsp;||<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((temp_buf0&nbsp;&&nbsp;0xFF00)&nbsp;&gt&nbsp;&nbsp;0x7F00)&nbsp;||<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(&nbsp;temp_buf1&nbsp;&gt&nbsp;0x0600))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetPage(1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp_CURR&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;ReadFromNet(0x07);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//page1读取CURR的值<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetPage(0);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//切换回page0<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp_BNRY&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;temp_CURR&nbsp;-&nbsp;1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//把bnry恢复为下16K中的空余部分<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(temp_BNRY&nbsp;&lt&nbsp;0x4C)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp_BNRY&nbsp;=&nbsp;0x7F;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WriteToNet(0x03,&nbsp;temp_BNRY);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//把BNRY恢复到指向下一帧write&nbsp;to&nbsp;bnry&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WriteToNet(0x07,&nbsp;0xFF);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//清除中断标志<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;-1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//表示数据包是完好的.读取剩下的数据<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WriteToNet(0x09,&nbsp;temp_BNRY);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//RSAR1写入读页地址的高字节//read&nbsp;page&nbsp;address&nbsp;high<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WriteToNet(0x08,&nbsp;0x04);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//RSAR0写入读页地址的低字节//read&nbsp;page&nbsp;address&nbsp;low<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WriteToNet(0x0b,&nbsp;temp_buf1&nbsp;&gt&gt&nbsp;8);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//RSCR1写入读取字节计数高字节//read&nbsp;count&nbsp;high<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WriteToNet(0x0a,&nbsp;temp_buf1&nbsp;&&nbsp;&nbsp;0xFF);&nbsp;&nbsp;&nbsp;&nbsp;//RSCR0写入读取字节计数低字节//read&nbsp;count&nbsp;low;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WriteToNet(0x00,&nbsp;0x0a);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//启动Remote&nbsp;DMA读操作<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp_len&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;temp_buf1&nbsp;/&nbsp;2;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(temp_i&nbsp;=&nbsp;0;&nbsp;temp_i&nbsp;&lt&nbsp;temp_len;&nbsp;temp_i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*buf++&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;ReadFromNet(0x10);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WriteToNet(0x0b,0x00);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//RSCR1写入读取字节计数高字节//read&nbsp;count&nbsp;high&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WriteToNet(0x0a,0x00);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//RSCR0写入读取字节计数高字节//read&nbsp;count&nbsp;low;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WriteToNet(0x00,0x22);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//结束或放弃DMA操作//结束或放弃DMA<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp_BNRY&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;(temp_buf0&nbsp;&gt&gt&nbsp;8)&nbsp;-&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(temp_BNRY&nbsp;&lt&nbsp;0x4C)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp_BNRY&nbsp;=&nbsp;0x7F;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WriteToNet(0x03,&nbsp;temp_BNRY);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WriteToNet(0x07,&nbsp;0xFF);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;temp_buf1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;<br />}<br />
 楼主| mydearm 发表于 2008-1-24 09:51 | 显示全部楼层

谢谢"我是火光"分享的改写程序!

看了您改写的程序,我还是有点疑问:<br />1.在您改写的Rec_Packet()中,读取数据的一段程序是:<br />temp_len&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;temp_buf1&nbsp;/&nbsp;2;<br />for&nbsp;(temp_i&nbsp;=&nbsp;0;&nbsp;temp_i&nbsp;&lt&nbsp;temp_len;&nbsp;temp_i++)<br />*buf++&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;ReadFromNet(0x10);<br />我的疑问是:当temp_buf1&nbsp;为奇数时,就会少读取一个字节啊!<br />您后面的程序:&nbsp;temp_BNRY&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;(temp_buf0&nbsp;&gt&gt&nbsp;8)&nbsp;-&nbsp;1;即把当前的CURR-1赋给BNRY.那么就彻底跳过了少读的那个字节了!<br />您改写的程序仍然没有解决temp_buf1&nbsp;为奇数的问题!<br /><br />2.在您改写的Rec_Packet()中的开始部分省略了对CURR==0的检查!能省略吗?我觉得对CURR==0的检查好象没什么用.即使不能省略,检查CURR也应该是:if(CURR&lt0x4c);而不应该是if(CURR==0);<br /><br />3.在您改写的Rec_Packet()中省略了&quot;读取中断状态&quot;的程序!能省略吗?我觉得不应该省吧!<br />
我是火光 发表于 2008-1-24 19:15 | 显示全部楼层

呵呵,你说的有道理!!!

<br />呵呵,你说的有道理!!!<br />实际上啊,我内心就是假设收到的就是偶数个数据的,,,<br />这里的代码的确是有点问题...<br /><br />我现在觉得最大的困难就是:周公的资料上对RTL8019AS的控制状态寄存器的描述不够详细...<br /><br />CR<br />ISR<br />DCR<br />RCR<br />TCR<br />RSR<br />TSR<br /><br />这几个寄存器中有若干位的意义很模糊...<br />实在是苦恼的很<br /><br />当然了,周公的公司不是专门生产RTL8019AS的厂家,本来是没有义务来回答有关RTL8019AS的疑问的.<br /><br />但我想,如果以周公公司的身份,去向台湾公司索取RTL8019AS的使用方面的更详细资料,是完全能够实现的...<br /><br />如果能有CR、ISR、DCR、RCR、TCR、RSR、TSR的详细资料,那么编写该类型的网络驱动就易如翻掌了,完全能够写出优美的中断方式的RTL8019AS驱动程序了。。。<br /><br /><br /><br /><br /><br />
我是火光 发表于 2008-1-24 19:21 | 显示全部楼层

你的疑问,我编写程序的时候就想到了

<br />你的疑问,我编写程序的时候就想到了,,,<br />最根本的困难就是没有准确的RTL8019AS的资料,,,许多意义是我自己猜测出来的。。。<br /><br />如果有资料,,,这些问题完全能够解决的,,,关键的是现在没有资料。。。
 楼主| mydearm 发表于 2008-1-25 10:10 | 显示全部楼层

完全同意"我是火光"!

是啊!关于8019资料确实不太详细!我看周公的&lt&lt基础教程&gt&gt和实验教程(一),好多地方也是写得很简略(仅仅是翻译一下).买了EASYARM2200的板子作实验,只要按步骤:添加工程--&gt编译--&gtLOAD--&gtRUN,就可以完成实验!实验原理的介绍和实验源程序的注释很简略.常常感觉到:作完了实验但还不知道其所以然!就向在玩傻瓜相机!我现在在作UDP和TCP的实验,实验教程(一)上的介绍太简单了!况且周公还说&quot;这些程序只是剪裁版,错误在所难免!完整版是要收费的!&quot;所以要搞清楚实验源程序实在太伤神了!我想要是各位民间大侠把自己对ZLG/IP程序的理解和看法拿出来讨论一下,或许能完善现在的版本(剪裁版),让使用ZLG/IP的人少走一些弯路!^_^
wlq_9 发表于 2008-1-25 11:29 | 显示全部楼层

现在

的ISA接口的以太网芯片,RTL8019已经比较悬乎了.现在大家主要用的还是CS8900,DM9000.8019因为供货的问题,已经不在采购之列.<br />ZLG/IP本身只是个demo,如果真要打算学习tcp/ip的话,还是建议学习lwip或者ucTCP/IP,看完这三个东西以后,你就会发现差距不是一点点.ne2000的驱动都是差不多的,学习就是为了应用,因此建议你们上www.micrium.com下载cs8900和dm9000的驱动作为参考.<br />你会发现........不同.ucTCP/IP个人学习是免费的,但是商业应用收费的,注意.<br />
我是火光 发表于 2008-1-25 13:50 | 显示全部楼层

难度不在TCP/IP

<br />&nbsp;&nbsp;&nbsp;难度不在TCP/IP协议栈,而是在RTL8019AS的状态控制寄存器的资料,,,主要就是那几个:&nbsp;CR、ISR、DCR、RCR、TCR、RSR、TSR...<br />&nbsp;&nbsp;&nbsp;这上面的寄存器中有若干位的含义很不清楚.<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;RTL8019AS的驱动是不少,但我看到似乎全部是查询方式的,中断方式的没有...<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;归根到底,是缺乏准确的RTL8019资料,否则中断方式的驱动也是轻松的很的...<br />&nbsp;&nbsp;&nbsp;没有资料,那是没有办法的
wlq_9 发表于 2008-1-25 16:54 | 显示全部楼层

结论

楼上的高人矣!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

9

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部