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

📄 isr.c

📁 STC51+PDIUSBD12 USB鼠标源代码
💻 C
字号:
#include "d12.h"
#include "D12CI.H"
#include "uart.h"
#include "mytype.h"
#define SWAP(x)     ((((uint16)(x))<<8)|(((uint16)(x))>>8))   
EPPFLAGS bEPPflags;

/* Control endpoint TX/RX buffers */
extern CONTROL_XFER ControlData;
extern void bus_reset(void);

extern void ep0_txdone(void);
extern void ep0_rxdone(void);

extern void ep1_txdone(void);
extern void ep1_rxdone(void);

extern void main_txdone(void);
extern void main_rxdone(void);

extern void dma_eot(void);
unsigned char idata GenEpBuf[EP1_PACKET_SIZE];
unsigned char idata EpBuf[EP2_PACKET_SIZE];
//中断服务程序
void fn_usb_isr()
{
  uint16 i_st;
  Prints("IO");
  bEPPflags.bits.in_isr=1;
  i_st=D12_ReadInterruptRegister();           //读中断寄存器
  if(i_st!=0)
    {
	  Prints("\r\ni_st=");
	  PrintShortIntHex(i_st);    //输出
	  if(i_st&D12_INT_BUSRESET)
	    {
		  bEPPflags.bits.bus_reset=1;
		  Prints("\r\n总线复位");
		}
	  if(i_st&D12_INT_EOT)
	    dma_eot();                            //DMA传输结束
	  if(i_st&D12_INT_SUSPENDCHANGE)
	    {
		  bEPPflags.bits.suspend=1;
		  D12_SetEndpointEnable(1);
		  Prints("\r\n总线挂起");
		}
	  
	  if(i_st&D12_INT_ENDP0IN)
	    ep0_txdone(); 
	  if(i_st&D12_INT_ENDP0OUT)
	    ep0_rxdone();                       
	  
	  if(i_st&D12_INT_ENDP1IN)
	    ep1_txdone();                         
	  if(i_st&D12_INT_ENDP1OUT)
	    ep1_rxdone();
	  if(i_st&D12_INT_ENDP2IN)
	    main_txdone();                          
	  if(i_st&D12_INT_ENDP2OUT)
	    main_rxdone();
	}
  bEPPflags.bits.in_isr=0; 
}
//端点0OUT中断
void ep0_rxdone(void)
{
  uint8 ep_last,i;
  ep_last=D12_ReadLastTransactionStatus(0);
  Prints("\r\neplast=");
  PrintShortIntHex(ep_last);
  if(ep_last&D12_SETUPPACKET)
   {
     ControlData.wLength=0;
	 ControlData.wCount=0;
	 Prints("\nEP0OUT");
	 if(D12_ReadEndpoint(0,sizeof(ControlData.DeviceRequest),(uint8 *)(&(ControlData.DeviceRequest)))!=sizeof(DEVICE_REQUEST))
	   {
	     Prints("\nEP0OUTRETURN");
	     D12_SetEndpointStatus(0,1);
		 D12_SetEndpointStatus(1,1);
		 bEPPflags.bits.control_state=USB_IDLE;//空闲
		 return ;
	   }
	 ControlData.DeviceRequest.wValue=SWAP(ControlData.DeviceRequest.wValue);
	 ControlData.DeviceRequest.wLength=SWAP(ControlData.DeviceRequest.wLength);
	 ControlData.DeviceRequest.wIndex=SWAP(ControlData.DeviceRequest.wIndex);
	 Prints("\r\nbmRequestType=");
	 PrintShortIntHex(ControlData.DeviceRequest.bmRequestType);
 	 Prints("bRequest=");
	 PrintShortIntHex(ControlData.DeviceRequest.bRequest);
	 Prints("wValue=");
	 PrintShortIntHex(ControlData.DeviceRequest.wValue);
	 Prints("wIndex=");
	 PrintShortIntHex(ControlData.DeviceRequest.wIndex);
	 Prints("wLength");
	 PrintShortIntHex(ControlData.DeviceRequest.wLength);

	 D12_AcknowledgeEndpoint(0);
	 D12_AcknowledgeEndpoint(1);
	 ControlData.wLength=ControlData.DeviceRequest.wLength;
	 ControlData.wCount=0;
	 if(ControlData.DeviceRequest.bmRequestType&(uint8)USB_ENDPOINT_DIRECTION_MASK)
	   { //从设备传输数据 IN
	      bEPPflags.bits.setup_packet=1;
		  bEPPflags.bits.control_state=USB_TRANSMIT;
		  Prints("\r\n从设备传输数据进主机");
	   }
	 else  //从主机到设备的数据OUT
	   {
	     if(ControlData.DeviceRequest.wLength==0)		   //该请求没有数据阶段则设置为空闲,不需要再接收数据
		   {
		     bEPPflags.bits.setup_packet=1;
			 bEPPflags.bits.control_state=USB_IDLE;
			 Prints("\r\n从主机传数据到设备");
		   }
		 else
		   {
		     if(ControlData.DeviceRequest.wLength>MAX_CONTROLDATA_SIZE)	   //接收数据的长度出错
			   {
			     bEPPflags.bits.control_state=USB_IDLE;
				 D12_SetEndpointStatus(0,1);
				 D12_SetEndpointStatus(1,1);
				 Prints("\R\N接收数据的长度出错");
				 
			   }
			 else
			   {
			     bEPPflags.bits.control_state=USB_RECEIVE;			  //带数据的请求,且长度没错,则要接收数据
				 Prints("\r\n带数据的请求,且长度没错");
			   }
		   }
	   }
   }
  else if(bEPPflags.bits.control_state==USB_RECEIVE)
    {
	  i=D12_ReadEndpoint(0,EP0_PACKET_SIZE,ControlData.dataBuffer+ControlData.wCount);// 读取数据
	  ControlData.wCount+=i;
	  if(i!=EP0_PACKET_SIZE||ControlData.wCount>=ControlData.wLength)				//如果接收完毕
	    {
		  bEPPflags.bits.setup_packet=1;
		  bEPPflags.bits.control_state=USB_IDLE;
		}
	}
  else 
    {																				//既不是建立包又不是接收状态
	  bEPPflags.bits.control_state=USB_IDLE;
	}
}
//端点0IN
void ep0_txdone(void)
{
  uint16 i=ControlData.wLength-ControlData.wCount;
  Prints("\r\nwLength=");
  PrintShortIntHex(ControlData.wLength);
  Prints("\r\nwCount=");
  PrintShortIntHex(ControlData.wCount);
  Prints("\r\ni=");	
  PrintShortIntHex(i);
  D12_ReadLastTransactionStatus(1);
  if(bEPPflags.bits.control_state!=USB_TRANSMIT)		  //非发送状态返回
    return ;
  if(i>=EP0_PACKET_SIZE)
    {
	  D12_WriteEndpoint(1,EP0_PACKET_SIZE,ControlData.pData+ControlData.wCount);
	  ControlData.wCount+=EP0_PACKET_SIZE;
	  bEPPflags.bits.control_state=USB_TRANSMIT;	  
	}
  else if(i!=0)
    {
	  D12_WriteEndpoint(1,i,ControlData.pData+ControlData.wCount);
	  ControlData.wCount+=i;
	  bEPPflags.bits.control_state=USB_IDLE;
	}
  else if(i==0)
    {
	  D12_WriteEndpoint(1,0,0);
	  bEPPflags.bits.control_state=USB_IDLE;////发送完毕
	}	 
}
void dma_eot(void)
{
}
//端点1IN
void ep1_txdone(void)
{
  D12_ReadLastTransactionStatus(3);
}
//OUT
void ep1_rxtone(void)
{
  uint8 len;
  D12_ReadLastTransactionStatus(2);
  len=D12_ReadEndpoint(2,sizeof(GenEpBuf),GenEpBuf);			 //读取数据
  if(len!=0)
    bEPPflags.bits.ep1_rxdone=1;
}
//主端点IN
void main_txdone(void)
{
  D12_ReadLastTransactionStatus(5);
}
//主OUT
/*void main_rxdone(void)
{
  uint8 len,epstatus;
  D12_ReadLastTransactionStatus(4);
  epstatus=D12_ReadEndpointStatus(4);
  epstatus&=0x60;
  len=D12_ReadEndpoint(4,64,EpBuf);
  if(epstatus==0x60)
    len==D12_ReadEndpoint(4,64,EpBuf);

  len = D12_ReadEndpoint(4, 64, EpBuf);
	epstatus=D12_ReadEndpointStatus(4);
	epstatus &= 0x60;
	if (epstatus == 0x60)
		len = D12_ReadEndpoint(4, 64, EpBuf);//读取双缓冲区数据
}*/
void main_rxdone(void)
{
	unsigned char len,epstatus;

	D12_ReadLastTransactionStatus(4); //清中断标志位

	//接收数据
	len = D12_ReadEndpoint(4, 64, EpBuf);
	epstatus=D12_ReadEndpointStatus(4);
	epstatus &= 0x60;
	if (epstatus == 0x60)
		len = D12_ReadEndpoint(4, 64, EpBuf);//读取双缓冲区数据
}




































⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -