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

📄 usb_setup.lst

📁 实现U盘功能的单片机程序,单片机为C8051F340
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V7.20   USB_SETUP                                                             06/23/2008 19:39:44 PAGE 1   


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

line level    source

   1          #include "c8051F340.h"
   2          #include "stdio.h"
   3          #include "intrins.h"
   4          /////////////////////////////
   5          #include "Usb_Descreptor.h"
   6          #include "Usb_FunDec.h"
   7          #include "Usb_Parameter.h"
   8          #include "Usb_Register.h"
   9          #include "Usb_Request.h"
  10          
  11          //全局变量
  12          static unsigned int   DataSize;                                 // 需要端点0发送的数据大小
  13          static unsigned int   DataSent;                                 // 端点0已经发送的数据大小
  14          static unsigned char  *DataPtr;                                 // 端点0发送数据的指针
  15          static unsigned char  ONES_PACKET[2] = {0x01, 0x00};    // 在Get_Status等命令中应用的数组
  16          static unsigned char  ZERO_PACKET[2] = {0x00, 0x00};    // 在Get_Status等命令中应用的数组
  17          
  18          unsigned char  Ep_Status[3]     ={EP_IDLE,EP_STALL,EP_STALL};   // 定义端点的状态
  19          unsigned char  USB_State        =DEV_ATTACHED;                  // 定义设备的状态
  20          struct Usb_Setup                                                // Setup阶段收到的8字节的命令,此处定义为结构
  21          {
  22                  unsigned char bmRequestType;
  23                  unsigned char bRequest;
  24                  unsigned char wValue[2];
  25                  unsigned char wIndex[2];
  26                  unsigned char wLength[2];
  27          }Setup;
  28          
  29          ///////////////////////////////////////////////////////////////////////////////////////////////
  30          void Handle_Setup()                                             //端点0中断处理函数
  31          {
  32   1          unsigned char ControlReg=0;         // 存放端点0控制/状态寄存器值的变量
  33   1          UWrite_Byte(INDEX, 0);              // 指向端点0
  34   1          URead_Byte(E0CSR, ControlReg);      // 读端点0控制寄存器
  35   1          if (ControlReg & rbSUEND)           // 如果上次数据阶段提前结束
  36   1          {  
  37   2                      UWrite_Byte(E0CSR, rbDATAEND);  // 当前数据传完                                
  38   2              UWrite_Byte(E0CSR, rbSSUEND);   // 清除SUEND标志
  39   2              Ep_Status[0] = EP_IDLE;         // 端点返回到空闲状态
  40   2          }
  41   1          if (ControlReg & rbSTSTL)           // 如果上次传输因错误而发送了STALL使传输提前结束
  42   1          {                                  
  43   2              UWrite_Byte(E0CSR, 0);          // 清除STALL
  44   2              Ep_Status[0] = EP_IDLE;                 // 端点0返回到空闲状态
  45   2          }
  46   1      
  47   1              if (ControlReg & rbOPRDY)           // 如果接收到输出数据包
  48   1              {
  49   2                  if (Ep_Status[0] == EP_IDLE)    // 如果端点0空闲
  50   2                      {
  51   3                              Fifo_Read(FIFO_EP0,8,(unsigned char *)&Setup);          // 读取设置数据包,8个字节
  52   3                              switch(Setup.bRequest)                                      // 判断请求类型   
  53   3                              {                              
  54   4                                      case GET_STATUS:                Get_Status();           break;                                  
  55   4                                      case CLEAR_FEATURE:             Clear_Feature();        break;
C51 COMPILER V7.20   USB_SETUP                                                             06/23/2008 19:39:44 PAGE 2   

  56   4                                      case SET_FEATURE:       Set_Feature();          break;   
  57   4                                      case SET_ADDRESS:               Set_Address();          break;  
  58   4                                      case GET_DESCRIPTOR:    Get_Descriptor();       break;  
  59   4                                      case GET_CONFIGURATION: Get_Configuration();break;
  60   4                                      case SET_CONFIGURATION: Set_Configuration();break;
  61   4                                      case GET_INTERFACE:             Get_Interface();        break;
  62   4                                      case SET_INTERFACE:             Set_Interface();        break;          
  63   4                                      case GET_MAXLUN:                Get_Maxlun();           break;
  64   4                                      default:                                Force_Stall();          break;                  
  65   4                      }       
  66   3                                               
  67   3                      /////////////////////////////////////////////////////////////////////////////////////////////
  68   3                      }
  69   2                      else if(Ep_Status[0]==EP_RX)    // 如果在OUT状态,此程序中不会从端点0接收其它信息,所以没相关的操作
  70   2                      {}
  71   2              }
  72   1              if (Ep_Status[0] == EP_TX)                      // 如果在IN状态
  73   1              {
  74   2                          unsigned char ControlReg=0,TempReg=0;       // 存放寄存器值的变量                                      
  75   2                              URead_Byte(E0CSR, ControlReg);                  // 读端点0控制寄存器                              
  76   2                              TempReg = rbINPRDY;                     // 输出数据准备好           
  77   2                              if (DataSize >= EP0_PACKET_SIZE)                // 如果待发送数据的长度大于端点0长度
  78   2                              {
  79   3                                      Fifo_Write(FIFO_EP0, EP0_PACKET_SIZE,DataPtr);  // 发送数据包
  80   3                              DataPtr  += EP0_PACKET_SIZE;                    // 更新数据指针
  81   3                              DataSize -= EP0_PACKET_SIZE;                    // 更新待发送的数据量
  82   3                              DataSent += EP0_PACKET_SIZE;                    // 更新已发送的数据量
  83   3                          }
  84   2                              else                                            // 如果待发送数据的长度小于端点0长度
  85   2                              {
  86   3                                      Fifo_Write(FIFO_EP0, DataSize,DataPtr); // 发送剩余的数据       
  87   3                              TempReg |= rbDATAEND;                   // 指示数据发送完备,进入状态阶段                              
  88   3                              Ep_Status[0] = EP_IDLE;                 // 端点返回到空闲状态               
  89   3                              }
  90   2                              if (DataSent == (Setup.wLength[0]+256*Setup.wLength[1]))        //如果发送的数据量正好是端点0的整数倍
  91   2                                                          
  92   2                          {
  93   3                              TempReg |= rbDATAEND;    // 指示数据发送完备,进入状态阶段
  94   3                              Ep_Status[0] = EP_IDLE;  // 端点返回到空闲状态
  95   3                          }
  96   2                              UWrite_Byte(E0CSR, TempReg);  // 写端点0控制寄存器
  97   2          }
  98   1      }
  99          
 100          void Force_Stall()
 101          {
 102   1              UWrite_Byte(INDEX, 0);
 103   1          UWrite_Byte(E0CSR, rbSDSTL);       // 发送STALL
 104   1          Ep_Status[0] = EP_STALL;           // 端点0到STALL状态,直到下次复位
 105   1      }
 106          
 107          //处理标准请求的函数
 108          void Get_Status()
 109          {       
 110   1              switch(Setup.bmRequestType)                  
 111   1              {
 112   2              case IN_DEVICE:                                 // 如果是设备的状态
 113   2                      DataPtr = ZERO_PACKET;                  // 发送 0x00, 总线供电,不支持远程唤醒
 114   2                      DataSize = 2;                           
 115   2                      break;      
 116   2              case IN_INTERFACE:                              // 接口状态
 117   2                      DataPtr = ZERO_PACKET;                  // 接口状态永远返回0
C51 COMPILER V7.20   USB_SETUP                                                             06/23/2008 19:39:44 PAGE 3   

 118   2                      DataSize = 2;         
 119   2                      break;  
 120   2              case IN_ENDPOINT:                               // 端点状态
 121   2                      if (Setup.wIndex[0] == IN_EP1)          // 如果是端点1
 122   2                              {
 123   3                                      if (Ep_Status[1] == EP_HALT)
 124   3                                      {                               // 如果端点1在EN_HALT状态
 125   4                                              DataPtr = ONES_PACKET;          // 发送ONES_PACKET,指示端点1在HALT状态
 126   4                              DataSize = 2;
 127   4                          }
 128   3                          else
 129   3                          {
 130   4                              DataPtr = ZERO_PACKET;          // 否则发送ZERO_PACKET,指示端点1在空闲状态
 131   4                              DataSize = 2;
 132   4                          }
 133   3                              }
 134   2                      if (Setup.wIndex[0] == OUT_EP2)
 135   2                      {                                 
 136   3                                      if (Ep_Status[2] == EP_HALT) 
 137   3                                      {
 138   4                                              DataPtr = ONES_PACKET;
 139   4                              DataSize = 2;
 140   4                                      }
 141   3                          else
 142   3                                      {
 143   4                                              DataPtr = ZERO_PACKET;
 144   4                                              DataSize = 2;
 145   4                                      }
 146   3                              }
 147   2                  break;
 148   2            default:  Force_Stall();  break;           
 149   2              }
 150   1         if (Ep_Status[0] != EP_STALL)
 151   1         {
 152   2                      UWrite_Byte(E0CSR, rbSOPRDY);                       
 153   2              Ep_Status[0] = EP_TX;                     // 端点0在EP_TX状态
 154   2              DataSent = 0;                                                           // 已发送数据量清零
 155   2         }
 156   1      }
 157          
 158          void Clear_Feature()
 159          {
 160   1              if ((Setup.bmRequestType & 0x02)&&                      // 如果是端点
 161   1              (Setup.wValue[0] == ENDPOINT_HALT)  &&  // 并且这些端点的状态是EP_HALT
 162   1             ((Setup.wIndex[0] == IN_EP1) ||          // 并且选择的是端点1 IN
 163   1              (Setup.wIndex[0] == OUT_EP2)))          // 或端点2 OUT 
 164   1              {
 165   2               if (Setup.wIndex[0] == IN_EP1) 
 166   2               {
 167   3                  UWrite_Byte (INDEX, 1);             // 使toggle复位为零
 168   3                  UWrite_Byte (EINCSRL, rbInCLRDT);       
 169   3                  Ep_Status[1] = EP_IDLE;             // 端点1到空闲状态                    
 170   3               }
 171   2               else
 172   2               {
 173   3                  UWrite_Byte (INDEX, 2);         
 174   3                  UWrite_Byte (EOUTCSRL, rbOutCLRDT);         
 175   3                  Ep_Status[2] = EP_IDLE;             
 176   3               }
 177   2              }
 178   1              else
 179   1          { 

⌨️ 快捷键说明

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