呵呵,不是我懒。我看过上面的文章,根据内容整理出了程序,但是不知道对不对。手里又没有相应硬件,想看看他的程序是怎么写的。我把程序贴在这里,哪位大哥知道的话指点一二。
另外我还有个问题:
1.文中说以太网传输的物理帧中我们只用注意DA,SA,TYPE,DATA四个的内容,我的程序中写入网卡的数据放在bufferwrite[1536]中,我在写数据的时候要不要把前面8个字节空出来留给网卡自动生成的PR,SD位?即我要把目的地址DA写入bufferwrite[0]还是bufferwrite[8]?
2.我要完成的任务是保证单片机和网卡之间要能顺利的传输数据,那么我得物理帧中的TYPE是否无论写入什么数据都没关系?
下面是程序:
#include <reg51.h>
#include <stdio.h>
#include <absacc.h>
#define reg00 XBYTE[0xc000]
#define reg01 XBYTE[0xc100]
#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]
#define uint unsigned int
#define uchar unsigned char
#define recount 256
#define wrcount 256
void netcardreset(void);
void delaymsecond(void);
void page(uchar pagenumber);
void ne2000init(void);
void readmynodeid(void);
void writemynodeid(void);
void write_dma(unsigned int wraddress,unsigned int count);
void read_dma(unsigned int readdress,unsigned int count);
uint flag;
union u{
uint word;
struct{
uchar high;
uchar low;
}bytes;
};
union u mynodeid[3]; //存储网卡的物理地址
xdata unsigned char bufferread[1536]; //读网卡得到的数据,放在外部ram.
xdata unsigned char bufferwrite[1536]; //写入网卡缓冲区的数据,放在外部ram.
unsigned int readdress;
unsigned int wraddress;
sbit reset=P3^4;
void main()
{ unsigned int i;
readdress=0x4c00;
wraddress=0x4000;
delaymsecond();
netcardreset();
ne2000init();
readmynodeid();
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) //如果上位机发送数据给单片机
{
write_dma(wraddress,wrcount);//写网卡的ram:开始地址wraddress,一 次写wrcount字节
}
read_dma(readdress,recount); //读网卡ram:开始地址readdress,一次读recount字节
}
}
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;
}
}
发表时间:2003年5月23日10:51:48