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

📄 isr.c

📁 采用Atmeag162单片机来制作的U盘程序源码
💻 C
字号:
#include <iom162v.h>
#include <macros.h>
#include <stdio.h>
#include <string.h>

#include "D12CI.h"
#include "MAIN.h"
#include "USB100.h"
#include "BulkOnly.H"

void bus_reset(void);

void ep0_txdone(void);
void ep0_rxdone(void);
void ep1_txdone(void);
void ep1_rxdone(void);
void main_txdone(void);
void main_rxdone(void);

EPPFLAGS             bEPPflags;
extern CONTROL_XFER  ControlData;
IO_REQUEST           ioRequest;
extern BULK_CONTROL  Bulk_Control_r;
extern BULK_CONTROL  Bulk_Control_w;
extern BULK_STRUCT   Bulk_Block;
extern unsigned char PageBuf[512];

#pragma interrupt_handler usb_isr:iv_INT0
void usb_isr(void)
{
  unsigned int x;
  bEPPflags.bits.in_isr=1;
  x=D12_ReadInterruptRegister();
  if(x!=0)
  {
     if(x&D12_INT_BUSRESET)
     {
         bus_reset();
         bEPPflags.bits.bus_reset=1;
     }
     //if(x&D12_INT_EOT)
     //    dma_eot();
     if(x&D12_INT_SUSPENDCHANGE)
         bEPPflags.bits.suspend=1;
     if(x&D12_INT_ENDP0IN)
         ep0_txdone();
     if(x&D12_INT_ENDP0OUT)
         ep0_rxdone();
     if(x&D12_INT_ENDP1IN)
         ep1_txdone();
     if(x&D12_INT_ENDP1OUT)
         ep1_rxdone();
     if(x&D12_INT_ENDP2IN)
         main_txdone();
     if(x&D12_INT_ENDP2OUT)
	  //  bEPPflags.bits.main_txdone=1;
         main_rxdone();
  }
  bEPPflags.bits.in_isr=0;
}
void bus_reset(void)
{
}
void ep0_rxdone(void)
{
  unsigned char ep_last,i;
  ep_last=D12_ReadLastTransactionStatus(0);
  if(ep_last&D12_SETUPPACKET)
  {
    ControlData.wLength=0;
    ControlData.wCount=0;
    if(D12_ReadEndpoint(0,sizeof(ControlData.DeviceRequest),
           (unsigned char *)(&(ControlData.DeviceRequest)))!=sizeof(DEVICE_REQUEST))
    {
       D12_SetEndpointStatus(0,1);
       D12_SetEndpointStatus(1,1);
       bEPPflags.bits.control_state=USB_IDLE;
       return;
    }
    D12_AcknowledgeEndpoint(0);
    D12_AcknowledgeEndpoint(1);
    ControlData.wLength=ControlData.DeviceRequest.wLength;
    ControlData.wCount=0;
    if(ControlData.DeviceRequest.bmRequestType&(unsigned char)USB_ENDPOINT_DIRECTION_MASK)
    {
       bEPPflags.bits.setup_packet=1;
       bEPPflags.bits.control_state=USB_IDLE;
    }
    else
    {
      if(ControlData.DeviceRequest.wLength==0)
      {
        bEPPflags.bits.setup_packet=1;
        bEPPflags.bits.control_state=USB_IDLE;
      }
      else
      {
        if(ControlData.DeviceRequest.wLength>MAX_CONTROLDATA_SIZE)
        {
          bEPPflags.bits.control_state=USB_IDLE;
          D12_SetEndpointStatus(0,1);
          D12_SetEndpointStatus(1,1);
        }
        else
        {
          bEPPflags.bits.control_state=USB_RECEIVE;
        }
      }
    }
  }
  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;
  }
}
void ep0_txdone(void)
{
  short i=ControlData.wLength-ControlData.wCount;
  D12_ReadLastTransactionStatus(1);
  if(bEPPflags.bits.control_state!=USB_TRANSMIT)
     return;
  if(i>=EP0_PACKET_SIZE)
  {
     if(bEPPflags.bits.rom_state)
	    D12_CWriteEndpoint(1,EP0_PACKET_SIZE,ControlData.pCData+ControlData.wCount);
     else		
        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)
  {
     if(bEPPflags.bits.rom_state)
	    D12_CWriteEndpoint(1,i,ControlData.pCData+ControlData.wCount);
	 else
        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 ep1_txdone(void)
{
   D12_ReadLastTransactionStatus(3);
}
void ep1_rxdone(void)
{
   D12_ReadLastTransactionStatus(2); 
}
void main_txdone(void)
{
  unsigned int i;
  D12_ReadLastTransactionStatus(5);
  if(bEPPflags.bits.bulk_state==BULK_REQEST_TRANS)
  {
     i=ControlData.wLength-ControlData.wCount;
     if(i>=EP2_PACKET_SIZE)
     {
        D12_CWriteEndpoint(5,EP2_PACKET_SIZE,ControlData.pCData+ControlData.wCount);
        ControlData.wCount+=EP2_PACKET_SIZE;
        bEPPflags.bits.bulk_state=BULK_REQEST_TRANS;
    } 
	else
    {
        D12_CWriteEndpoint(5,i,ControlData.pCData+ControlData.wCount);
	    ControlData.wCount+=i;
        bEPPflags.bits.bulk_state=BULK_DATA_END;
    } 
  }
  else if(bEPPflags.bits.bulk_state==BULK_DATA_END)
  {
    Bulk_CSWHandler();
  } 
  else if(bEPPflags.bits.bulk_state==BULK_DATA_TRANS)
  {
      if(Bulk_Control_r.BufCount<448)//512-64=448
      {	    
        Bulk_Control_r.BufCount+=64;
	    D12_WriteEndpoint(5,64,PageBuf+Bulk_Control_r.BufCount);
      }	 
      else if(Bulk_Control_r.Transfer_Length>0)
      {
	     if(Bulk_Control_r.CurrentPage==32)
	     {
	       Bulk_Control_r.CurrentBlock++;
	       Bulk_Control_r.CurrentPage=0;
	     }
	     ReadPage(Bulk_Control_r.CurrentBlock,Bulk_Control_r.CurrentPage,PageBuf);
		 Bulk_Control_r.CurrentPage++;
	     Bulk_Control_r.Transfer_Length--;     
	     Bulk_Control_r.BufCount=0;
		 bEPPflags.bits.bulk_state=BULK_DATA_TRANS;
		 D12_WriteEndpoint(5,64,PageBuf+Bulk_Control_r.BufCount);		 
     }
     else
       Bulk_CSWHandler();   
  }    
}
void main_rxdone(void)
{
  unsigned char len,i;
  D12_ReadLastTransactionStatus(4);
  if(bEPPflags.bits.bulk_state==BULK_IDLE)         
       Bulk_CBWHandler();
  else if(bEPPflags.bits.bulk_state==BULK_DATA_RECIEVE)
  {
      len=D12_ReadEndpoint(4,64,PageBuf+Bulk_Control_w.BufCount);
	  Bulk_Control_w.BufCount+=len;
	  if(Bulk_Control_w.BufCount>=448)
	  {
         len=D12_ReadEndpoint(4,64,PageBuf+Bulk_Control_w.BufCount);
		 Bulk_Control_w.BufCount+=len;		  
	  } 
	  if(Bulk_Control_w.BufCount>=512)	
      {
	    WritePage(Bulk_Control_w.CurrentBlock,Bulk_Control_w.CurrentPage,PageBuf);
		Bulk_Control_w.CurrentPage++;
		Bulk_Control_w.Transfer_Length--;
		Bulk_Control_w.BufCount=0;			 
	  }	 
	  if((Bulk_Control_w.Transfer_Length>0)&&(Bulk_Control_w.CurrentPage==32))
	  {
		Bulk_Control_w.CurrentBlock++;
 		Bulk_Control_w.CurrentPage=0;
		Bulk_Control_w.BeginPage=0;
	    Bulk_Control_w.BufCount=0;
		Erase_Cluster(Bulk_Control_w.CurrentBlock);		
	  } 
	  else if(Bulk_Control_w.Transfer_Length==0)
	  {
		for(i=Bulk_Control_w.CurrentPage;i<32;i++)
		{
		  ReadPage(CANCEL_BLOCK,i,PageBuf);
   		  WritePage(Bulk_Control_w.CurrentBlock,i,PageBuf);
		}
		Bulk_CSWHandler();
	 }
  }	   	           
}

⌨️ 快捷键说明

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