新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 基于51單片機RTL8019AS的網卡驅動程序

        基于51單片機RTL8019AS的網卡驅動程序

        作者: 時間:2012-01-20 來源:網絡 收藏

         }

        本文引用地址:http://www.104case.com/article/172229.htm

          if(txd_buffer_select) reg04=0x40; //txd packet start;

          else reg04=0x46; //txd packet start;

          reg06=length>>8; //high byte counter

          reg05=length0xFF; //low byte counter

          reg00=0x3E; //to sendpacket;

          }

          bit recv_packet(union netcard *rxdnet)//ne2000收包子程序

          {

          unsigned char i;

          unsigned int ii;

          unsigned char bnry,curr;

          page(0);

          reg07=0xFF;

          bnry=reg03; //bnry page have read 讀頁指針

          page(1);

          curr=reg07; //curr writepoint 8019寫頁指針

          page(0);

          if(curr==0)

          return 0; //讀的過程出錯

          bnry=bnry++;

          if(bnry>0x7F) bnry=0x4C;

          if(bnry!=curr){ //此時表示有新的數據包在緩沖區里

          //讀取一包的前18個字節:4字節的8019頭部,6字節目的地址,6字節原地址,2字節協議

          //在任何操作都最好返回page0

          page(0);

          reg09=bnry; //read page address high

          reg08=0x00; //read page address low

          reg0b=0x00; //read count high

          reg0a=18; //read count low;

          reg00=0x0A; //read dma

          for(i=0;i18;i++)

          rxdnet->bytes.bytebuf[i]=reg10;

          i=rxdnet->bytes.bytebuf[3]; //將長度字段的高低字節掉轉

          rxdnet->bytes.bytebuf[3]=rxdnet->bytes.bytebuf[2];

          rxdnet->bytes.bytebuf[2]=i;

          rxdnet->etherframe.length=rxdnet->etherframe.length-4; //去掉4個字節的CRC

          //表示讀入的數據包有效

          if(((rxdnet->bytes.bytebuf[0]0x01)==0)||(rxdnet->bytes.bytebuf[1]>0x7F)||(rxdnet->bytes.bytebuf[1]0x4C)||(rxdnet->bytes.bytebuf[2]>0x06)){

          //接收狀態錯誤,或者next_page_start錯誤或者長度錯誤,將丟棄所有數據包

          page(1);

          curr=reg07; //page1

          page(0); //切換回page0

          bnry=curr-1;

          if(bnry0x4C) bnry=0x7F;

          reg03=bnry; //write to bnry

          return 0;

          }

          else{//表示數據包是完好的.讀取剩下的數據

          if((rxdnet->etherframe.protocal==0x0800)||(rxdnet->etherframe.protocal==0x0806)){

          //協議為IP或ARP才接收

          reg09=bnry; //read page address high

          reg08=4; //read page address low

          reg0b=rxdnet->etherframe.length>>8; //read count high

          reg0a=rxdnet->etherframe.length0xFF; //read count low;

          reg00=0x0A; //read dma

          for(ii=4;iietherframe.length+4;ii++)

          rxdnet->bytes.bytebuf[ii]=reg10;

          }

          bnry=rxdnet->bytes.bytebuf[1]-1;//next page start-1

          if(bnry0x4C) bnry=0x7F;

          reg03=bnry; //write to bnry

          return 1; //have new packet

          }

          }

          return 0;

          }


        上一頁 1 2 3 4 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 乐亭县| 连江县| 台北县| 石景山区| 三河市| 巢湖市| 通榆县| 突泉县| 温宿县| 东方市| 泰兴市| 扎兰屯市| 宣威市| 孙吴县| 宜黄县| 广平县| 文昌市| 秦皇岛市| 会东县| 平乡县| 武宁县| 互助| 东乌珠穆沁旗| 美姑县| 栾城县| 公主岭市| 宜黄县| 甘泉县| 皮山县| 临潭县| 玉树县| 绥德县| 达孜县| 梧州市| 资源县| 梅州市| 兴和县| 淳化县| 武宁县| 拉萨市| 崇明县|