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

📄 usb.lst

📁 单片机实现MP3播放```程序简单实用
💻 LST
📖 第 1 页 / 共 4 页
字号:
 514   3                                while (!(UEPINT & 0x04));                                            //等待接收数据RXOUTB1    
 515   3                                //写64字节
 516   3                                WriteFlash();
 517   3                                UEPSTAX &= 0xB9;                                         //准备再接收         
 518   3                                UEPINT = 0;
 519   3                         }
 520   2                       K9F_FUN = COMMAND;
 521   2                       *((unsigned char xdata *)K9F5608) = 0x10;
 522   2                       K9F_FUN = D_DATA;
 523   2                       length--;                                                                //传输的扇区数减1 
 524   2                       delay();
 525   2                       while(!(K9F_FUN & RB));                                                          //等待操作的完成
 526   2      
 527   2                   if(((PG.addr[3]&0x1f)==0x1f)||(length==0))           //缓冲区写满即写满32页或传输数据结束时 
 528   2                         {
 529   3                         
 530   3                                  for(i=((PG.addr[3]&0x1f)+1);i<32;i++)                 //如果当length==0时并且(PG.addr[3]&0x1f)!=0x1f
 531   3                           {                                                                                    //拷贝从((PG.addr[3]&0x1f)+1)到32号页的数据到缓冲区的对应位置
 532   4                             K9F_FUN = COMMAND;                                                 //执行Flash的COPY-BACK命令
 533   4                                 *((unsigned char xdata *)K9F5608) = 0x00;
 534   4                                 K9F_FUN = ADDRESS;
 535   4                         *((unsigned char xdata *)K9F5608) = 0;                                                    //A0-A7  
 536   4                         *((unsigned char xdata *)K9F5608) = (PG.addr[3]&0xe0)|i;          //A9-A16
 537   4                          *((unsigned char xdata *)K9F5608) = PG.addr[2];                                  //A17-A24 
 538   4                                 K9F_FUN = D_DATA;
 539   4                                 delay();
C51 COMPILER V7.06   USB                                                                             03/21/2006 09:38:04 PAGE 8   

 540   4                                 while(!(K9F_FUN & RB));                    //等待操作的完成  
 541   4      
 542   4                                 K9F_FUN = COMMAND;
 543   4                                 *((unsigned char xdata *)K9F5608) = 0x8a;
 544   4                                 K9F_FUN = ADDRESS;
 545   4                         *((unsigned char xdata *)K9F5608) = 0;                                                     //A0-A7
 546   4                         *((unsigned char xdata *)K9F5608) = (PG.addr[3]&0x20)|BuffBlock|i; //A9-A16
 547   4                             *((unsigned char xdata *)K9F5608) = 0xff;                                          //A17-A24 
 548   4                                 K9F_FUN = D_DATA;
 549   4                                 delay();
 550   4                                 while(!(K9F_FUN & RB));                    //等待操作的完成  
 551   4                           }
 552   3                                      
 553   3                                K9F_FUN = COMMAND;
 554   3                    *((unsigned char xdata *)K9F5608) = 0x60;                          //擦除当前block
 555   3                    K9F_FUN = ADDRESS;
 556   3                    *((unsigned char xdata *)K9F5608) = PG.addr[3];        //A9-A16
 557   3                        *((unsigned char xdata *)K9F5608) = PG.addr[2];                //A17-A24 
 558   3                    K9F_FUN = COMMAND;
 559   3                    *((unsigned char xdata *)K9F5608) = 0xd0;
 560   3                    K9F_FUN = D_DATA;
 561   3                                delay();
 562   3                            while(!(K9F_FUN & RB));                                //等待操作的完成  
 563   3      
 564   3                                for(i=0;i<32;i++)                                        //将缓冲Block中的内容拷贝到当前Block中
 565   3                                  {
 566   4                                         K9F_FUN = COMMAND;
 567   4                                         *((unsigned char xdata *)K9F5608) = 0x00;
 568   4                                         K9F_FUN = ADDRESS;
 569   4                         *((unsigned char xdata *)K9F5608) = 0;                                             //A0-A7
 570   4                         *((unsigned char xdata *)K9F5608) = (PG.addr[3]&0x20)|BuffBlock|i; //A9-A16
 571   4                             *((unsigned char xdata *)K9F5608) = 0xff;                                      //A17-A24 
 572   4                                         K9F_FUN = D_DATA;
 573   4                                         delay();
 574   4                                 while(!(K9F_FUN & RB));                        //等待操作的完成 
 575   4      
 576   4                                         K9F_FUN = COMMAND;
 577   4                                         *((unsigned char xdata *)K9F5608) = 0x8a;  
 578   4                                         K9F_FUN = ADDRESS;
 579   4                         *((unsigned char xdata *)K9F5608) = 0;                                                //A0-A7
 580   4                         *((unsigned char xdata *)K9F5608) = (PG.addr[3]&0xe0)|i;      //A9-A16
 581   4                             *((unsigned char xdata *)K9F5608) = PG.addr[2];                           //A17-A24 
 582   4                                         K9F_FUN = D_DATA;
 583   4                                         delay();
 584   4                                 while(!(K9F_FUN & RB));                         //等待操作的完成 
 585   4                                  }
 586   3      
 587   3                                if(length>0)          //传输未完成时
 588   3                                  {
 589   4                                         K9F_FUN = COMMAND;
 590   4                         *((unsigned char xdata *)K9F5608) = 0x60;            //擦除相应的缓冲区
 591   4                         K9F_FUN = ADDRESS;
 592   4                         *((unsigned char xdata *)K9F5608) = (PG.addr[3]&0x20)|BuffBlock;  //A9-A16
 593   4                          *((unsigned char xdata *)K9F5608) = 0xff;                                    //A17-A24 
 594   4                         K9F_FUN = COMMAND;
 595   4                         *((unsigned char xdata *)K9F5608) = 0xD0;
 596   4                         K9F_FUN = D_DATA;
 597   4                                         delay();
 598   4                                         while(!(K9F_FUN & RB));                          //等待操作的完成 
 599   4                                      }
 600   3                         }
 601   2                        PG.page++;                                                                                            //逻辑簇地址加1
 602   2                }
 603   1      
 604   1              TransmitCSW();                                                                                              //向Host返回CSW
 605   1      //    printuf(" %x",PG.addr[0]);printuf(" %x",PG.addr[1]);printuf(" %x",PG.addr[2]);printuf(" %x\n",PG.addr[3]);
 606   1      }       
 607          
 608          void main_rxdone()
 609          {
 610   1        unsigned char data i;
 611   1        unsigned char data Buf[64];
 612   1      
 613   1        i = ReadEp(2,Buf);                                                                                            //读出端点数据
 614   1      //  if(Buf[0] == 0x55)                                                                                          //命令数据包
 615   1      //      {
 616   1               P3_5 =0;                                                                                                           //指示灯亮
 617   1               bulk_CSW[4] = Buf[4];  bulk_CSW[5] = Buf[5]; bulk_CSW[6] = Buf[6]; bulk_CSW[7] = Buf[7];
C51 COMPILER V7.06   USB                                                                             03/21/2006 09:38:04 PAGE 9   

 618   1               for(i=0;i<12;i++) bulk_CBW.CBWCB[i] = Buf[i+15];
 619   1               switch(bulk_CBW.CBWCB[0])
 620   1                      {
 621   2                              case Inquiry                         :WriteEpBulk(1,36,B_InquiryData);break;
 622   2                              case Mode_Sense                      :SCSI_Mode_Sense();              break;
 623   2                              case Read10                                  :SCSI_Read10();                  break;
 624   2                              case Read_Capacity                   :WriteEpBulk(1, sizeof(B_Read_Capacity), B_Read_Capacity);break;
 625   2                              case Read_Format_Capacities      :SCSI_Read_Format_Capacities();  break;
 626   2                              case Test_Unit_Ready         :TransmitCSW();                  break;
 627   2                              case Verify                                  :TransmitCSW();                  break;
 628   2                              case Write10                         :SCSI_Write10();                 break;
 629   2                              case Medium_Removal                  :TransmitCSW();                  break;
 630   2                      }
 631   1           P3_5 =1;                                                                                                      //指示灯灭
 632   1      //      }
 633   1      //  else
 634   1      //      SCSI_Write10();
 635   1      
 636   1      }
 637          //flash芯片复位函数
 638          void Flash_Reset(void)                                               //flash reset
 639          { 
 640   1              unsigned int data i;
 641   1              K9F_FUN = COMMAND;                     
 642   1              *((unsigned char xdata *)K9F5608) = 0xff;                        //reset command
 643   1              for (i=0; i<3000; i++) ;                                         //delay        
 644   1      }
 645          
 646          //读取一个page的内容
 647          void ReadPage(unsigned int block, unsigned int page, unsigned char *pPage)
 648          {
 649   1              int i;
 650   1              unsigned int blockPage = (block << 5) | page;
 651   1      
 652   1              K9F_FUN = COMMAND;
 653   1              *((unsigned char xdata *)K9F5608) = 0x00;
 654   1              K9F_FUN = ADDRESS;
 655   1          *((unsigned char xdata *)K9F5608) = 0;                                               //A0-A7
 656   1          *((unsigned char xdata *)K9F5608) = blockPage & 0xff;            //A9-A16
 657   1              *((unsigned char xdata *)K9F5608) = (blockPage >> 8) & 0xff; //A17-A24 
 658   1              K9F_FUN = D_DATA;
 659   1      
 660   1              i = 512;
 661   1          while(!(K9F_FUN & RB));                  //等待操作的完成
 662   1      
 663   1              while((i--)>0) 
 664   1              {
 665   2                      *pPage++ = *((unsigned char xdata *)K9F5608); 
 666   2              }
 667   1      }
 668          
 669          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1526    ----
   CONSTANT SIZE    =    184    ----
   XDATA SIZE       =   ----      13
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     25     118
   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 + -