void netcardreset(void)
{
uint data i;
uchar data temp;
reset=1;
for(i=0;i <250;i++);
temp=reg1f;
reg1f=temp;
for(i=0;i <250;i++);
}
void delaymsecond(void)
{ unsigned int i;
for(i=0;i <10000;i++);
}
void page(uchar pagenumber)
{
uchar data temp;
temp=reg00;
temp=temp&0x3B;
pagenumber=pagenumber < <6;
temp=temp|pagenumber;
reg00=temp;
}
void ne2000init(void)
{
reg00=0x21;
reg01=0x4c;
reg02=0x80;
reg03=0x4c;
reg04=0x40;
reg0c=0xcc;
reg0d=0xe0;
reg0e=0xc8;
reg0f=0x00;
reg00=0x12;
page(1);
reg07=0x4d;
reg08=0x00;
reg09=0x41;
reg0a=0x00;
reg0b=0x80;
reg0c=0x00;
reg0d=0x00;
reg0e=0x00;
reg0f=0x00;
reg00=0x52;
reg00=0x22;
}
void readmynodeid(void)
{
union u protocal;
uchar data i,temp;
page(0);
reg09=0;
reg08=0;
reg0b=0;
reg0a=12;
reg00=0x0a;
for(i=0;i <6;i++)
{
temp=reg10;
if(i%2==0)
{
protocal.bytes.high=temp;
}
else
{
protocal.bytes.low=temp;
mynodeid[i/2].word=protocal.word;
}
temp=reg10;
}
}
void writemynodeid(void)
{
page(1);
reg01=mynodeid[0].bytes.high;
reg02=mynodeid[0].bytes.low;
reg03=mynodeid[1].bytes.high;
reg04=mynodeid[1].bytes.low;
reg05=mynodeid[2].bytes.high;
reg06=mynodeid[2].bytes.low;
}
//使用0x40-0x4B为网卡的发送缓冲区,共12页,向网卡dma中以wraddress开始的地址区写入count个字节的数据,并让网卡将其发送出去
void write_dma(unsigned int wraddress,unsigned int count)
{
unsigned int i;
if(wraddress> =0x4c00)
{
wraddress=wraddress-0x4c00;
}
reg09=wraddress> > 8;
reg08=wraddress&0xff;
reg0b=count> > 8;
reg0a=count&0xff;
reg00=0x12 ;
for(i=0;i <count;i++)
{
reg10=bufferwrite[i];
}
reg00=0x1e;
wraddress=wraddress+count;
flag=0;
reg0b=0;
reg0a=0;
reg00=0x22;
}
//从网卡dma以readdress开头的地址区读出count个字节,放到单片机片外存储空间 bufferread[]中。
void read_dma(unsigned int readdress,unsigned int count)
{
unsigned int i,n;
uchar data curr,bnry,pstop;
reg00=0x0a;
bnry=reg03+1;
reg00=0x4a;
curr=reg07;
if(curr!=bnry)
{
if(readdress> =0x8000)
{
readdress=readdress-0x8000;
}
reg09=readdress> > 8;
reg08=readdress&0xff;
reg0b=count> > 8;
reg0a=count&0xff;
reg00=0x0a ;
for(i=0;i <count;i++)
{
bufferread[i]=reg10;
}
pstop=reg02;
n=count/256; //计算读出的数据有多少个页
bnry=reg03+n; //将bnry的值加n,保证下一次的读出
reg03=bnry;
reg00=0x12;
if(bnry> =pstop)
{
reg03=0x4c;
reg00=0x12;
}
readdress=readdress+count;
reg0b=0;
reg0a=0;
reg00=0x22;
}
}