📄 nicinterrupt.c
字号:
/*******************************************************************
以太网芯片中断处理函数
函数原型:
NICInterrupt ();
功能:
处理以太网芯片的中断。
参数:
无。
返回值:
无。
********************************************************************/
void interrupt NICInterrupt(void)
{
disable();
outportb(IMR,0);
unsigned char InterruptStatus=inportb(ISR);
if(InterruptStatus&0x01) //Receive ok
{
nReceiveSize=ReceiveFrame((unsigned *)szpReceiveData);
nCounter++;
}
outportb(IMR,0x1b); //Set IMR register ,packet_receive interrupt enable
outportb(0x20,0x20);
outportb(0xa0,0x20);
enable();
}
/*******************************************************************
接收数据处理函数
函数原型:
ReceiveFrame();
功能:
接收以太网数据包。
参数:
接收缓冲区指针。
返回值:
数据包中数据长度。
********************************************************************/
unsigned ReceiveFrame(unsigned *npReceiveBuf)
{
unsigned i,nTmp,nPacketSize,nPacketWord;
unsigned char ReceiveStatus,CurrPoint,ReceiveFlag=1,Isr,Overflow=0;
BufHead TBufHead;
do {
Isr=inportb(ISR);
outportb(ISR,0x05);
if(!Overflow)
{
if(Isr&0x10)
{
//NIC reset for recive-buffer overflow
outportb(CR,0x21);
outportb(RBCR0,0); //Set Remote DMA byte counter
outportb(RBCR1,0);
while(!(inportb(ISR)&0x80))
;
outportb(TCR,0x02);
outportb(CR,0x22);
Overflow=1;
}
}
outportb(RSAR0,0); //Set Remote DMA start address
outportb(RSAR1,NextPacket);
outportb(RBCR0,0); //Set Remote DMA byte counter
outportb(RBCR1,6);
outportb(CR,0x0a); //Remote DMA read
nTmp=inport(DATAIO);
nPacketSize=inport(DATAIO)-4;
ReceiveStatus=(unsigned char)nTmp;
NextPacket=(unsigned char )(nTmp>>8);
nPacketWord=(nPacketSize+1)>>1;
for(i=0;i<nPacketWord;i++)
npReceiveBuf[i]=inpw(DATAIO);
outportb(RBCR0,0); //Set Remote DMA byte counter
outportb(RBCR1,0);
inport(DATAIO); //in order to end the remode DMA read
if(NextPacket-1<STARTADDRESS)
outportb(BNRY,STOPADDRESS-1);
else
outportb(BNRY,NextPacket-1);
outportb(CR,0x62);
CurrPoint=inportb(CURR);
outportb(CR,0x22);
Isr=inportb(ISR);
if(CurrPoint==NextPacket)
{
if(Overflow==1)
{
outportb(ISR,0x10);
outportb(TCR,0);
ReceiveFlag=0;
}
else
{
if(Isr&0x01)
ReceiveFlag=1;
else
ReceiveFlag=0;
}
}
}
while(ReceiveFlag);
return nPacketSize;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -