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

📄 usb.lst

📁 MP3播放器和U盘功能的源代码。采用集成了MP3解码芯片和USB接口芯片的AT89C51SND1C单片机
💻 LST
📖 第 1 页 / 共 3 页
字号:
 341          
 342          void SCSI_Read10()
 343          {
 344   1        unsigned char data i;
 345   1              union
 346   1              {
 347   1                      unsigned long   Block;
 348   1                      unsigned char   Addr[4];
 349   1              }data BLK;
 350   1          unsigned char length;                                                                       //传输的簇数
 351   1      //将起始地址变换为K9F5608适合的模式;  
 352   1      //    BLK.Addr[0] = bulk_CBW.CBWCB[2];
 353   1      //      BLK.Addr[1] = bulk_CBW.CBWCB[3];
 354   1              BLK.Addr[2] = bulk_CBW.CBWCB[4];
 355   1              BLK.Addr[3] = bulk_CBW.CBWCB[5];
 356   1      
 357   1      //将扇区数填入计数变量每循环一次读出一扇区的值;   
 358   1      //    PG.Addr[0]        =       bulk_CBW.CBWCB[7];
 359   1      //      PG.Addr[1]      =       bulk_CBW.CBWCB[8];
 360   1          length = bulk_CBW.CBWCB[8];
 361   1          while(length>0)
 362   1           {
 363   2      
 364   2                K9F_FUN = COMMAND;                                        //读出一个page
C51 COMPILER V7.50   USB                                                                   02/08/2007 11:18:10 PAGE 7   

 365   2                *((unsigned char xdata *)K9F5608) = 0x00;
 366   2                K9F_FUN = ADDRESS;
 367   2                *((unsigned char xdata *)K9F5608) = 0;                                //A0-A7 
 368   2                *((unsigned char xdata *)K9F5608) = BLK.Addr[3];      //A9-A16
 369   2                *((unsigned char xdata *)K9F5608) = BLK.Addr[2];      //A17-A24
 370   2      
 371   2                K9F_FUN = D_DATA;
 372   2                UEPNUM=0x01;                                                                                  //指向端点
 373   2                UEPSTAX|=DIR;                                                                                 //传输方向
 374   2                while(!(K9F_FUN & RB));
 375   2      
 376   2                for(i=0;i<8;i++)                                              //读出512个字节的数据发送到usb     
 377   2                {
 378   3                        ReadFlash();
 379   3                        UEPSTAX|=TXRDY;
 380   3                        while(!(UEPSTAX&TXCMP));                                  //等待发送完成   
 381   3                        UEPSTAX&=(~(TXCMP));                                  //清中断标志clear TXCMP
 382   3                        UEPINT=0;
 383   3                }
 384   2                *((unsigned char xdata *)K9F5608) = INACTIVE;
 385   2      
 386   2                length--;                                                                         //传输的簇数减1
 387   2                BLK.Block ++;                                                                 //flash的页地址加1
 388   2           }
 389   1        TransmitCSW();                                                                        //返回CSW
 390   1      }
 391          
 392          void delay()                                                                                        //延时20us
 393          {
 394   1        unsigned char data i=10;
 395   1        while(i-->0);
 396   1      }
 397          
 398          #define BuffBlock (0xc0)          //缓冲区为从偶数块开始的连续两个Block 这里定为2046和2047两个Block
 399                                                                    //BuffBlock只代表块号的低字节
 400          void SCSI_Write10()                       //之所以选用两个Block作为缓冲区,与Flash的Copy - Back功能的特性相关,
 401          {                                                         //清仔细阅读Flash 的datasheet
 402   1         unsigned char Page_Buf[512];
 403   1         unsigned int j;
 404   1          union
 405   1           {
 406   1                 unsigned long page;
 407   1                 unsigned char addr[4];
 408   1           }data PG; 
 409   1      
 410   1          unsigned char data i=0,length=0,nBeginPage=0;
 411   1      
 412   1              //所有写入都要缓冲,所以先清除缓冲区     
 413   1          K9F_FUN = COMMAND;
 414   1          *((unsigned char xdata *)K9F5608) = 0x60;                            //擦除第2046个Block作为缓冲区
 415   1          K9F_FUN = ADDRESS;
 416   1          *((unsigned char xdata *)K9F5608) = BuffBlock;               //A9-A16  
 417   1              *((unsigned char xdata *)K9F5608) = 0xff;                                //A17-A24      
 418   1          K9F_FUN = COMMAND;                                            
 419   1          *((unsigned char xdata *)K9F5608) = 0xd0;
 420   1          K9F_FUN = D_DATA;
 421   1              delay();
 422   1      //  printuf(" %x",PG.addr[0]);printuf(" %x",PG.addr[1]);printuf(" %x",PG.addr[2]);printuf(" %x",PG.addr[3]
             -);
 423   1      //      printuf(" %x",length); printuf(" %x",nBeginPage);
 424   1          while(!(K9F_FUN & RB));                                  //等待擦除操作的完成 
 425   1              
C51 COMPILER V7.50   USB                                                                   02/08/2007 11:18:10 PAGE 8   

 426   1              K9F_FUN = COMMAND;
 427   1          *((unsigned char xdata *)K9F5608) = 0x60;                            //擦除第2047个Block作为缓冲区
 428   1          K9F_FUN = ADDRESS;
 429   1          *((unsigned char xdata *)K9F5608) = BuffBlock|0x20;          //A9-A16  
 430   1              *((unsigned char xdata *)K9F5608) = 0xff;                                //A17-A24      
 431   1          K9F_FUN = COMMAND;                                            
 432   1          *((unsigned char xdata *)K9F5608) = 0xd0;
 433   1          K9F_FUN = D_DATA;   
 434   1          delay();
 435   1          while(!(K9F_FUN & RB));  
 436   1              //从SCSI命令中分离出逻辑地址
 437   1      //      PG.addr[0] = bulk_CBW.CBWCB[2];
 438   1      //      PG.addr[1] = bulk_CBW.CBWCB[3];
 439   1              PG.addr[2] = bulk_CBW.CBWCB[4];   //PG为前面定义的结构体
 440   1              PG.addr[3] = bulk_CBW.CBWCB[5];
 441   1      
 442   1              length = bulk_CBW.CBWCB[8];               //windows 系统每次写入的最大长度为0x80个扇区取一字节已够用
 443   1              nBeginPage = PG.addr[3]&0x1f;     //计算出要写入块内的要写入的起始扇区号
 444   1              UEPNUM = 0x02;                                    //指向Bulk端点2
 445   1              delay();
 446   1              while(!(K9F_FUN & RB));           //等待擦除操作的完成 
 447   1      
 448   1          if(nBeginPage>0)                          //如果起始写入page与flash的Block未对齐,则将当前Block中的前nBeginPage页
 449   1                {                                                           //拷贝到缓冲区的相同位置   
 450   2                   for(i=0;i<nBeginPage;i++)
 451   2                         {
 452   3      /*COPY BACK命令  001*************************
 453   3                                K9F_FUN = COMMAND;
 454   3                                *((unsigned char xdata *)K9F5608) = 0x00;               //命令的第一个字节
 455   3                                K9F_FUN = ADDRESS;
 456   3                    *((unsigned char xdata *)K9F5608) = 0;                                     //A0-A7
 457   3                    *((unsigned char xdata *)K9F5608) = (PG.addr[3]&0xe0)|i;   //A9-A16
 458   3                        *((unsigned char xdata *)K9F5608) = PG.addr[2];                        //A17-A24 
 459   3                                K9F_FUN = D_DATA;
 460   3                    delay();
 461   3                            while(!(K9F_FUN & RB));                         //等待操作的完成
 462   3      
 463   3                                K9F_FUN = COMMAND;
 464   3                                *((unsigned char xdata *)K9F5608) = 0x8a;               //命令的第二个字节
 465   3                                K9F_FUN = ADDRESS;
 466   3                    *((unsigned char xdata *)K9F5608) = 0;                                              //A0-A7
 467   3                    *((unsigned char xdata *)K9F5608) = BuffBlock|(PG.addr[3]&0x20)|i;  //A9-A16
 468   3                        *((unsigned char xdata *)K9F5608) = 0xff;                                       //A17-A24 
 469   3                                K9F_FUN = D_DATA;
 470   3                                delay();
 471   3                            while(!(K9F_FUN & RB));                          //等待操作的完成  
 472   3      END OF COPY BACK命令  001**************************/
 473   3      //void ReadPage(unsigned int block, unsigned int page, unsigned char *pPage)
 474   3                    
 475   3                        //unsigned int blockPage = (block << 5) | page;
 476   3                    K9F_FUN = COMMAND;
 477   3                        *((unsigned char xdata *)K9F5608) = 0x00;
 478   3                        K9F_FUN = ADDRESS;
 479   3                    *((unsigned char xdata *)K9F5608) = 0;                                             //A0-A7
 480   3                    *((unsigned char xdata *)K9F5608) = (PG.addr[3]&0xe0)|i;       //A9-A16
 481   3                        *((unsigned char xdata *)K9F5608) = PG.addr[2];                //A17-A24 
 482   3                        K9F_FUN = D_DATA;
 483   3      
 484   3                       
 485   3                    while(!(K9F_FUN & RB));                  //等待操作的完成
 486   3      
 487   3                        for(j=0;j<512;j++) 
C51 COMPILER V7.50   USB                                                                   02/08/2007 11:18:10 PAGE 9   

 488   3                        {
 489   4                               Page_Buf[j]= *((unsigned char xdata *)K9F5608); 
 490   4                        }
 491   3      //int WritePage(unsigned int block, unsigned int page, unsigned char *pPage)  
 492   3      //{
 493   3                       //j = 512;
 494   3                        //unsigned int blockPage = (block << 5) + page;
 495   3      
 496   3                        K9F_FUN = COMMAND;
 497   3                        *((unsigned char xdata *)K9F5608) = 0x80;
 498   3                        K9F_FUN = ADDRESS;
 499   3                        *((unsigned char xdata *)K9F5608)  = 0;
 500   3                        *((unsigned char xdata *)K9F5608)  = BuffBlock|(PG.addr[3]&0x20)|i;
 501   3                        *((unsigned char xdata *)K9F5608)  =0xff;
 502   3                    K9F_FUN = D_DATA;
 503   3      
 504   3                        for(j=0;j<512;j++)
 505   3                       {
 506   4                              *((unsigned char xdata *)K9F5608)= Page_Buf[j];
 507   4                       }         
 508   3      
 509   3                       K9F_FUN = COMMAND;
 510   3                       *((unsigned char xdata *)K9F5608) = 0x10;
 511   3                   delay();
 512   3                       while(!(K9F_FUN & RB));                  //等待操作的完

⌨️ 快捷键说明

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