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

📄 usb_disk.lst

📁 基于at89c51单片机的mp3 U盘原理实验代码
💻 LST
📖 第 1 页 / 共 3 页
字号:
 175          {
 176   1              if(DesType==0x01)
 177   1                      WriteEp(0,18,Device_Descriptor);
 178   1      
C51 COMPILER V7.50   USB_DISK                                                              01/15/2006 18:40:26 PAGE 4   

 179   1              if((DesType==0x02)&&(nLength==0x09))
 180   1                      WriteEp(0,9,Configuration_Descriptor_All);
 181   1      
 182   1              if((DesType==0x02)&&(nLength==0xff))
 183   1              {
 184   2                  WriteEp(0,32,Configuration_Descriptor_All);
 185   2                  WriteEp(0,2,&Device_Descriptor[4]);
 186   2              }
 187   1      
 188   1              if((DesType==0x02)&&(nLength==0x20)) 
 189   1                      WriteEp(0,32,Configuration_Descriptor_All);
 190   1      }
 191          
 192          void Set_Configuration(unsigned char wValue)
 193          {
 194   1        if(wValue == 0)
 195   1        {
 196   2                      UEPNUM=0x00;    UEPCONX=0x80;
 197   2                      UEPNUM=0x01;    UEPCONX=0x86;
 198   2                      UEPNUM=0x02;    UEPCONX=0x82;
 199   2                      USBCON&=(~CONFG);
 200   2                      WriteEp(0,0,0); 
 201   2        }
 202   1        else if(wValue == 1) 
 203   1        {
 204   2                      UEPNUM=0x00;    UEPCONX=0x80;
 205   2                      UEPNUM=0x01;    UEPCONX=0x86;
 206   2                      UEPNUM=0x02;    UEPCONX=0x82;
 207   2                      USBCON|=CONFG;
 208   2                      WriteEp(0,0,0); 
 209   2        }
 210   1      }
 211          
 212          void Ep0()
 213          {
 214   1        unsigned char data DT[32]={0,};
 215   1        unsigned char data i;
 216   1        i = ReadEp(0,DT);
 217   1        if (((DT[0] & 0x60)==0) && i)
 218   1        {
 219   2          switch (DT[1])
 220   2          {
 221   3            case set_address                          :Set_Address(DT[2]);                    break;
 222   3            case get_descriptor                       :Get_Descriptor(DT[3],DT[6]);   break;
 223   3            case set_configuration        :Set_Configuration(DT[2]);          break;
 224   3            default                                           :;                                                  break;
 225   3              }
 226   2        }
 227   1        else if(DT[0]==0xa1)
 228   1              {
 229   2                      WriteEp(0,0,0);
 230   2              }                                                                                                       
 231   1      }
 232          
 233          
 234          void WriteEpBulk(unsigned char EpNum,unsigned char nLength,unsigned char *Data)
 235          {
 236   1              unsigned char data i;
 237   1              UEPNUM=EpNum;
 238   1              UEPSTAX|=DIR;
 239   1              for(i=0;i<nLength;i++) UEPDATX=Data[i];
 240   1              UEPSTAX|=TXRDY;
C51 COMPILER V7.50   USB_DISK                                                              01/15/2006 18:40:26 PAGE 5   

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

 303   3                        UEPSTAX|=TXRDY;
 304   3                        while(!(UEPSTAX&TXCMP));
 305   3                        UEPSTAX&=(~(TXCMP));
 306   3                }
 307   2                K9F5608 = INACTIVE;
 308   2      
 309   2                length--;     
 310   2                BLK.Block ++;
 311   2           }
 312   1        TransmitCSW();
 313   1      }
 314          
 315          void delay()
 316          {
 317   1        unsigned char data i=20;
 318   1        while(i-->0);
 319   1      }
 320          
 321          void SCSI_Write10()     
 322          {
 323   1          union
 324   1           {
 325   1                 unsigned long page;
 326   1                 unsigned char addr[4];
 327   1           }data PG; 
 328   1      
 329   1          unsigned char data i=0,length=0,nBeginPage=0;
 330   1      
 331   1       
 332   1          K9F_FUN = COMMAND;
 333   1          K9F5608 = 0x60;
 334   1          K9F_FUN = ADDRESS;
 335   1          K9F5608 = BuffBlock;
 336   1              K9F5608 = 0xff;
 337   1          K9F_FUN = COMMAND;                                            
 338   1          K9F5608 = 0xd0;
 339   1          K9F_FUN = D_DATA;
 340   1              delay();
 341   1      
 342   1          while(!(K9F_FUN & RB));
 343   1              
 344   1              K9F_FUN = COMMAND;
 345   1          K9F5608 = 0x60;
 346   1          K9F_FUN = ADDRESS;
 347   1          K9F5608 = BuffBlock|0x20;   
 348   1              K9F5608 = 0xff;
 349   1          K9F_FUN = COMMAND;                                            
 350   1          K9F5608 = 0xd0;
 351   1          K9F_FUN = D_DATA;   
 352   1      
 353   1              PG.addr[2] = bulk_CBW.CBWCB[4];
 354   1              PG.addr[3] = bulk_CBW.CBWCB[5];
 355   1      
 356   1              length = bulk_CBW.CBWCB[8];     

⌨️ 快捷键说明

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