周立功的tcp/ip代码里的hardware.c里rec_packet函数里有这么一段 <br /> if(bnry!=curr) //此时表示有新的数据包在缓冲区里<br /> { //在任何操作都最好返回page0<br /> if(REC_BUFF_NUM==MAX_REC_BUFF)//接收缓冲区号清零<br /> {<br /> REC_BUFF_NUM=0;<br /> }<br /> REC_BUFF_PTR_WORDS=REC_BUFF[REC_BUFF_NUM].words;//设定接收缓冲区的起始地址<br /> //=======================================<br /> <br /> WriteToNet(0x09,bnry); //RSAR1写入读页地址的高字节<br /> WriteToNet(0x08,0x00); //RSAR0写入读页地址的低字节<br /> <font color=#FF0000>WriteToNet(0x0b,0x00); //RSCR1写入读取字节计数高字节<br /> WriteToNet(0x0a,18); //RSCR0写入读取字节计数高字节 <br /></font> WriteToNet(0x00,0x0a); //启动Remote DMA读操作<br /> //读取一包的前4个字节:4字节的8019头部<br /> for(i=0;i<2;i++)<br /> {<br /> *REC_BUFF_PTR_WORDS=ReadFromNet(0x10);<br /> tmp=*REC_BUFF_PTR_WORDS;<br /> REC_BUFF_PTR_WORDS++;<br /> }<br /> //0:接收状态;1:下一包的指针;2:本包低位;3:本包高位;<br /> //=======================================中止DMA操作<br /> WriteToNet(0x0b,0x00); //RSCR1写入读取字节计数高字节<br /> WriteToNet(0x0a,0x00); //RSCR0写入读取字节计数高字节<br /> WriteToNet(0x00,0x22); //结束或放弃DMA操作<br /> //=======================================<br /> tmp[1]=tmp[1]-4;//去掉4个字节的CRC<br /> REC_BUFF[REC_BUFF_NUM].words[1]=tmp[1]; //把真正的接收的帧的长度保存到缓冲区<br /> //=====================以上各步操作表示读入的数据包有效<br /> //0:接收状态;1:下一包的指针;2:本包高位;3:本包低位;<br /> if(((tmp[0]&0x0001)==0)||((tmp[0]&0xff00)>0x7f00)<br /> ||((tmp[0]&0xff00)<0x4c00)||(tmp[1]>0x0600))<br /> {//接收状态错误或下一数据包的起始页地址错误或接收的数据包长度>1536字节<br /> page(1);<br /> curr=ReadFromNet(0X07); //page1读取CURR的值<br /> page(0); //切换回page0<br /> bnry = curr -1; //把bnry恢复为下16K中的空余部分<br /> if(bnry < 0x4c) <br /> {<br /> bnry =0x7f;<br /> }<br /> WriteToNet(0x03,bnry); //把BNRY恢复到指向下一帧write to bnry <br /> WriteToNet(0x07,0xff); //清除中断标志<br /> //goto rea1;<br /> OS_EXIT_CRITICAL();<br /> return(0);<br /><br /><font color=#FF0000>WriteToNet(0x0b,0x00); //RSCR1写入读取字节计数高字节<br />WriteToNet(0x0a,18); //RSCR0写入读取字节计数高字节</font><br /><font color=#FF0000></font>这两句话是读取此帧的前18个字节?<br /><br />那个tmp接受到的是什么数据?是以太帧的前两个字节吗?tmp[1]=tmp[1]-4;为什么是去掉4个字节的CRC?难道tmp[0]和tmp[1]包括了整个数据帧的全部? |
|