32musb.lst

来自「这个是一个完整的MP3项目」· LST 代码 · 共 941 行 · 第 1/4 页

LST
941
字号
 222   2                      UEPDATX = Data[i];//将数据写入端点
 223   2              }
 224   1      
 225   1              UEPSTAX |= TXRDY;//发送数据Sending the data,this action will switch between bank0 and bank1
 226   1              
 227   1      }
 228          
 229          void Get_Status()
 230          {
 231   1              printu("Get_Status");
 232   1      } 
 233          
 234          void Clear_Feature()
 235          {
 236   1              printu("Clear_Feature");
 237   1      }
 238          
 239          void Set_Feature()
 240          {
 241   1              printu("Set_Feature");
C51 COMPILER V7.20   32MUSB                                                                03/21/2007 13:34:25 PAGE 5   

 242   1      } 
 243          
 244          void Set_Address(unsigned char EpNum)
 245          {
 246   1      //      unsigned char Test[] = {0};
 247   1              WriteEp(0, 0, 0);//在Status阶段过后才能改变设备地址
 248   1      
 249   1              USBADDR |= EpNum;//设置地址
 250   1              USBADDR |= FEN;//地址使能
 251   1              USBCON |= FADDEN;
 252   1      
 253   1      //      printuf("\nSet_Address : %x\n", USBADDR);
 254   1      } 
 255          
 256          void Get_Descriptor(unsigned char DesType, unsigned char nLength)
 257          {
 258   1              if (DesType == 0x01) 
 259   1              {
 260   2                      WriteEp(0, 18, Device_Descriptor);//提供设备描述符
 261   2              }
 262   1              if ((DesType == 0x02) && (nLength == 0x09))
 263   1              {
 264   2                      WriteEp(0, 9, Configuration_Descriptor_All);//提供配置描述符
 265   2              }
 266   1              //提供全部描述符
 267   1              if ((DesType == 0x02) && (nLength == 0xff)) 
 268   1              { 
 269   2                      WriteEp(0, 32, Configuration_Descriptor_All);
 270   2                      WriteEp(0, 2, &Device_Descriptor[4]);
 271   2              }
 272   1              //提供全部描述符
 273   1              if ((DesType == 0x02) && (nLength == 0x20))
 274   1              {
 275   2                      WriteEp(0, 32, Configuration_Descriptor_All);
 276   2              }
 277   1      
 278   1      //              printu("Get_Descriptor\n");
 279   1      }
 280          
 281          void Get_Configuration()
 282          {
 283   1              printu("Get_Configuration");
 284   1      }
 285          
 286          void Set_Configuration(unsigned char wValue)
 287          {
 288   1      
 289   1              if (wValue == 0) 
 290   1              {
 291   2              /* put device in unconfigured state */
 292   2                       /* Disable all endpoints but EPP0. *///init_unconfig
 293   2      
 294   2                      UEPNUM = 0x00;//Ep0 as control Endpoint
 295   2                      UEPCONX = 0x80;
 296   2              
 297   2                      UEPNUM = 0x01;//Ep1 as Bulk-in Endpoint
 298   2                      UEPCONX = 0x86;
 299   2              
 300   2                      UEPNUM = 0x02;//Ep2 as Bulk-out Endpoint
 301   2                      UEPCONX = 0x82;
 302   2      
 303   2      //              WriteEp(0, &Device_Descriptor[4], 2);
C51 COMPILER V7.20   32MUSB                                                                03/21/2007 13:34:25 PAGE 6   

 304   2                      USBCON &= (~CONFG);
 305   2                      WriteEp(0, 0, 0);//状态传送阶段之前完成指定操作
 306   2      
 307   2              }
 308   1              else if (wValue == 1) {
 309   2              /* Configure device */
 310   2                      /* Enable generic/iso endpoints. init_config*/
 311   2      
 312   2                      UEPNUM = 0x00;//Ep0 as control Endpoint
 313   2                      UEPCONX = 0x80;
 314   2              
 315   2                      UEPNUM = 0x01;//Ep1 as Bulk-in Endpoint
 316   2                      UEPCONX = 0x86;
 317   2              
 318   2                      UEPNUM = 0x02;//Ep2 as Bulk-out Endpoint
 319   2                      UEPCONX = 0x82;
 320   2      
 321   2      
 322   2                      USBCON |= CONFG;
 323   2                      WriteEp(0, 0, 0);//状态传送阶段之前完成指定操作
 324   2      
 325   2              }
 326   1      //      printu("Set_Configuration ");
 327   1      }
 328          
 329          void Get_Interface()
 330          {
 331   1              printu("Get_Interface");
 332   1      }
 333          
 334          void Set_Interface()
 335          {
 336   1              WriteEp(0, 0, 0);
 337   1              printu("Set_Interface ");
 338   1      }
 339          
 340          void Ep0Int()
 341          {
 342   1              unsigned char i, j;
 343   1              unsigned char ControlData[32] = {0, };
 344   1      
 345   1              i = ReadEp(0, ControlData);//读端点0
 346   1              P3_5 = 0;//USB通信指示灯点亮
 347   1              j = ControlData[0] & 0x60;//过滤端点0数据
 348   1              if ((j == 0) && i)
 349   1              {//如果为标准USB请求
 350   2                      switch (ControlData[1])
 351   2                      {//分别按请求类别进行处理
 352   3                              case get_status                 :       Get_Status(); break;
 353   3                              case clear_feature              :       Clear_Feature(); break;
 354   3      
 355   3                              case set_feature                :       Set_Feature(); break;
 356   3      
 357   3                              case set_address                :       Set_Address(ControlData[2]); break;
 358   3                              case get_descriptor             :       Get_Descriptor(ControlData[3], ControlData[6]); break;
 359   3      
 360   3                              case get_configuration  :       Get_Configuration(); break;
 361   3                              case set_configuration  :       Set_Configuration(ControlData[2]); break;
 362   3                              case get_interface              :       Get_Interface(); break;
 363   3                              case set_interface              :       Set_Interface(); break;
 364   3                              default                                 :       Reserved(); break;
 365   3                      }
C51 COMPILER V7.20   32MUSB                                                                03/21/2007 13:34:25 PAGE 7   

 366   2              }
 367   1              else if (ControlData[0] == 0xa1)
 368   1              {//特殊请求,特殊处理,直接返回Status
 369   2                      WriteEp(0, 0, 0);
 370   2              }
 371   1              
 372   1              P3_5 = 1;//USB通信指示灯关闭
 373   1      
 374   1      }
 375          
 376          //Bulk-In端点处理
 377          void main_txdone()
 378          {
 379   1              unsigned char i;
 380   1      
 381   1      //      printuf("Bulk_State : %x\n", bulk_state);
 382   1              P3_5 = 0;////USB通信指示灯点亮
 383   1      
 384   1              UEPSTAX &= (~(TXCMP));//清中断标志位clear TXCMP
 385   1              switch (bulk_state)
 386   1              {//按不同的传输状态,进行不同的后续处理
 387   2                      case BULK_DATA_TRANS :
 388   2                              TransDataGoOn();
 389   2                              break;
 390   2                      case BULK_DATA_END :
 391   2                              UEPNUM = 1;//指向相应端点
 392   2                              UEPSTAX |= DIR;//设置方向为写Set for status of a Control In transaction
 393   2      
 394   2                              for (i=0; i<13; i++) 
 395   2                              {
 396   3                                      UEPDATX = bulk_CSW[i];//将数据写入端点
 397   3                              }
 398   2      
 399   2                              UEPSTAX |= TXRDY;//发送数据Sending the data,this action will switch between bank0 and bank1
 400   2              
 401   2                              bulk_state = BULK_CSW_END;                                      //置传输状态。
 402   2      
 403   2                              break;
 404   2                      case BULK_REQEST_TRANS :
 405   2                              TransRequestGoOn();
 406   2                              break;
 407   2                      case BULK_CSW_END :
 408   2                              break;
 409   2                      default :       return;
 410   2              }
 411   1      
 412   1              P3_5 = 1;//USB通信指示灯关闭
 413   1      }
 414          
 415          //Bulk-Out端点处理
 416          void main_rxdone()
 417          {
 418   1      
 419   1              unsigned char nLength;
 420   1      //      printu("\nmain_rxdone ");
 421   1      //      P3_5 = 0;//USB通信指示灯点亮
 422   1              //ReadEp(2, Bulk_Out_Buf);//读取端点2
 423   1      //      ReadEp(2, BulkPoint);//读取端点2
 424   1      
 425   1      
 426   1              UEPNUM = 2;//指向相应端点
 427   1              BulkStartPoint = BulkPoint;
C51 COMPILER V7.20   32MUSB                                                                03/21/2007 13:34:25 PAGE 8   

 428   1              nLength = UBYCTX;//读取端点数据长度
 429   1      
 430   1              while (nLength--)
 431   1              {
 432   2                      *(BulkPoint++) = UEPDATX;
 433   2              }
 434   1                                              
 435   1      //      UEPSTAX &= ~(RXOUTB0 | RXOUTB1 | RXSETUP);//清中断标志
 436   1              UEPSTAX &= 0xb9;//清中断标志
 437   1      
 438   1              //printuf("%x", *BulkStartPoint);
 439   1              if ((bulk_state != BULK_DATA_RECIEVE) && (*BulkStartPoint == 0x55)) 
 440   1              {
 441   2                      InterpretCBW();//判断是否为命令数据
 442   2                      BulkPoint = BulkStartPoint;
 443   2              }
 444   1              else if (BulkPoint == Page_Buf + 512)
 445   1              {
 446   2                      Trans_Data2PC();//为普通数据时转向数据接收处理程序
 447   2              }
 448   1      //      P3_5 = 1;//USB通信指示灯关闭
 449   1      

⌨️ 快捷键说明

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