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

📄 32musb.lst

📁 基于ateml89c51为核心处理器的mp3播放器程序。
💻 LST
📖 第 1 页 / 共 4 页
字号:
 221   2              }
 222   1      
 223   1              UEPSTAX |= TXRDY;//发送数据Sending the data,this action will switch between bank0 and bank1
 224   1              
 225   1      }
 226          
 227          void Get_Status()
 228          {
 229   1              printu("Get_Status");
 230   1      } 
 231          
 232          void Clear_Feature()
 233          {
 234   1              printu("Clear_Feature");
 235   1      }
 236          
 237          void Set_Feature()
 238          {
 239   1              printu("Set_Feature");
 240   1      } 
 241          
C51 COMPILER V7.07   32MUSB                                                                11/26/2006 21:07:28 PAGE 5   

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

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

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

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

⌨️ 快捷键说明

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