#define uint unsigned int
#define uchar unsigned char
typedef union{
struct
{
uchar b0:1;
uchar b1:1;
uchar b2:1;
uchar b3:1;
uchar b4:1;
uchar b5:1;
uchar b6:1;
uchar b7:1;
}bit;
uchar all;
}reg_8019;
#define reg *(char *)(0x30000H) //因为片选是cs0,与本人所用单片机有关
/************************************************************
remote dma write
&transmit packet
数据包传送方向:单片机M16c-网卡8019-以太网
************************************************************/
void driver send()
{
uchar cr;
page(0);
cr=*reg //commmand register
if(cr==0x26h) //判断网上是否有数据包发送
queueit(); //若有,则先排队等待
else //若没有,则远程写
write_dma(0x4000,COUNT); //remote dma write
*(reg+5)=count&0xff;
*(reg+6)=count>>8; //local dma-transmit byte count
*(reg+4)=0x40; //tpsr,每次发送数据包都需重新设置此寄存器
*reg=0x26; //program NIC to transmit packet
}
void queueit()
{
reg_8019 cr;
page(0);
cr.all=*reg; //command register
while(cr.bit.b2==1); //wait until the txp bit equal 0
}
void write_dma(uint address,uint count) //address为要写入到网卡里的ram的起始地
址
//count为要连续写入的字节数
{
uint i;
reg_8019 isr;
isr.all=*(reg+7) //interrupt status register
uint buffer[768]; //最大数据包1514字节+4字节的校验码
page(0);
*(reg+9)=address>>8; //remote address high
*(reg+8)=address&0xff; //remote address low
*(reg+11)=count>>8; //remote write count high
*(reg+10)=count&0xff; //remote write count low
*reg=0x12 ; //remote dma write and start
i=0;
while(isr.bit.b6==1) //wait for the completion of the remote dma write
{
*(reg+16)=buffer[i]; //(reg+16)是DMA端口地址(data transfer i/o
port)
}
isr.bit.b6=1;
*(reg+11)=0; // count high 中止DMA操作
*(reg+10)=0; // count low
*reg=0x22; //abort/complete dma page 0
}