#define reg00 XBYTE[0xc000] //对应于地址240H 为命令寄存器CR地址
#define reg01 XBYTE[0xc100] //241H.
#define reg02 XBYTE[0xc200]
#define reg03 XBYTE[0xc300]
#define reg04 XBYTE[0xc400]
#define reg05 XBYTE[0xc500]
#define reg06 XBYTE[0xc600]
#define reg07 XBYTE[0xc700]
#define reg08 XBYTE[0xc800]
#define reg09 XBYTE[0xc900]
#define reg0a XBYTE[0xca00]
#define reg0b XBYTE[0xcb00]
#define reg0c XBYTE[0xcc00]
#define reg0d XBYTE[0xcd00]
#define reg0e XBYTE[0xce00]
#define reg0f XBYTE[0xcf00]
#define reg10 XBYTE[0xd000]
#define reg11 XBYTE[0xd100]
#define reg12 XBYTE[0xd200]
#define reg13 XBYTE[0xd300]
#define reg14 XBYTE[0xd400]
#define reg15 XBYTE[0xd500]
#define reg16 XBYTE[0xd600]
#define reg17 XBYTE[0xd700]
#define reg18 XBYTE[0xd800]
#define reg19 XBYTE[0xd900]
#define reg1a XBYTE[0xda00]
#define reg1b XBYTE[0xdb00]
#define reg1c XBYTE[0xdc00]
#define reg1d XBYTE[0xdd00]
#define reg1e XBYTE[0xde00]
#define reg1f XBYTE[0xdf00] //25FH.
#define uint unsigned int
#define uchar unsigned char
#define recount 256
#define wrcount 256
#define INBUF_LEN 1 //数据长度
void netcardreset(void); //网卡芯片复位函数
void delaymsecond(void); //延迟函数
void page(uchar pagenumber); //
void ne2000init(void); //网卡芯片初始化函数
//void readmynodeid(void); //读取网卡物理地址函数
void writemynodeid(void); //设置网卡物理地址函数
void write_dma(unsigned int count); //写网卡芯片Ram函数
void read_dma(unsigned int readdress,unsigned int count); //读网卡芯片Ram函数
//void init_serialcomm(void);
//void serial ();
uint flag=1;
void main()
{ unsigned int i;
readdress=0x4c00;
wraddress=0x4000;
//P2=0x00;
//delaymsecond();
netcardreset();
ne2000init();
writemynodeid();
/* for(;;)
{
reg00=0x1e;
P1=0xff^reg00;
}*/
// init_serialcomm(); //初始化串口
/*for(i=0;i <6;i++)
{ if(i%2==0)
{
bufferwrite[14+i]=mynodeid[i/2].bytes.high;
}
else
bufferwrite[14+i]=mynodeid[i/2].bytes.low;
} */
//bufferwrite[20]=0x08;//
//bufferwrite[21]=0x00;//
//writemynodeid();
while(1)
{ if(flag==1) //如果上位机发送数据给单片机
{
flag=0;
write_dma(wrcount); //写网卡的ram:开始地址wraddress,一 次写wrcount字节
}
// read_dma(readdress,recount); //读网卡ram:开始地址readdress,一次读recount字节
}
}
void netcardreset(void)
{
uint data i;
uchar data temp;
reset=1;
P1=0x00; //使网卡的RSTDRV引脚变成高电平,网卡是高电平复位的。
//for(i=0;i <250;i++); //延时程序
reset=0; //使网卡的RSTDRV引脚变成低电平,网卡上电复位完毕
P1=0xff;
//for(i=0;i <250;i++);
temp=reg1f; //读网卡的复位端口
reg1f=temp; //写网卡的复位端口
//for(i=0;i <250;i++);
// reset=1;reset=0相当于冷复位,temp=reg1f;reg1f=temp相当于热复位
}
void page(uchar pagenumber)
{
uchar data temp;
temp=reg00; //读入命令寄存器CR的值。
temp=temp&0x3B; //将高2位,即PS1,PS0清0
pagenumber=pagenumber < <6; //将低2位移至高端
temp=temp|pagenumber; //写入高2位
reg00=temp; //设置第几页
}
void ne2000init(void)
{ P1=0xff^reg00;
reg00=0x21; //选择页0的寄存器,网卡停止运行,因为还没有初始化。
//==================================================//
P1=0xff^reg00;
// P1=0xff^reg01;
reg01=0x4c; //寄存器PSTART。 接收缓冲区的起始页的地址
// P1=0xff^reg01;
// P1=0xff^reg02;
reg02=0x80; //寄存器PSTOP。 接收缓冲区的结束页地址。(该页不用于接收)
// P1=0xff^reg02;
P1=0xff^reg03;
reg03=0x4c; //寄存器BNRY。 指向最后一个已经读取的页(读指针)
P1=0xff^reg03;
//=================================================//
// P1=0xff^reg04;
reg04=0x40; //TPSR 为发送页的起始页地址,初始化为指向第一个发送缓冲区的页.
// P1=0xff^reg04;
// P1=0xff^reg0c;
reg0c=0xcc; //RCR 接收配置寄存器,设置为使用接收缓冲区,仅接收自己的地址的数据包(以及广播地址数据包)和多点播送地址包,小于64字节的包丢弃(这是协议的规定,设置成接收是用于网络分析),校验错的数据包不接收。
// P1=0xff^reg0c;
// P1=0xff^reg0d;
reg0d=0xe0; //TCR 发送配置寄存器,启用crc自动生成和自动校验,工作在正常模式。
// P1=0xff^reg0d;
// P1=0xff^reg0e;
reg0e=0xc8; //DCR 数据配置寄存器,设置为使用FIFO缓存,普通模式,8位数据传输模式,字节顺序为高位字节在前,低位字节在后.
// P1=0xff^reg0e;
reg0f=0x00; //IMR 中断屏蔽寄存器,设置成0x00,屏蔽所有的中断,设置成0xff将允许中断.
P1=0xff^reg00;
reg00=0x12;
P1=0xff^reg00;
page(1); //选择页1的寄存器
P1=0xff^reg00;
P1=0xff^reg07;
reg07=0x4d; //CURR 网卡写内存的指针,它指向当前正在写的页的下一页。
P1=0xff^reg07;
//=================================================//
//设置多点播送的参数
reg08=0x00; //MAR0
P1=0xff^reg08;
reg09=0x41; //MAR1
P1=0xff^reg09;
reg0a=0x00; //MAR2
P1=0xff^reg0a;
reg0b=0x80; //MAR3
P1=0xff^reg0b;
reg0c=0x00; //MAR4
P1=0xff^reg0c;
reg0d=0x00; //MAR5
P1=0xff^reg0d;
reg0e=0x00; //MAR6
P1=0xff^reg0e;
reg0f=0x00; //MAR7
P1=0xff^reg0f;
P1=0xff^reg00;
reg00=0x52;
P1=0xff^reg00;
reg00=0x22; //选择页0寄存器,网卡执行命令.
P1=0xff^reg00;
}
//使用0x40-0x4B为网卡的发送缓冲区,共12页,向网卡dma中以wraddress开始的地址区写入count个字节的数据,并让网卡将其发送出去
void write_dma(unsigned int count)
{
unsigned int i;
count=1;
if(wraddress> =0x4c00)
{
wraddress=wraddress-0x0c00;
}
page(0);
reg09=wraddress> > 8;
reg08=wraddress&0xff;
reg0b=count> > 8;
reg0a=count&0xff;
reg00=0x12 ;
P1=0xff^reg00;
for(i=0;i <count;i++)
{
reg10=0x55;
}
reg00=0x1e;
P1=0xff^reg00;
wraddress=wraddress+count;
flag=1;
reg0b=0;
reg0a=0;
reg00=0x22;
//P1=0xff^reg00;
}
程序是一个死循环,我让8019不停的发数据,各位看看有什么问题,谢谢。