#include <reg51r.h>
#include <intrins.h>
#include <absacc.h>
#define rg00 XBYTE[0xc000] /* I/O Base address 为300H,我只连接了P2.0-4 */
#define rg01 XBYTE[0xc100]
#define rg02 XBYTE[0xc200]
#define rg03 XBYTE[0xc300]
#define rg04 XBYTE[0xc400]
#define rg05 XBYTE[0xc500]
#define rg06 XBYTE[0xc600]
#define rg07 XBYTE[0xc700]
#define rg08 XBYTE[0xc800]
#define rg09 XBYTE[0xc900]
#define rg0a XBYTE[0xca00]
#define rg0b XBYTE[0xcb00]
#define rg0c XBYTE[0xcc00]
#define rg0d XBYTE[0xcd00]
#define rg0e XBYTE[0xce00]
#define rg0f XBYTE[0xcf00]
#define rg10 XBYTE[0xd000]
void LAN_init(void);
void page(uchar num);
void write_dma(uint addr,uint count);
sbit RSTDRV = P1^2;
uchar data CURR;
uchar data BNRY;
uchar idata bckbuf[64];
void main (void)
{
register uchar i;
uint temp;
wait_1mS(1000);
LAN_init();
temp=0x4000;
write_dma(temp,60); /* 我试过用read_dma(temp,60)读数据,OK! */
/* bckbuf[n]数据为一个ARP包:
0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0xe8,0xa3,0x62,0x61,0x08,0x06,0x00,0x01,
0x08,0x00,0x06,0x04,0x00,0x01,0x00,0x00,0xe8,0xa3,0x62,0x61,0xca,0x26,0xcf,0x9e,
0x00,0x00,0x00,0x00,0x00,0x00,0xca,0x26,0xcf,0x58,...后面补18个0x00 */
page(0);
rg05=0x3c; /* TBCR0 为低位 */
rg06=0x00; /* TBCR1 为高位 */
rg00=0x1e; /* 开始发送数据 */
while(1) {
wait_1mS(100);
page(0);
BNRY=rg03;
page(1);
CURR=rg07;
bckbuf[0]=BNRY;
bckbuf[1]=CURR;
sends(bckbuf,2); /* 把BNRY和CURR发送到串口显示,过了很久都还是50H和51H */
} /* sends程序可以保证没有问题 */
}
/************************************************************************/
void write_dma(uint addr,uint count)
{
register uint i;
page(0);
rg09=addr>>8; /* addr high */
rg08=addr&0x00ff; /* addr low */
rg0b=count>>8; /* write count high */
rg0a=count&0x00ff; /* write count low */
rg00=0x12; /* dma write */
for(i=0;i<count;i++) rg10=bckbuf[i];
rg0a=0;
rg0b=0;
rg00=0x22;
}
/*******************************************************************/
void page(uchar num)
{
uchar tp;
tp=rg00&0x3b;
num=num<<6;
tp=tp|num;
rg00=tp;
}
/*****************************************************************/
void LAN_init(void)
{
RSTDRV=1; /* Hardware Reset Ethernet Controler */
wait_1mS(2);
RSTDRV=0; /* Reset Finish */
wait_1mS(2);
rg00=0x21; /* CR= PS1 PS0 RD2 RD1 RD0 TXP STA STP =0010 0001 */
rg01=0x50; /* PSTART */
rg02=0x80; /* PSTOP */
rg03=0x50; /* BNRY */
rg04=0x40; /* TPSR */
rg0c=0xcc; /* RCR= - - MON PRO AM AB AR SEP =1100 1100 */
rg0d=0xe0; /* TCR= - - - OFST ATD LB1 LB0 CRC =1110 0000 */
rg0e=0xc8; /* DCR= - FT1 FT0 ARM LS LAS BOS WAS =1100 1000 */
rg0f=0x00; /* IMR */
page(1);
rg01=s_mac[0]; /* PAR0(Physical Address Register0) */
rg02=s_mac[1]; /* PAR1 */
rg03=s_mac[2]; /* PAR2 */
rg04=s_mac[3]; /* PAR3 */
rg05=s_mac[4]; /* PAR4 */
rg06=s_mac[5]; /* PAR5 */
rg07=0x51; /* CURR */
rg08=0x00; /* MAR0 */
rg09=0x00; /* MAR1 */
rg0a=0x00; /* MAR2 */
rg0b=0x00; /* MAR3 */
rg0c=0x00; /* MAR4 */
rg0d=0x00; /* MAR5 */
rg0e=0x00; /* MAR6 */
rg0f=0x00; /* MAR7 */
}