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

📄 usb.lst

📁 关于 at89c51snd1c 的海量存储mass storge的基于keil c的源代码
💻 LST
📖 第 1 页 / 共 4 页
字号:
 480   2                       while(!(K9F_FUN & RB));                                                          //等待操作的完成
 481   2      
 482   2                   if(((PG.addr[3]&0x1f)==0x1f)||(length==0))           //缓冲区写满即写满32页或传输数据结束时 
 483   2                         {
 484   3                         
 485   3                                  for(i=((PG.addr[3]&0x1f)+1);i<32;i++)                 //如果当length==0时并且(PG.addr[3]&0x1f)!=0x1f
 486   3                           {                                                                                    //拷贝从((PG.addr[3]&0x1f)+1)到32号页的数据到缓冲区的对应位置
 487   4                             K9F_FUN = COMMAND;                                                 //执行Flash的COPY-BACK命令
C51 COMPILER V7.50   USB                                                                   03/19/2006 13:41:49 PAGE 9   

 488   4                                 *((unsigned char xdata *)K9F5608) = 0x00;
 489   4                                 K9F_FUN = ADDRESS;
 490   4                         *((unsigned char xdata *)K9F5608) = 0;                                                    //A0-A7  
 491   4                         *((unsigned char xdata *)K9F5608) = (PG.addr[3]&0xe0)|i;          //A9-A16
 492   4                             *((unsigned char xdata *)K9F5608) = PG.addr[2];                               //A17-A24 
 493   4                                 K9F_FUN = D_DATA;
 494   4                                 delay();
 495   4                                 while(!(K9F_FUN & RB));                    //等待操作的完成  
 496   4      
 497   4                                 K9F_FUN = COMMAND;
 498   4                                 *((unsigned char xdata *)K9F5608) = 0x8a;
 499   4                                 K9F_FUN = ADDRESS;
 500   4                         *((unsigned char xdata *)K9F5608) = 0;                                                     //A0-A7
 501   4                         *((unsigned char xdata *)K9F5608) = (PG.addr[3]&0x20)|BuffBlock|i; //A9-A16
 502   4                             *((unsigned char xdata *)K9F5608) = 0xff;                                          //A17-A24 
 503   4                                 K9F_FUN = D_DATA;
 504   4                                 delay();
 505   4                                 while(!(K9F_FUN & RB));                    //等待操作的完成  
 506   4                           }
 507   3                                      
 508   3                                K9F_FUN = COMMAND;
 509   3                    *((unsigned char xdata *)K9F5608) = 0x60;                          //擦除当前block
 510   3                    K9F_FUN = ADDRESS;
 511   3                    *((unsigned char xdata *)K9F5608) = PG.addr[3];        //A9-A16
 512   3                        *((unsigned char xdata *)K9F5608) = PG.addr[2];                //A17-A24 
 513   3                    K9F_FUN = COMMAND;
 514   3                    *((unsigned char xdata *)K9F5608) = 0xd0;
 515   3                    K9F_FUN = D_DATA;
 516   3                                delay();
 517   3                            while(!(K9F_FUN & RB));                                //等待操作的完成  
 518   3      
 519   3                                for(i=0;i<32;i++)                                        //将缓冲Block中的内容拷贝到当前Block中
 520   3                                  {
 521   4                                         K9F_FUN = COMMAND;
 522   4                                         *((unsigned char xdata *)K9F5608) = 0x00;
 523   4                                         K9F_FUN = ADDRESS;
 524   4                         *((unsigned char xdata *)K9F5608) = 0;                                             //A0-A7
 525   4                         *((unsigned char xdata *)K9F5608) = (PG.addr[3]&0x20)|BuffBlock|i; //A9-A16
 526   4                             *((unsigned char xdata *)K9F5608) = 0xff;                                      //A17-A24 
 527   4                                         K9F_FUN = D_DATA;
 528   4                                         delay();
 529   4                                 while(!(K9F_FUN & RB));                        //等待操作的完成 
 530   4      
 531   4                                         K9F_FUN = COMMAND;
 532   4                                         *((unsigned char xdata *)K9F5608) = 0x8a;  
 533   4                                         K9F_FUN = ADDRESS;
 534   4                         *((unsigned char xdata *)K9F5608) = 0;                                                //A0-A7
 535   4                         *((unsigned char xdata *)K9F5608) = (PG.addr[3]&0xe0)|i;      //A9-A16
 536   4                             *((unsigned char xdata *)K9F5608) = PG.addr[2];                           //A17-A24 
 537   4                                         K9F_FUN = D_DATA;
 538   4                                         delay();
 539   4                                 while(!(K9F_FUN & RB));                         //等待操作的完成 
 540   4                                  }
 541   3      
 542   3                                if(length>0)          //传输未完成时
 543   3                                  {
 544   4                                         K9F_FUN = COMMAND;
 545   4                         *((unsigned char xdata *)K9F5608) = 0x60;            //擦除相应的缓冲区
 546   4                         K9F_FUN = ADDRESS;
 547   4                         *((unsigned char xdata *)K9F5608) = (PG.addr[3]&0x20)|BuffBlock;  //A9-A16
 548   4                             *((unsigned char xdata *)K9F5608) = 0xff;                                         //A17-A24 
 549   4                         K9F_FUN = COMMAND;
C51 COMPILER V7.50   USB                                                                   03/19/2006 13:41:49 PAGE 10  

 550   4                         *((unsigned char xdata *)K9F5608) = 0xD0;
 551   4                         K9F_FUN = D_DATA;
 552   4                                         delay();
 553   4                                         while(!(K9F_FUN & RB));                          //等待操作的完成 
 554   4                                      }
 555   3                         }
 556   2                        PG.page++;                                                                                            //逻辑簇地址加1
 557   2                }
 558   1      
 559   1              TransmitCSW();                                                                                              //向Host返回CSW
 560   1      //    printuf(" %x",PG.addr[0]);printuf(" %x",PG.addr[1]);printuf(" %x",PG.addr[2]);printuf(" %x\n",PG.add
             -r[3]);
 561   1      }
 562          
 563          void main_rxdone()
 564          {
 565   1        unsigned char data i;
 566   1        unsigned char data Buf[64];
 567   1      
 568   1        i = ReadEp(2,Buf);                                                                                            //读出端点数据
 569   1      //  if(Buf[0] == 0x55)                                                                                          //命令数据包
 570   1      //      {
 571   1               P3_5 =0;                                                                                                           //指示灯亮
 572   1               bulk_CSW[4] = Buf[4];  bulk_CSW[5] = Buf[5]; bulk_CSW[6] = Buf[6]; bulk_CSW[7] = Buf[7];
 573   1               for(i=0;i<12;i++) bulk_CBW.CBWCB[i] = Buf[i+15];
 574   1               switch(bulk_CBW.CBWCB[0])
 575   1                      {
 576   2                              case Inquiry                         :WriteEpBulk(1,36,B_InquiryData);break;
 577   2                              case Mode_Sense                      :SCSI_Mode_Sense();              break;
 578   2                              case Read10                                  :SCSI_Read10();                  break;
 579   2                              case Read_Capacity                   :WriteEpBulk(1, sizeof(B_Read_Capacity), B_Read_Capacity);break;
 580   2                              case Read_Format_Capacities      :SCSI_Read_Format_Capacities();  break;
 581   2                              case Test_Unit_Ready         :TransmitCSW();                  break;
 582   2                              case Verify                                  :TransmitCSW();                  break;
 583   2      //                      case Write10                         :SCSI_Write10();                 break;
 584   2                              case Medium_Removal                  :TransmitCSW();                  break;
 585   2                      }
 586   1           P3_5 =1;                                                                                                      //指示灯灭
 587   1      //      }
 588   1      //  else
 589   1      //      SCSI_Write10();
 590   1      
 591   1      }
 592          //flash芯片复位函数
 593          void Flash_Reset(void)                                               //flash reset
 594          { 
 595   1              unsigned int data i;
 596   1              K9F_FUN = COMMAND;                     
 597   1              *((unsigned char xdata *)K9F5608) = 0xff;                        //reset command
 598   1              for (i=0; i<3000; i++) ;                                         //delay        
 599   1      }
 600          
 601          //读取一个page的内容
 602          void ReadPage(unsigned int block, unsigned int page, unsigned char *pPage)
 603          {
 604   1              int i;
 605   1              unsigned int blockPage = (block << 5) | page;
 606   1      
 607   1              K9F_FUN = COMMAND;
 608   1              *((unsigned char xdata *)K9F5608) = 0x00;
 609   1              K9F_FUN = ADDRESS;
 610   1          *((unsigned char xdata *)K9F5608) = 0;                                               //A0-A7
C51 COMPILER V7.50   USB                                                                   03/19/2006 13:41:49 PAGE 11  

 611   1          *((unsigned char xdata *)K9F5608) = blockPage & 0xff;            //A9-A16
 612   1              *((unsigned char xdata *)K9F5608) = (blockPage >> 8) & 0xff; //A17-A24 
 613   1              K9F_FUN = D_DATA;
 614   1      
 615   1              i = 512;
 616   1          while(!(K9F_FUN & RB));                  //等待操作的完成
 617   1      
 618   1              while((i--)>0) 
 619   1              {
 620   2                      *pPage++ = *((unsigned char xdata *)K9F5608); 
 621   2              }
 622   1      }


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1514    ----
   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 + -