📄 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 + -