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

📄 f326_usb0_interruptserviceroutine.lst

📁 基于F326单片机的RS232转USB程序
💻 LST
📖 第 1 页 / 共 3 页
字号:
C51 COMPILER V7.50   F326_USB0_INTERRUPTSERVICEROUTINE                                     12/29/2007 16:03:22 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE F326_USB0_INTERRUPTSERVICEROUTINE
OBJECT MODULE PLACED IN F326_USB0_InterruptServiceRoutine.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\c51.exe F326_USB0_InterruptServiceRoutine.c DB OE

line level    source

   1          //-----------------------------------------------------------------------------
   2          // F326_USB0_InterruptServiceRoutine.c
   3          //-----------------------------------------------------------------------------
   4          //
   5          // Source file for USB firmware. Includes top level ISR with SETUP,
   6          // and Endpoint data handlers.  Also includes routine for USB suspend,
   7          // reset, and procedural stall.
   8          //
   9          
  10          #include "c8051F326.h"
  11          #include "F326_USB0_Register.h"
  12          #include "F326_USB0_Descriptor.h"
  13          #include "F326_USB0_ReportHandler.h"
  14          #include "F326_USB0_InterruptServiceRoutine.h"
  15          #include "F326_USB0_Uart.h"
  16          #include "F326_USB0_Touch.h"
  17          //-----------------------------------------------------------------------------
  18          // Global Variable Definitions
  19          //-----------------------------------------------------------------------------
  20          unsigned char USB0_STATE;               // Holds the current USB State
  21                                                 // def. in F326_USB0_InterruptServiceRoutine.h
  22          
  23          setup_buffer SETUP;                    // Buffer for current device
  24                                                 // request information
  25          
  26          unsigned int DATASIZE;                 // Size of data to return
  27          unsigned int DATASENT;                 // Amount of data sent so far
  28          unsigned char* DATAPTR;                // Pointer to data to return
  29          
  30          unsigned char EP_STATUS[3] = {EP_IDLE, EP_HALT, EP_HALT};
  31                                                 // Holds the status for each endpoint
  32          
  33          
  34          
  35          //-----------------------------------------------------------------------------
  36          // Local Function Definitions
  37          //-----------------------------------------------------------------------------
  38          void Usb_Resume (void);                // resumes USB operation
  39          void Usb_Reset (void);                 // Called after USB bus reset
  40          void Handle_Control (void);            // Handle SETUP packet on EP 0
  41          void Handle_In1 (void);                // Handle in packet on EP 1
  42          void Handle_Out1 (void);               // Handle out packet on EP 1
  43          void Usb_Suspend (void);               // This routine called when
  44                                                 // suspend signalling on bus
  45          void Fifo_Read (unsigned char, unsigned int, unsigned char *);
  46                                                 // Used for multiple byte reads
  47                                                 // of Endpoint fifos
  48          void Fifo_Write_Foreground (unsigned char, unsigned int, unsigned char *);
  49                                                 // Used for multiple byte writes
  50                                                 // of Endpoint fifos in foreground
  51          void Fifo_Write_InterruptServiceRoutine (unsigned char, unsigned int,
  52                                                                                           unsigned char *);
  53                                                 // Used for multiple byte
  54                                                 // writes of Endpoint fifos
  55          
C51 COMPILER V7.50   F326_USB0_INTERRUPTSERVICEROUTINE                                     12/29/2007 16:03:22 PAGE 2   

  56          
  57          //-----------------------------------------------------------------------------
  58          // Usb_ISR
  59          //-----------------------------------------------------------------------------
  60          //
  61          // Called after any USB type interrupt, this handler determines which type
  62          // of interrupt occurred, and calls the specific routine to handle it.
  63          //
  64          //-----------------------------------------------------------------------------
  65          void Usb_ISR (void) interrupt 8        // Top-level USB ISR
  66          {
  67   1      
  68   1         unsigned char bCommon, bIn, bOut;
  69   1         POLL_READ_BYTE (CMINT, bCommon);    // Read all interrupt registers
  70   1         POLL_READ_BYTE (IN1INT, bIn);       // this read also clears the register
  71   1         POLL_READ_BYTE (OUT1INT, bOut);
  72   1         {
  73   2            if (bCommon & rbRSUINT)          // Handle Resume interrupt
  74   2            {
  75   3               Usb_Resume ();
  76   3            }
  77   2            if (bCommon & rbRSTINT)          // Handle Reset interrupt
  78   2            {
  79   3               Usb_Reset ();
  80   3            }
  81   2            if (bIn & rbEP0)                 // Handle SETUP packet received
  82   2            {                                // or packet transmitted if Endpoint 0
  83   3               Handle_Control ();            // is in transmit mode
  84   3            }
  85   2            if (bIn & rbIN1)                 // Handle In Packet sent, put new data
  86   2            {                                // on endpoint 1 fifo
  87   3               Handle_In1 ();
  88   3            }
  89   2            if (bOut & rbOUT1)               // Handle Out packet received, take
  90   2            {                                // data off endpoint 2 fifo
  91   3               Handle_Out1 ();
  92   3            }
  93   2            if (bCommon & rbSUSINT)          // Handle Suspend interrupt
  94   2            {
  95   3               Usb_Suspend ();
  96   3            }
  97   2         }
  98   1      }
  99          
 100          //-----------------------------------------------------------------------------
 101          // Support Routines
 102          //-----------------------------------------------------------------------------
 103          
 104          //-----------------------------------------------------------------------------
 105          // Usb_Reset
 106          //-----------------------------------------------------------------------------
 107          //
 108          // Return Value : None
 109          // Parameters   : None
 110          //
 111          // - Set state to default
 112          // - Clear Usb Inhibit bit
 113          //
 114          //-----------------------------------------------------------------------------
 115          
 116          void Usb_Reset (void)
 117          {
C51 COMPILER V7.50   F326_USB0_INTERRUPTSERVICEROUTINE                                     12/29/2007 16:03:22 PAGE 3   

 118   1         USB0_STATE = DEV_DEFAULT;           // Set device state to default
 119   1      
 120   1         POLL_WRITE_BYTE (POWER, 0x01);      // Clear usb inhibit bit to enable USB
 121   1                                             // suspend detection
 122   1      
 123   1         EP_STATUS[0] = EP_IDLE;             // Set default Endpoint Status
 124   1         EP_STATUS[1] = EP_HALT;
 125   1         EP_STATUS[2] = EP_HALT;
 126   1      }
 127          
 128          
 129          
 130          //-----------------------------------------------------------------------------
 131          // Usb_Resume
 132          //-----------------------------------------------------------------------------
 133          //
 134          // Return Value : None
 135          // Parameters   : None
 136          //
 137          // Resume normal USB operation
 138          //
 139          //-----------------------------------------------------------------------------
 140          
 141          void Usb_Resume(void)
 142          {
 143   1         volatile int k;
 144   1      
 145   1         k++;
 146   1      
 147   1         // Add code for resume
 148   1      }
 149          
 150          
 151          //-----------------------------------------------------------------------------
 152          // Handle_Control
 153          //-----------------------------------------------------------------------------
 154          //
 155          // Return Value : None
 156          // Parameters   : None
 157          //
 158          // - Decode Incoming SETUP requests
 159          // - Load data packets on fifo while in transmit mode
 160          //
 161          //-----------------------------------------------------------------------------
 162          
 163          void Handle_Control (void)
 164          {
 165   1         unsigned char ControlReg;           // Temporary storage for EP control
 166   1                                             // register
 167   1      
 168   1         POLL_WRITE_BYTE (INDEX, 0);         // Set Index to Endpoint Zero
 169   1         POLL_READ_BYTE (E0CSR, ControlReg); // Read control register
 170   1      
 171   1         if (EP_STATUS[0] == EP_ADDRESS)     // Handle Status Phase of Set Address
 172   1                                             // command
 173   1         {
 174   2            POLL_WRITE_BYTE (FADDR, SETUP.wValue.c[LSB]);
 175   2            EP_STATUS[0] = EP_IDLE;
 176   2         }
 177   1      
 178   1         if (ControlReg & rbSTSTL)           // If last packet was a sent stall,
 179   1         {                                   // reset STSTL bit and return EP0
C51 COMPILER V7.50   F326_USB0_INTERRUPTSERVICEROUTINE                                     12/29/2007 16:03:22 PAGE 4   

 180   2                                             // to idle state
 181   2            POLL_WRITE_BYTE (E0CSR, 0);
 182   2            EP_STATUS[0] = EP_IDLE;
 183   2            return;
 184   2         }
 185   1      
 186   1         if (ControlReg & rbSUEND)           // If last SETUP transaction was
 187   1         {                                   // ended prematurely then set
 188   2            POLL_WRITE_BYTE (E0CSR, rbDATAEND);
 189   2            // Serviced SETUP End bit and return EP0
 190   2            POLL_WRITE_BYTE (E0CSR, rbSSUEND);
 191   2            EP_STATUS[0] = EP_IDLE;          // to idle state
 192   2         }
 193   1      
 194   1         if (EP_STATUS[0] == EP_IDLE)        // If Endpoint 0 is in idle mode
 195   1         {
 196   2            if (ControlReg & rbOPRDY)        // Make sure that EP 0 has an Out Packet
 197   2            {                                // ready from host although if EP0
 198   3                                             // is idle, this should always be the
 199   3                                             // case
 200   3               Fifo_Read (FIFO_EP0, 8, (unsigned char *)&SETUP);
 201   3                                             // Get SETUP Packet off of Fifo,
 202   3                                             // it is currently Big-Endian
 203   3      
 204   3                                             // Compiler Specific - these next three
 205   3                                             // statements swap the bytes of the

⌨️ 快捷键说明

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