?? interruptusb.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 + -