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

📄 interruptusb.c

📁 外挂硬盘和FLASH的MP3播放器解决方案
💻 C
字号:
#ifndef _USB_DEFINE
 #include "USB.c"
#endif

void InterruptUSB(void) interrupt 13
{
	register BYTE USBIntFlag,UEPIntFlag;

	USB_DISABLE_INT_USB;				//禁止USB中断

	USBIntFlag=USBINT&USBIEN;
	UEPIntFlag=UEPINT&UEPIEN;

//	printf("STAX:%02bx,CONX:%02bx,USB:%02bx,UEP:%02bx\n",UEPSTAX,UEPCONX,USBIntFlag,UEPIntFlag);
	if (USBIntFlag&USB_INT_EORINT)
	{
//		printf("EORINT \n");
		USBADDR = 0x80;				//enable function
		USBCON = 0x80;
//		USBIEN=0x39;				//开全局中断
		UEPIEN=0x07;
		CLEAR_BIT_4(USBINT);		//清中断标志
	}

	if (USBIntFlag&USB_INT_SPINT)		//挂起中断
	{
//		printf("SPINT \n");
		SET_BIT_6(USBCON);			//停USB时钟
		CLEAR_BIT_0(USBINT);		//清中断标志
	}

	if (USBIntFlag&USB_INT_WUPCPU)		//CPU唤醒中断
	{
//		printf("WUPCPU \n");
		CLEAR_BIT_6(USBCON);		//启动USB时钟
		CLEAR_BIT_0(USBINT);		//清SPINT中断标志
		CLEAR_BIT_5(USBINT);		//清WUPCPU中断标志
	}

	if (USBIntFlag&USB_INT_SOFINT)		//帧同步中断
	{
//		printf("SOFINT \n");
		CLEAR_BIT_3(USBINT);		//清中断标志
	}

	if (UEPIntFlag&USB_INT_EP0)						//EndPoint0 中断
	{
		UEPNUM=0x00;
//		printf("Endpoint 0 Interrupt UEPSTAX:%02bx\n",UEPSTAX);
		if (UEPSTAX&USB_INT_RXSETUP)			//setup packet
		{
//			printf("Receive Setup packet:%02bx",USBSetup->bRequest);
			USBEP0ReadPacket();
			CLEAR_BIT_2(UEPSTAX);				//清除RXSETUP
			if (USBSetup->bRequest<0x0d)		//处理请求
			{
				(*StandardRequest[USBSetup->bRequest])();
			}
			else
			{
//				printf("stall\n");
				USB_SEND_STALL_PACKET;
			}
			CLEAR_BIT_4(UEPCONX);				//清除NAKIN
		}
		if (UEPSTAX&USB_INT_RXOUTB0)
		{
//			printf(" RXOUTB0 ");
			USBEP0ReadPacket();
			CLEAR_BIT_1(UEPSTAX);
		}
		if (UEPSTAX&USB_INT_RXOUTB1)
		{
//			printf(" RXOUTB1 ");
			USBEP0ReadPacket();
			CLEAR_BIT_6(UEPSTAX);
		}
		if (UEPCONX&USB_INT_NAKOUT)
		{
//			printf(" NAKOUT ");
			CLEAR_BIT_5(UEPCONX);
		}
		if (UEPCONX&USB_INT_NAKIN)
		{
//			printf(" NAKIN ");
			CLEAR_BIT_4(UEPCONX);
		}
		if (UEPSTAX&USB_INT_STLCRC)
		{
//			printf(" STALCRC%02bx",UEPSTAX);
//			CLEAR_BIT_5(UEPSTAX);
			CLEAR_BIT_3(UEPSTAX);
		}
		if (UEPSTAX&USB_INT_TXCMP)
		{
//			printf(" TXCMP ");
			CLEAR_BIT_0(UEPSTAX);
		}
		EP0INT=0;
	}

	if (UEPIntFlag&USB_INT_EP1)						//端点1
	{
//		printf("Endpoint 1 Interrupt\n");
		UEPNUM=0x01;
		if (UEPSTAX&USB_INT_RXOUTB0)
		{
//			printf(" RXOUTB0 ");
			USBEP1ReadPacket();
			CLEAR_BIT_1(UEPSTAX);
			SCSICBWProcess();
		}
		if (UEPSTAX&USB_INT_RXOUTB1)
		{
//			printf(" RXOUTB1 ");
			USBEP1ReadPacket();
			CLEAR_BIT_6(UEPSTAX);
			SCSICBWProcess();
		}
		if (UEPCONX&USB_INT_NAKOUT)
		{
//			printf(" NAKOUT ");
			CLEAR_BIT_5(UEPCONX);
		}
		if (UEPCONX&USB_INT_NAKIN)
		{
//			printf(" NAKIN ");
			CLEAR_BIT_4(UEPCONX);
		}
		if (UEPSTAX&USB_INT_STLCRC)
		{
//			printf(" STALCRC%02bx",UEPSTAX);
//			CLEAR_BIT_5(UEPSTAX);
			CLEAR_BIT_3(UEPSTAX);
		}
		if (UEPSTAX&USB_INT_TXCMP)
		{
//			printf(" TXCMP ");
			CLEAR_BIT_0(UEPSTAX);
		}
	}

	if (UEPIntFlag&USB_INT_EP2)
	{
//		printf("Endpoint 2 Interrupt\n");
		UEPNUM=0x02;
		if (UEPSTAX&USB_INT_RXOUTB0)
		{
//			printf(" RXOUTB0 ");
			USBEP1ReadPacket();
			CLEAR_BIT_1(UEPSTAX);
		}
		if (UEPSTAX&USB_INT_RXOUTB1)
		{
//			printf(" RXOUTB1 ");
			USBEP1ReadPacket();
			CLEAR_BIT_6(UEPSTAX);
		}
		if (UEPCONX&USB_INT_NAKOUT)
		{
//			printf(" NAKOUT ");
			CLEAR_BIT_5(UEPCONX);
		}
		if (UEPCONX&USB_INT_NAKIN)
		{
//			printf(" NAKIN ");
			CLEAR_BIT_4(UEPCONX);
		}
		if (UEPSTAX&USB_INT_STLCRC)
		{
//			printf(" STALCRC%02bx",UEPSTAX);
//			CLEAR_BIT_5(UEPSTAX);
			CLEAR_BIT_3(UEPSTAX);
		}
		if (UEPSTAX&USB_INT_TXCMP)
		{
//			printf(" TXCMP ");
			CLEAR_BIT_0(UEPSTAX);
		}
		EP2INT=0;
	}

	USB_ENABLE_INT_USB;				//启动USB中断
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -