您的位置:首页单片机51单片机
内容搜索:
阅读内容
背景:#EDF0F5 #FAFBE6 #FFF2E2 #FDE6E0 #F3FFE1 #DAFAF3 #EAEAEF 默认  

51单片机RTL8019AS网卡驱动程序

[日期:2008-02-26 ] [来源:net 作者:佚名] [字体: (投递新闻)
reg0a=length&0xFF; //read count low;
reg00=0x12; //write dma, page0

for(ii=4;ii<length 4;ii )
reg10=txdnet->bytes.bytebuf[ii];

for(i=0;i<6;i ){ //最多重发6次
for(ii=0;ii<1000;ii ) //检查txp为是否为低
if((reg00&0x04)==0) break;

if((reg04&0x01)!=0) break; //表示发送成功

reg00=0x3E;
}

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

reg06=length>>8; //high byte counter
reg05=length&0xFF; //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;i<18;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(bnry<0x4C) 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.length&0xFF; //read count low;
reg00=0x0A; //read dma
for(ii=4;ii<rxdnet->etherframe.length 4;ii )
rxdnet->bytes.bytebuf[ii]=reg10;
}
bnry=rxdnet->bytes.bytebuf[1]-1;//next page start-1

if(bnry<0x4C) bnry=0x7F;
reg03=bnry; //write to bnry
return 1; //have new packet
}
}
return 0;
}

参考文献:
单片机与嵌入式系统应用》2001(7-12)合订本第228页《以太网控制器的嵌入式设备网络互连》湖南师范大学 万静华 丁亚军
RTL8019AS数据手册

上一页1234  GO
阅读:
录入:JETTA

推荐 】 【 打印
本文评论
      全部评论
发表评论


点评: 字数
姓名:
站长推荐