⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nicinterrupt.c

📁 单片机以太网驱动程序
💻 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 + -