关于以太网驱动的一点疑问,请高手解答

[复制链接]
2232|0
 楼主| zhlyp 发表于 2007-4-12 12:45 | 显示全部楼层 |阅读模式
周立功的tcp/ip代码里的hardware.c里rec_packet函数里有这么一段&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&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;<font color=#FF0000>WriteToNet(0x0b,0x00);&nbsp;&nbsp;&nbsp;&nbsp;//RSCR1写入读取字节计数高字节<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WriteToNet(0x0a,18);&nbsp;&nbsp;&nbsp;//RSCR0写入读取字节计数高字节&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /></font>&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 />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//0:接收状态;1:下一包的指针;2:本包低位;3:本包高位;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//=======================================中止DMA操作<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,0x00);&nbsp;&nbsp;&nbsp;&nbsp;//RSCR0写入读取字节计数高字节<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WriteToNet(0x00,0x22);&nbsp;&nbsp;&nbsp;&nbsp;//结束或放弃DMA操作<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//=======================================<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp[1]=tmp[1]-4;//去掉4个字节的CRC<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;REC_BUFF[REC_BUFF_NUM].words[1]=tmp[1];&nbsp;&nbsp;&nbsp;&nbsp;//把真正的接收的帧的长度保存到缓冲区<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//=====================以上各步操作表示读入的数据包有效<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//0:接收状态;1:下一包的指针;2:本包高位;3:本包低位;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(((tmp[0]&0x0001)==0)||((tmp[0]&0xff00)&gt0x7f00)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;||((tmp[0]&0xff00)&lt0x4c00)||(tmp[1]&gt0x0600))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{//接收状态错误或下一数据包的起始页地址错误或接收的数据包长度&gt1536字节<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;page(1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curr=ReadFromNet(0X07);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//page1读取CURR的值<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;page(0);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//切换回page0<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bnry&nbsp;=&nbsp;curr&nbsp;-1;&nbsp;&nbsp;&nbsp;&nbsp;//把bnry恢复为下16K中的空余部分<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(bnry&nbsp;&lt&nbsp;0x4c)&nbsp;<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;bnry&nbsp;=0x7f;<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(0x03,bnry);&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,0xff);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//清除中断标志<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//goto&nbsp;rea1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OS_EXIT_CRITICAL();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return(0);<br /><br /><font color=#FF0000>WriteToNet(0x0b,0x00);&nbsp;&nbsp;&nbsp;&nbsp;//RSCR1写入读取字节计数高字节<br />WriteToNet(0x0a,18);&nbsp;&nbsp;&nbsp;//RSCR0写入读取字节计数高字节</font><br /><font color=#FF0000></font>这两句话是读取此帧的前18个字节?<br /><br />那个tmp接受到的是什么数据?是以太帧的前两个字节吗?tmp[1]=tmp[1]-4;为什么是去掉4个字节的CRC?难道tmp[0]和tmp[1]包括了整个数据帧的全部?&nbsp;
您需要登录后才可以回帖 登录 | 注册

本版积分规则

29

主题

93

帖子

0

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