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