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

📄 usb_disk.lst

📁 基于atmel单片机的MP3设计。音质很好
💻 LST
📖 第 1 页 / 共 3 页
字号:
 183   1                      WriteEp(0,18,Device_Descriptor);
 184   1      
 185   1              if((DesType==0x02)&&(nLength==0x09))
 186   1                      WriteEp(0,9,Configuration_Descriptor_All);
 187   1      
 188   1              if((DesType==0x02)&&(nLength==0xff))
 189   1              {
 190   2                  WriteEp(0,32,Configuration_Descriptor_All);
 191   2                  WriteEp(0,2,&Device_Descriptor[4]);
 192   2              }
 193   1      
 194   1              if((DesType==0x02)&&(nLength==0x20)) 
 195   1                      WriteEp(0,32,Configuration_Descriptor_All);
 196   1      }
 197          
 198          void Set_Configuration(unsigned char wValue)
 199          {
 200   1        if(wValue == 0)
 201   1        {
 202   2                      UEPNUM=0x00;    UEPCONX=0x80;
 203   2                      UEPNUM=0x01;    UEPCONX=0x86;
 204   2                      UEPNUM=0x02;    UEPCONX=0x82;
 205   2                      USBCON&=(~CONFG);
 206   2                      WriteEp(0,0,0); 
 207   2        }
 208   1        else if(wValue == 1) 
 209   1        {
 210   2                      UEPNUM=0x00;    UEPCONX=0x80;
 211   2                      UEPNUM=0x01;    UEPCONX=0x86;
 212   2                      UEPNUM=0x02;    UEPCONX=0x82;
 213   2                      USBCON|=CONFG;
 214   2                      WriteEp(0,0,0); 
 215   2        }
 216   1      }
 217          
 218          void Ep0()
 219          {
 220   1        unsigned char data DT[32]={0,};
 221   1        unsigned char data i;
 222   1        i = ReadEp(0,DT);
 223   1        if (((DT[0] & 0x60)==0) && i)
 224   1        {
 225   2          switch (DT[1])
 226   2          {
 227   3            case set_address                          :Set_Address(DT[2]);                    break;
 228   3            case get_descriptor                       :Get_Descriptor(DT[3],DT[6]);   break;
 229   3            case set_configuration        :Set_Configuration(DT[2]);          break;
 230   3            default                                           :;                                                  break;
 231   3              }
 232   2        }
 233   1        else if(DT[0]==0xa1)
 234   1              {
 235   2                      WriteEp(0,0,0);
 236   2              }                                                                                                       
 237   1      }
 238          
 239          
 240          void WriteEpBulk(unsigned char EpNum,unsigned char nLength,unsigned char *Data)
C51 COMPILER V8.08   USB_DISK                                                              05/19/2008 19:51:06 PAGE 5   

 241          {
 242   1              unsigned char data i;
 243   1              UEPNUM=EpNum;
 244   1              UEPSTAX|=DIR;
 245   1              for(i=0;i<nLength;i++) UEPDATX=Data[i];
 246   1              UEPSTAX|=TXRDY;
 247   1      }
 248          
 249          void TransmitCSW()
 250          {
 251   1        WriteEpBulk(1, sizeof(bulk_CSW), bulk_CSW);
 252   1        while(!(UEPSTAX&TXCMP)) ;
 253   1        UEPSTAX&=(~(TXCMP));
 254   1      }
 255          
 256          void main_txdone()
 257          {
 258   1        UEPSTAX&=(~(TXCMP));
 259   1        TransmitCSW();
 260   1      }
 261          
 262           void SCSI_Mode_Sense()
 263          {
 264   1        if(bulk_CBW.CBWCB[2] == SCSI_MSPGCD_TPP)                 //Page Code=Timer and Potect Page
 265   1          {WriteEpBulk(1, sizeof(B_Mode_Sense_TPP), B_Mode_Sense_TPP);}
 266   1        else if(bulk_CBW.CBWCB[2] == SCSI_MSPGCD_RETALL)                 //Page Code=All
 267   1          {WriteEpBulk(1, sizeof(B_Mode_Sense_ALL), B_Mode_Sense_ALL);}
 268   1        else {WriteEpBulk(1, sizeof(B_Mode_Sense_ZERO), B_Mode_Sense_ZERO);}
 269   1      }
 270          
 271          void SCSI_Read_Format_Capacities()
 272          {
 273   1        if(bulk_CBW.CBWCB[7]==0 && bulk_CBW.CBWCB[8]==0)return;
 274   1        WriteEpBulk(1, sizeof(B_Read_Format_capacities), B_Read_Format_capacities);
 275   1      }
 276          
 277          void SCSI_Read10()
 278          {
 279   1        unsigned char data i;
 280   1              union
 281   1              {
 282   1                      unsigned long   Block;
 283   1                      unsigned char   Addr[4];
 284   1              }data BLK;
 285   1          unsigned char length;
 286   1      
 287   1              BLK.Addr[2] = bulk_CBW.CBWCB[4];
 288   1              BLK.Addr[3] = bulk_CBW.CBWCB[5];
 289   1      
 290   1          length = bulk_CBW.CBWCB[8];
 291   1          while(length>0)
 292   1           {
 293   2      
 294   2                K9F_FUN = COMMAND;
 295   2                K9F5608 = 0x00;
 296   2                K9F_FUN = ADDRESS;
 297   2                K9F5608 = 0;
 298   2                K9F5608 = BLK.Addr[3];
 299   2                K9F5608 = BLK.Addr[2];
 300   2      
 301   2                K9F_FUN = D_DATA;
 302   2                UEPNUM=0x01;
C51 COMPILER V8.08   USB_DISK                                                              05/19/2008 19:51:06 PAGE 6   

 303   2                UEPSTAX|=DIR;
 304   2                while(!(K9F_FUN & RB));
 305   2      
 306   2                for(i=0;i<8;i++)
 307   2                {
 308   3                        ReadFlash();
 309   3                        UEPSTAX|=TXRDY;
 310   3                        while(!(UEPSTAX&TXCMP));
 311   3                        UEPSTAX&=(~(TXCMP));
 312   3                }
 313   2                K9F5608 = INACTIVE;
 314   2      
 315   2                length--;     
 316   2                BLK.Block ++;
 317   2           }
 318   1        TransmitCSW();
 319   1      }
 320          
 321          void delay()
 322          {
 323   1        unsigned char data i=20;
 324   1        while(i-->0);
 325   1      }
 326          
 327          void SCSI_Write10()     
 328          {
 329   1          union
 330   1           {
 331   1                 unsigned long page;
 332   1                 unsigned char addr[4];
 333   1           }data PG; 
 334   1      
 335   1          unsigned char data i=0,length=0,nBeginPage=0;
 336   1      
 337   1       
 338   1          K9F_FUN = COMMAND;
 339   1          K9F5608 = 0x60;
 340   1          K9F_FUN = ADDRESS;
 341   1          K9F5608 = BuffBlock;
 342   1              K9F5608 = 0xff;
 343   1          K9F_FUN = COMMAND;                                            
 344   1          K9F5608 = 0xd0;
 345   1          K9F_FUN = D_DATA;
 346   1              delay();
 347   1      
 348   1          while(!(K9F_FUN & RB));
 349   1              
 350   1              K9F_FUN = COMMAND;
 351   1          K9F5608 = 0x60;
 352   1          K9F_FUN = ADDRESS;
 353   1          K9F5608 = BuffBlock|0x20;   
 354   1              K9F5608 = 0xff;
 355   1          K9F_FUN = COMMAND;                                            
 356   1          K9F5608 = 0xd0;
 357   1          K9F_FUN = D_DATA;   
 358   1      
 359   1              PG.addr[2] = bulk_CBW.CBWCB[4];
 360   1              PG.addr[3] = bulk_CBW.CBWCB[5];
 361   1      
 362   1              length = bulk_CBW.CBWCB[8];     
 363   1              nBeginPage = PG.addr[3]&0x1f;
 364   1              UEPNUM = 0x02;  
C51 COMPILER V8.08   USB_DISK                                                              05/19/2008 19:51:06 PAGE 7   

 365   1              delay();
 366   1              while(!(K9F_FUN & RB)); 
 367   1      
 368   1          if(nBeginPage>0)
 369   1                {
 370   2                   for(i=0;i<nBeginPage;i++)
 371   2                         { 
 372   3                                K9F_FUN = COMMAND;
 373   3                                K9F5608 = 0x00;
 374   3                                K9F_FUN = ADDRESS;

⌨️ 快捷键说明

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