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

📄 copy of usb.h

📁 在51下的外挂硬盘和FLASH的MP3方案程序以及原理图
💻 H
📖 第 1 页 / 共 2 页
字号:
					+ sizeof(USBInterfaceDescriptor)
					+ sizeof(USBEndpoint1Descriptor)
					+ sizeof(USBEndpoint2Descriptor);
			else
				USBBuffer.OutLength=USBConfigurationDescriptor[0];
			break;
		case USB_GET_DESC_STRING		:
			switch (USBBuffer.In[2])
			{
				case 0x00		:
					USBBuffer.Out=USBString1Descriptor;
					USBBuffer.OutLength=sizeof(USBString1Descriptor);
					break;
				case 0x01		:
					USBBuffer.Out=USBString3Descriptor;
					USBBuffer.OutLength=sizeof(USBString3Descriptor);
					break;
				case 0x02		:
					USBBuffer.Out=USBString3Descriptor;
					USBBuffer.OutLength=sizeof(USBString3Descriptor);
					break;
				case 0x03		:
					USBBuffer.Out=USBString3Descriptor;
					USBBuffer.OutLength=sizeof(USBString3Descriptor);
					break;
			}
			break;
		case USB_GET_DESC_INTERFACE		:
			USBBuffer.Out=USBInterfaceDescriptor;
			USBBuffer.OutLength=sizeof(USBInterfaceDescriptor);
			break;
		case USB_GET_DESC_ENDPOINT		:
			USBBuffer.Out=USBEndpoint1Descriptor;
			USBBuffer.OutLength=sizeof(USBEndpoint1Descriptor);
			break;
		default							:
			break;
	}
}

void USBSetConfig(void)
{
	printf("SetConfig:%x \n",USBSetup->wValue);
	if (USBSetup->wValue)
		SET_BIT_1(USBCON);			//设置CONFIG
	else
		CLEAR_BIT_1(USBCON);
	UEPNUM=0x01;				//设置Endpoint1
	UEPCONX=USB_EPMOD_BULK_OUT;
	UEPNUM=0x02;				//设置Endpoint2
	UEPCONX=USB_EPMOD_BULK_IN;
	UEPNUM=0x00;				//设置Endpoint0
	USB_SEND_ZERO_PACKET;			//发送0字节包
}

void USBClearFeature(void)
{
	if (USBSetup->wValue)
	{

	}
	else
	{
		if (USBSetup->wIndex==0x0000)
			USB_SEND_ZERO_PACKET;
	}
}

void USBSetupDevice(void)
{
	switch (USBSetup->bRequest)
	{
		case USB_GET_STATUS			:
			USB_SEND_STALL_PACKET;
			break;
		case USB_CLEAR_FEATURE		:
			USBClearFeature();
			break;
		case USB_SET_FEATURE		:
			USB_SEND_STALL_PACKET;
			break;
		case USB_SET_ADDRESS		:
			USBSetAddress();
			break;
		case USB_GET_DESCRIPTOR		:
			USBGetDescriptor();
			USBWritePacket();
//			if (USBBuffer.OutLength==0x20)				//发送0字节包
			if (USBBuffer.OutLength==0x20&&USBSetup->wLength>0x2000)				//发送0字节包
			{
				SET_BIT_7(UEPSTAX);						//设置DIR
				SET_BIT_4(UEPSTAX);						//设置TXRDY
				while(!( UEPSTAX & 0x01 ));				//等待TXCMP
				CLEAR_BIT_0(UEPSTAX);					//清除TXCMP
			}
			break;
		case USB_SET_DESCRIPTOR		:
			USB_SEND_STALL_PACKET;
			break;
		case USB_GET_CONFIGURATION	:
			USB_SEND_STALL_PACKET;
			break;
		case USB_SET_CONFIGURATION	:
			USBSetConfig();
			break;
		case USB_GET_INTERFACE		:
			USB_SEND_STALL_PACKET;
			break;
		case USB_SET_INTERFACE		:
			USB_SEND_STALL_PACKET;
			break;
		case USB_SYNCH_FRAME		:
			USB_SEND_STALL_PACKET;
			break;
		default						:
//			USB_EP0_RESET;
			USB_SEND_STALL_PACKET;
			printf("not support request\n");
			break;
	}
}

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

	USB_DISABLE_INT_USB;				//禁止USB中断

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

//	USBIntFlag=USBINT;
//	UEPIntFlag=UEPINT;
//	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:");
			USBReadPacket();
			CLEAR_BIT_2(UEPSTAX);				//清除RXSETUP
			USBSetupDevice();
//			CLEAR_BIT_4(UEPCONX);
		}
		if (UEPSTAX&USB_INT_RXOUTB0)
		{
			printf(" RXOUTB0 ");
			USBReadPacket();
			CLEAR_BIT_1(UEPSTAX);
		}
		if (UEPSTAX&USB_INT_RXOUTB1)
		{
			printf(" RXOUTB1 ");
			USBReadPacket();
			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)
	{
		printf("Endpoint 1 Interrupt\n");
		UEPNUM=0x01;
		if (UEPSTAX&USB_INT_RXOUTB0)
		{
			printf(" RXOUTB0 ");
			USBReadPacket();
			CLEAR_BIT_1(UEPSTAX);
		}
		if (UEPSTAX&USB_INT_RXOUTB1)
		{
			printf(" RXOUTB1 ");
			USBReadPacket();
			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);
		}
	}

	if (UEPIntFlag&USB_INT_EP2)
	{
		printf("Endpoint 2 Interrupt\n");
		UEPNUM=0x02;
		if (UEPSTAX&USB_INT_RXOUTB0)
		{
			printf(" RXOUTB0 ");
			USBReadPacket();
			CLEAR_BIT_1(UEPSTAX);
		}
		if (UEPSTAX&USB_INT_RXOUTB1)
		{
			printf(" RXOUTB1 ");
			USBReadPacket();
			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 + -