#define reg00 XBYTE[0x8000] //reg00- 10为网卡芯片接口的寄存器地址300-310;
#define reg01 XBYTE[0x8100]
#define reg02 XBYTE[0x8200]
#define reg03 XBYTE[0x8300]
#define reg04 XBYTE[0x8400]
#define reg05 XBYTE[0x8500]
#define reg06 XBYTE[0x8600]
#define reg07 XBYTE[0x8700]
#define reg08 XBYTE[0x8800]
#define reg09 XBYTE[0x8900]
#define reg0a XBYTE[0x8a00]
#define reg0b XBYTE[0x8b00]
#define reg0c XBYTE[0x8c00]
#define reg0d XBYTE[0x8d00]
#define reg0e XBYTE[0x8e00]
#define reg0f XBYTE[0x8f00]
#define reg10 XBYTE[0x9000]
#define reg1f XBYTE[0x9f00] //网卡的复位端口的地址,对应于网卡的地址31FH。
#define uint unsigned int //uint 代表unsigned int
#define uchar unsigned char //uchar 代表unsignedchar
sbit reset=P3^5; //单片机的p3.5脚连接到网卡的RSTDRV复位引脚
void NetCardReset();
void NetCardInit();
void page(uchar pagenumber);
void query_8019(void);
union u {uint word; struct{uchar high; uchar low;}bytes;};
union u mynodeid[3];//存储网卡的物理地址
//////////////////////////////////////////
void main(void)
{
unsigned int i = 0;
SCON = 0x50; //串口方式1,允许接收
TMOD = 0x20; //定时器1 定时方式2
TCON = 0x41; //设定时器1 开始计数
TH1 = 0xE6; //12MHz 1200 波特率
TL1 = 0xE6;
TI = 1;
TR1 = 1; //启动定时器
printf ("Hello World!\n"); //显示Hello World
for(i = 0; i < 30000; i++)
;
mynodeid[0].bytes.high = 0x00;
mynodeid[0].bytes.low = 0xC0;
mynodeid[1].bytes.high = 0x26;
mynodeid[1].bytes.low = 0x78;
mynodeid[2].bytes.high = 0xA1;
mynodeid[2].bytes.low = 0x80;
NetCardReset();
NetCardInit();
while(1)
{
query_8019();
}
}
void NetCardReset()
{
uint data i;
uchar data temp;
reset = 1;
for(i = 0; i < 250; i++)
;
reset = 0;
for(i = 0; i < 250; i++)
;
temp = reg1f;
reg1f = temp;
for(i = 0; i < 1500; i++)
;
}
void NetCardInit()
{
reg00 = 0x21;//
reg01 = 0x4c;//
reg02 = 0x80;//
reg03 = 0x4c;//
reg04 = 0x40;//
reg07 = 0xff;
reg0c = 0xcc;//
reg0d = 0xe0;//
reg0f = 0x03;//
page(1);
reg07 = 0x4d;//
reg08 = 0xff;//
reg09 = 0xff;//
reg0a = 0xff;//
reg0b = 0xff;//
reg0c = 0xff;//
reg0d = 0xff;//
reg0e = 0xff;//
reg0f = 0xff;//
reg01=mynodeid[0].bytes.high; //PAR0
reg02=mynodeid[0].bytes.low; //PAR1
reg03=mynodeid[1].bytes.high; //PAR2
reg04=mynodeid[1].bytes.low; //PAR3
reg05=mynodeid[2].bytes.high; //PAR4
reg06=mynodeid[2].bytes.low; //PAR5
reg00 = 0x22;//
}
void page(uchar pagenumber)
{
uchar temp;
temp=reg00;
temp=temp&0x3B ;//高两位清零
pagenumber=pagenumber < <6;
temp=temp | pagenumber;
reg00=temp;
}
void query_8019(void)
{
uint bnry,curr;
page(0);
bnry=reg03; //bnry page have read 读页指针
page(1);
curr=reg07; //curr writepoint 8019写页指针
page(0);
if ((curr==0))
return;
bnry= bnry + 1;
if (bnry> 0x7f)
bnry=0x4c;
if (bnry!=curr) //此时表示有新的数据包在缓冲区里
{
printf("recvData!,bnry = %x,curr = %x\n",bnry, curr);
}
else
printf("recvNOData!\n");
page(0);
reg0b=0x00;
reg0a=0x00;
reg00=0x22;//complete dma page 0
}
在串口打印出来的总是: recvData!,bnry = 4C,curr = 4D呀,通过网线接到一hub上,在pc上随便ping一IP串口上打印的也是: recvData!,bnry = 4C,curr = 4D呀?为什么收不到数据呢?!!!