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

📄 usb.lst

📁 关于 at89c51snd1c 的海量存储mass storge的基于keil c的源代码
💻 LST
📖 第 1 页 / 共 4 页
字号:
 317   1        else {WriteEpBulk(1, sizeof(B_Mode_Sense_ZERO), B_Mode_Sense_ZERO);}
 318   1      }
 319          
 320          void SCSI_Read_Format_Capacities()
 321          {
 322   1        if(bulk_CBW.CBWCB[7]==0 && bulk_CBW.CBWCB[8]==0)return;
 323   1        WriteEpBulk(1, sizeof(B_Read_Format_capacities), B_Read_Format_capacities);
 324   1      }
 325          
 326          extern void ReadFlash();
 327          extern void WriteFlash();
 328          
 329          void SCSI_Read10()
 330          {
 331   1        unsigned char data i;
 332   1              union
 333   1              {
 334   1                      unsigned long   Block;
 335   1                      unsigned char   Addr[4];
 336   1              }data BLK;
 337   1          unsigned char length;                                                                       //传输的簇数
 338   1      //将起始地址变换为K9F5608适合的模式;  
 339   1      //    BLK.Addr[0] = bulk_CBW.CBWCB[2];
 340   1      //      BLK.Addr[1] = bulk_CBW.CBWCB[3];
 341   1              BLK.Addr[2] = bulk_CBW.CBWCB[4];
 342   1              BLK.Addr[3] = bulk_CBW.CBWCB[5];
 343   1      
 344   1      //将扇区数填入计数变量每循环一次读出一扇区的值;   
 345   1      //    PG.Addr[0]        =       bulk_CBW.CBWCB[7];
 346   1      //      PG.Addr[1]      =       bulk_CBW.CBWCB[8];
 347   1          length = bulk_CBW.CBWCB[8];
 348   1          while(length>0)
 349   1           {
 350   2      
 351   2                K9F_FUN = COMMAND;                                        //读出一个page
 352   2                *((unsigned char xdata *)K9F5608) = 0x00;
 353   2                K9F_FUN = ADDRESS;
 354   2                *((unsigned char xdata *)K9F5608) = 0;                                //A0-A7 
 355   2                *((unsigned char xdata *)K9F5608) = BLK.Addr[3];      //A9-A16
 356   2                *((unsigned char xdata *)K9F5608) = BLK.Addr[2];      //A17-A24
 357   2      
 358   2                K9F_FUN = D_DATA;
 359   2                UEPNUM=0x01;                                                                                  //指向端点
 360   2                UEPSTAX|=DIR;                                                                                 //传输方向
 361   2                while(!(K9F_FUN & RB));
 362   2      
 363   2                for(i=0;i<8;i++)                                              //读出512个字节的数据发送到usb     
 364   2                {
C51 COMPILER V7.50   USB                                                                   03/19/2006 13:41:49 PAGE 7   

 365   3                        ReadFlash();
 366   3                        UEPSTAX|=TXRDY;
 367   3                        while(!(UEPSTAX&TXCMP));                                  //等待发送完成   
 368   3                        UEPSTAX&=(~(TXCMP));                                  //清中断标志clear TXCMP
 369   3                        UEPINT=0;
 370   3                }
 371   2                *((unsigned char xdata *)K9F5608) = INACTIVE;
 372   2      
 373   2                length--;                                                                         //传输的簇数减1
 374   2                BLK.Block ++;                                                                 //flash的页地址加1
 375   2           }
 376   1        TransmitCSW();                                                                        //返回CSW
 377   1      }
 378          
 379          void delay()                                                                                        //延时20us
 380          {
 381   1        unsigned char data i=20;
 382   1        while(i-->0);
 383   1      }
 384          
 385          #define BuffBlock (0xc0)          //缓冲区为从偶数块开始的连续两个Block 这里定为2046和2047两个Block
 386                                                                    //BuffBlock只代表块号的低字节
 387          void SCSI_Write10()                       //之所以选用两个Block作为缓冲区,与Flash的Copy - Back功能的特性相关,
 388          {                                                         //清仔细阅读Flash 的datasheet
 389   1          union
 390   1           {
 391   1                 unsigned long page;
 392   1                 unsigned char addr[4];
 393   1           }data PG; 
 394   1      
 395   1          unsigned char data i=0,length=0,nBeginPage=0;
 396   1      
 397   1              //所有写入都要缓冲,所以先清除缓冲区     
 398   1          K9F_FUN = COMMAND;
 399   1          *((unsigned char xdata *)K9F5608) = 0x60;                            //擦除第2046个Block作为缓冲区
 400   1          K9F_FUN = ADDRESS;
 401   1          *((unsigned char xdata *)K9F5608) = BuffBlock;               //A9-A16  
 402   1              *((unsigned char xdata *)K9F5608) = 0xff;                                //A17-A24      
 403   1          K9F_FUN = COMMAND;                                            
 404   1          *((unsigned char xdata *)K9F5608) = 0xd0;
 405   1          K9F_FUN = D_DATA;
 406   1              delay();
 407   1      //    printuf(" %x",PG.addr[0]);printuf(" %x",PG.addr[1]);printuf(" %x",PG.addr[2]);printuf(" %x",PG.addr[
             -3]);
 408   1      //      printuf(" %x",length); printuf(" %x",nBeginPage);
 409   1          while(!(K9F_FUN & RB));                                  //等待擦除操作的完成 
 410   1              
 411   1              K9F_FUN = COMMAND;
 412   1          *((unsigned char xdata *)K9F5608) = 0x60;                            //擦除第2047个Block作为缓冲区
 413   1          K9F_FUN = ADDRESS;
 414   1          *((unsigned char xdata *)K9F5608) = BuffBlock|0x20;          //A9-A16  
 415   1              *((unsigned char xdata *)K9F5608) = 0xff;                                //A17-A24      
 416   1          K9F_FUN = COMMAND;                                            
 417   1          *((unsigned char xdata *)K9F5608) = 0xd0;
 418   1          K9F_FUN = D_DATA;   
 419   1              //从SCSI命令中分离出逻辑地址
 420   1      //      PG.addr[0] = bulk_CBW.CBWCB[2];
 421   1      //      PG.addr[1] = bulk_CBW.CBWCB[3];
 422   1              PG.addr[2] = bulk_CBW.CBWCB[4];
 423   1              PG.addr[3] = bulk_CBW.CBWCB[5];
 424   1      
 425   1              length = bulk_CBW.CBWCB[8];               //windows 系统每次写入的最大长度为0x80个扇区取一字节已够用
C51 COMPILER V7.50   USB                                                                   03/19/2006 13:41:49 PAGE 8   

 426   1              nBeginPage = PG.addr[3]&0x1f;     //计算出要写入块内的要写入的起始扇区号
 427   1              UEPNUM = 0x02;                                    //指向Bulk端点2
 428   1              delay();
 429   1              while(!(K9F_FUN & RB));           //等待擦除操作的完成 
 430   1      
 431   1          if(nBeginPage>0)                          //如果起始写入page与flash的Block未对齐,则将当前Block中的前nBeginPage页
 432   1                {                                                           //拷贝到缓冲区的相同位置   
 433   2                   for(i=0;i<nBeginPage;i++)
 434   2                         { 
 435   3                                K9F_FUN = COMMAND;
 436   3                                *((unsigned char xdata *)K9F5608) = 0x00;               //命令的第一个字节
 437   3                                K9F_FUN = ADDRESS;
 438   3                    *((unsigned char xdata *)K9F5608) = 0;                                     //A0-A7
 439   3                    *((unsigned char xdata *)K9F5608) = (PG.addr[3]&0xe0)|i;   //A9-A16
 440   3                        *((unsigned char xdata *)K9F5608) = PG.addr[2];                        //A17-A24 
 441   3                                K9F_FUN = D_DATA;
 442   3                    delay();
 443   3                            while(!(K9F_FUN & RB));                         //等待操作的完成
 444   3      
 445   3                                K9F_FUN = COMMAND;
 446   3                                *((unsigned char xdata *)K9F5608) = 0x8a;               //命令的第二个字节
 447   3                                K9F_FUN = ADDRESS;
 448   3                    *((unsigned char xdata *)K9F5608) = 0;                                              //A0-A7
 449   3                    *((unsigned char xdata *)K9F5608) = BuffBlock|(PG.addr[3]&0x20)|i;  //A9-A16
 450   3                        *((unsigned char xdata *)K9F5608) = 0xff;                                       //A17-A24 
 451   3                                K9F_FUN = D_DATA;
 452   3                                delay();
 453   3                            while(!(K9F_FUN & RB));                          //等待操作的完成  
 454   3                         }
 455   2                       nBeginPage=0;                                             //起始扇区值赋为0
 456   2                }
 457   1      
 458   1              while(length>0)                                                    //传输的扇区数大于0
 459   1                {
 460   2                       K9F_FUN = COMMAND;                                                        //数据写入到缓冲区的对应位置
 461   2                   *((unsigned char xdata *)K9F5608) = 0x80;
 462   2                   K9F_FUN = ADDRESS;
 463   2                   *((unsigned char xdata *)K9F5608) = 0;                                                       //A0-A7        
 464   2                       *((unsigned char xdata *)K9F5608) = (PG.addr[3]&0x3f)|BuffBlock; //A9-A16  
 465   2                       *((unsigned char xdata *)K9F5608) = 0xff;                                                //A17-A24
 466   2                       K9F_FUN = D_DATA;
 467   2                       for(i=0;i<8;i++)                                                                  //端点数据写入到Flash的缓冲区
 468   2                         {
 469   3                                while (!(UEPINT & 0x04));                                            //等待接收数据RXOUTB1    
 470   3                                //写64字节
 471   3                                WriteFlash();
 472   3                                UEPSTAX &= 0xB9;                                         //准备再接收         
 473   3                                UEPINT = 0;
 474   3                         }
 475   2                       K9F_FUN = COMMAND;
 476   2                       *((unsigned char xdata *)K9F5608) = 0x10;
 477   2                       K9F_FUN = D_DATA;
 478   2                       length--;                                                                //传输的扇区数减1 
 479   2                       delay();

⌨️ 快捷键说明

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