打印

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

[复制链接]
1751|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhlyp|  楼主 | 2007-4-12 12:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
周立功的tcp/ip代码里的hardware.c里rec_packet函数里有这么一段     
   if(bnry!=curr)    //此时表示有新的数据包在缓冲区里
       {            //在任何操作都最好返回page0
        if(REC_BUFF_NUM==MAX_REC_BUFF)//接收缓冲区号清零
        {
            REC_BUFF_NUM=0;
        }
        REC_BUFF_PTR_WORDS=REC_BUFF[REC_BUFF_NUM].words;//设定接收缓冲区的起始地址
        //=======================================
        
        WriteToNet(0x09,bnry);    //RSAR1写入读页地址的高字节
        WriteToNet(0x08,0x00); //RSAR0写入读页地址的低字节
        WriteToNet(0x0b,0x00);    //RSCR1写入读取字节计数高字节
        WriteToNet(0x0a,18);   //RSCR0写入读取字节计数高字节          
        WriteToNet(0x00,0x0a); //启动Remote DMA读操作
        //读取一包的前4个字节:4字节的8019头部
        for(i=0;i<2;i++)
        {
            *REC_BUFF_PTR_WORDS=ReadFromNet(0x10);
            tmp=*REC_BUFF_PTR_WORDS;
            REC_BUFF_PTR_WORDS++;
        }
        //0:接收状态;1:下一包的指针;2:本包低位;3:本包高位;
        //=======================================中止DMA操作
        WriteToNet(0x0b,0x00);    //RSCR1写入读取字节计数高字节
        WriteToNet(0x0a,0x00);    //RSCR0写入读取字节计数高字节
        WriteToNet(0x00,0x22);    //结束或放弃DMA操作
        //=======================================
        tmp[1]=tmp[1]-4;//去掉4个字节的CRC
        REC_BUFF[REC_BUFF_NUM].words[1]=tmp[1];    //把真正的接收的帧的长度保存到缓冲区
        //=====================以上各步操作表示读入的数据包有效
        //0:接收状态;1:下一包的指针;2:本包高位;3:本包低位;
        if(((tmp[0]&0x0001)==0)||((tmp[0]&0xff00)>0x7f00)
            ||((tmp[0]&0xff00)<0x4c00)||(tmp[1]>0x0600))
        {//接收状态错误或下一数据包的起始页地址错误或接收的数据包长度>1536字节
            page(1);
            curr=ReadFromNet(0X07);     //page1读取CURR的值
            page(0);        //切换回page0
            bnry = curr -1;    //把bnry恢复为下16K中的空余部分
            if(bnry < 0x4c) 
            {
                bnry =0x7f;
            }
            WriteToNet(0x03,bnry);     //把BNRY恢复到指向下一帧write to bnry        
            WriteToNet(0x07,0xff);        //清除中断标志
            //goto rea1;
            OS_EXIT_CRITICAL();
            return(0);

WriteToNet(0x0b,0x00);    //RSCR1写入读取字节计数高字节
WriteToNet(0x0a,18);   //RSCR0写入读取字节计数高字节

这两句话是读取此帧的前18个字节?

那个tmp接受到的是什么数据?是以太帧的前两个字节吗?tmp[1]=tmp[1]-4;为什么是去掉4个字节的CRC?难道tmp[0]和tmp[1]包括了整个数据帧的全部? 

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

29

主题

93

帖子

0

粉丝