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

📄 usb_setup.lst

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

 180   2               Force_Stall();                         
 181   2          }
 182   1         if (Ep_Status[0] != EP_STALL)
 183   1         {
 184   2                      UWrite_Byte(E0CSR, rbSOPRDY);
 185   2                      UWrite_Byte(E0CSR, rbDATAEND);                       
 186   2         }
 187   1      }
 188          void Set_Feature()
 189          {
 190   1              if ((Setup.bmRequestType  & 0x02) &&            // 意义同上
 191   1              (Setup.wValue[0] == ENDPOINT_HALT) &&  
 192   1             ((Setup.wIndex[0] == IN_EP1)      || 
 193   1              (Setup.wIndex[0] == OUT_EP2)))
 194   1              {
 195   2               if (Setup.wIndex[0] == IN_EP1) 
 196   2               {
 197   3                  UWrite_Byte (INDEX, 1);               
 198   3                  UWrite_Byte (EINCSRL, rbInSDSTL);   // rbInSDSTL=1,发送STALL作为对IN令牌的响应,
 199   3                                                                                                      // 在端点1中断处理函数中将rbInSDSTl和rbInSTSTL清零    
 200   3                  Ep_Status[1] = EP_HALT;             // 端点1到HALT状态                     
 201   3               }
 202   2               else
 203   2               {
 204   3                  UWrite_Byte(INDEX, 2);                      
 205   3                  UWrite_Byte (EOUTCSRL, rbOutSDSTL); // 同上       
 206   3                  Ep_Status[2] = EP_HALT;                 
 207   3               }
 208   2              }
 209   1              else
 210   1          { 
 211   2                      Force_Stall();                          
 212   2          }  
 213   1         if (Ep_Status[0] != EP_STALL)
 214   1         {
 215   2                      UWrite_Byte(E0CSR, rbSOPRDY);
 216   2                      UWrite_Byte(E0CSR, rbDATAEND);                       
 217   2         }
 218   1      }
 219          void Set_Address()
 220          {
 221   1              if (Setup.wValue[0] != 0) 
 222   1              {
 223   2              USB_State = DEV_ADDRESS;            // 收到不为0的地址,设备处于地址状态,此次传输的
 224   2              UWrite_Byte(FADDR, Setup.wValue[0]);// 状态阶段结束后新地址将起作用
 225   2              Ep_Status[0] = EP_IDLE;
 226   2      
 227   2              }
 228   1              else 
 229   1              {
 230   2              USB_State = DEV_DEFAULT;            // 收到的地址为0,设备仍旧处于默认状态
 231   2              }
 232   1              UWrite_Byte(E0CSR, rbSOPRDY);
 233   1              UWrite_Byte(E0CSR, rbDATAEND);                       
 234   1                                                    
 235   1      }
 236          void Get_Descriptor()
 237          {
 238   1              unsigned int In_DataSize=0;                     // 要发送的数据总量
 239   1              In_DataSize=Setup.wLength[0]+Setup.wLength[1]*256;
 240   1              switch(Setup.wValue[1])             // 判断描述符的类型
 241   1          {                                            
C51 COMPILER V7.20   USB_SETUP                                                             06/23/2008 19:39:44 PAGE 5   

 242   2                      case DSC_DEVICE:                        // 设备描述符  
 243   2                      DataPtr  = DeviceDesc;
 244   2                              if(In_DataSize>18)
 245   2                              {DataSize = 18; }       
 246   2                              else
 247   2                              {DataSize = In_DataSize;}
 248   2              break;      
 249   2                      case DSC_CONFIG:                                // 配置描述符
 250   2                      DataPtr  = ConfigDesc;
 251   2                              if(In_DataSize==0x09)
 252   2                              {
 253   3                                      DataSize=0x09;
 254   3                              }
 255   2                              else if(In_DataSize==0x20)
 256   2                              {
 257   3                                      DataSize=0x20;
 258   3                              }
 259   2                              else if(In_DataSize==0xff)
 260   2                              {
 261   3                                      DataSize=0x20;
 262   3                              }
 263   2              break;
 264   2                      case DSC_STRING:                                // 字符串描述符
 265   2                               DataPtr=&StringDes[Setup.wValue[0]];
 266   2                               DataSize=In_DataSize;
 267   2                               break;
 268   2                      default:                 break;
 269   2              }
 270   1              UWrite_Byte(E0CSR, rbSOPRDY);
 271   1          Ep_Status[0] = EP_TX;                      // 端点0在发送状态
 272   1          DataSent = 0;                              
 273   1      }
 274          void Get_Configuration()
 275          {
 276   1         if (USB_State == DEV_CONFIGURED)   // If the device is configured, then return value 0x01
 277   1         {                                  // since this software only supports one configuration
 278   2               DataPtr  = ONES_PACKET;
 279   2               DataSize = 1;
 280   2         }
 281   1         if (USB_State == DEV_ADDRESS)      // If the device is in address state, it is not
 282   1         {                                  // configured, so return 0x00
 283   2               DataPtr  = ZERO_PACKET;
 284   2               DataSize = 1;
 285   2         }
 286   1         if (Ep_Status[0] != EP_STALL)
 287   1         {
 288   2                      UWrite_Byte(E0CSR, rbSOPRDY);
 289   2              Ep_Status[0] = EP_TX;                 
 290   2              DataSent = 0;                         
 291   2         }
 292   1      }
 293          void Set_Configuration()
 294          {
 295   1         if (Setup.wValue[0] > 0)                  // Any positive configuration request
 296   1         {                                         // results in configuration being set to 1
 297   2               USB_State = DEV_CONFIGURED;
 298   2                       ///////////////////////////////////////////////////////////////////////////////////
 299   2               UWrite_Byte(INDEX, 1);     
 300   2               UWrite_Byte(EINCSRH,0xa0); // 双缓冲、ISO、FIFO分割和强制数据Toggle禁止,IN端点
 301   2                       Ep_Status[1]=EP_IDLE;
 302   2                        
 303   2               UWrite_Byte(INDEX, 2);            
C51 COMPILER V7.20   USB_SETUP                                                             06/23/2008 19:39:44 PAGE 6   

 304   2               UWrite_Byte(EOUTCSRH, 0x80);      // 双缓冲和ISO禁止,OUT端点
 305   2                       Ep_Status[2]=EP_IDLE; 
 306   2                       ///////////////////////////////////////////////////////////////////////////////////
 307   2               UWrite_Byte(INDEX, 0);           
 308   2         }
 309   1         else
 310   1         {
 311   2               USB_State = DEV_ADDRESS;         // 设备仍旧在地址状态
 312   2                       Ep_Status[1]=EP_STALL;
 313   2                       Ep_Status[2]=EP_STALL;
 314   2         }
 315   1         if (Ep_Status[0] != EP_STALL)
 316   1         {
 317   2                      UWrite_Byte(E0CSR, rbSOPRDY);
 318   2                      UWrite_Byte(E0CSR, rbDATAEND);                
 319   2         }
 320   1      }
 321          void Get_Interface()
 322          {
 323   1              DataPtr = ZERO_PACKET;            
 324   1              DataSize = 1;
 325   1          if (Ep_Status[0] != EP_STALL)
 326   1          { 
 327   2                      UWrite_Byte(E0CSR, rbSOPRDY);                  
 328   2              Ep_Status[0] = EP_TX;          
 329   2              DataSent = 0;
 330   2          }
 331   1      }
 332          void Set_Interface()
 333          {
 334   1              UWrite_Byte(E0CSR, rbSOPRDY);
 335   1              UWrite_Byte(E0CSR, rbDATAEND);             
 336   1      }
 337          
 338          void Get_Maxlun()                       // U盘支持一个逻辑单元,返回1即可
 339          {
 340   1              DataPtr = ZERO_PACKET;            
 341   1              DataSize = 1;
 342   1          if (Ep_Status[0] != EP_STALL)
 343   1          {                       
 344   2              Ep_Status[0] = EP_TX;           
 345   2              DataSent = 0;
 346   2          }
 347   1              UWrite_Byte(E0CSR, rbSOPRDY);
 348   1      }
 349          ////////////////////////////////////////////////////////////////////////////////////////////////////
 350          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1183    ----
   CONSTANT SIZE    =    115    ----
   XDATA SIZE       =   ----    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     23       2
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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