?? copy of usb.h
字號:
+ 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 + -