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

📄 usb.lst

📁 MP3播放器和U盘功能的源代码。采用集成了MP3解码芯片和USB接口芯片的AT89C51SND1C单片机
💻 LST
📖 第 1 页 / 共 3 页
字号:
 168                                                                                          };
 169          
 170          void Get_Descriptor(unsigned char DesType,unsigned char nLength)           //得到描述符
 171          {
 172   1              if(DesType==0x01)                                                                                                          //取设备描述符
 173   1                      WriteEp(0,18,Device_Descriptor);
 174   1      
 175   1              if((DesType==0x02)&&(nLength==0x09))                                                   //取端口描述符
 176   1                      WriteEp(0,9,Configuration_Descriptor_All);
 177   1      
 178   1              if((DesType==0x02)&&(nLength==0xff))                                                   //取端点描述符
 179   1              {
C51 COMPILER V7.50   USB                                                                   02/08/2007 11:18:10 PAGE 4   

 180   2                  WriteEp(0,32,Configuration_Descriptor_All);
 181   2                  WriteEp(0,2,&Device_Descriptor[4]);
 182   2              }
 183   1      
 184   1              if((DesType==0x02)&&(nLength==0x20)) 
 185   1                      WriteEp(0,32,Configuration_Descriptor_All);                            //取配置描述符
 186   1      }
 187          
 188          void Set_Configuration(unsigned char wValue)            //设置配置
 189          {
 190   1        if(wValue == 0)
 191   1        {
 192   2                      UEPNUM=0x00;    UEPCONX=0x80;
 193   2                      UEPNUM=0x01;    UEPCONX=0x86;
 194   2                      UEPNUM=0x02;    UEPCONX=0x82;
 195   2                      USBCON&=(~CONFG);
 196   2                      WriteEp(0,0,0);                                                         //状态传送阶段之前完成指定操作
 197   2        }
 198   1        else if(wValue == 1) 
 199   1        {
 200   2                      UEPNUM=0x00;    UEPCONX=0x80;
 201   2                      UEPNUM=0x01;    UEPCONX=0x86;
 202   2                      UEPNUM=0x02;    UEPCONX=0x82;
 203   2                      USBCON|=CONFG;
 204   2                      WriteEp(0,0,0);                                                         //状态传送阶段之前完成指定操作
 205   2        }
 206   1      }
 207          
 208          void Ep0()                                          //---端点0处理主函数
 209          {
 210   1        unsigned char data DT[32]={0,};
 211   1        unsigned char data i;
 212   1        i = ReadEp(0,DT);
 213   1        if (((DT[0] & 0x60)==0) && i)
 214   1        {
 215   2          switch (DT[1])
 216   2          {
 217   3            case set_address                          :Set_Address(DT[2]);                    break;  //设置地址
 218   3            case get_descriptor                       :Get_Descriptor(DT[3],DT[6]);   break;  //取描述符
 219   3            case set_configuration        :Set_Configuration(DT[2]);          break;  //设置配置
 220   3            default                                           :;                                                  break;
 221   3              }
 222   2        }
 223   1        else if(DT[0]==0xa1)                                                          //非标准USB请求
 224   1              {
 225   2                      WriteEp(0,0,0);
 226   2              }                                                                                                       
 227   1      }
 228          
 229          /******************************************************************************/
 230          /**                   以下为利用Bulk_Only传输协议的函数部分                  **/
 231          /******************************************************************************/
 232          unsigned char data bulk_CSW[]={0x55,0x53,0x42,0x53,     // bytes 4 dCSWSignature
 233                                                        0x00,0x00,0x00,0x00,          //bytes 4  dCSWTag
 234                                                        0x00,0x00,0x00,0x00,              //bytes 4 dDataResiduce
 235                                                        0x00};                            //bCSWStatus  00=good state.
 236          
 237          typedef struct _STRUCT_CBW
 238          {
 239                  unsigned char CBWCB[12];                        //for UFI Command all have 12bit
 240          
 241          } struct_CBW;
C51 COMPILER V7.50   USB                                                                   02/08/2007 11:18:10 PAGE 5   

 242          
 243          struct_CBW data bulk_CBW;
 244          
 245          void WriteEpBulk(unsigned char EpNum,unsigned char nLength,unsigned char *Data)
 246          {
 247   1              unsigned char data i;
 248   1              UEPNUM=EpNum;                                           //---设置端点号
 249   1              UEPSTAX|=DIR;                                           //...设置为In模式
 250   1              for(i=0;i<nLength;i++) UEPDATX=Data[i];         //---填缓冲区
 251   1              UEPSTAX|=TXRDY;                                     //---发送数据
 252   1      }
 253          
 254          void TransmitCSW()                                                                      //向Host返回CSW
 255          {
 256   1        WriteEpBulk(1, sizeof(bulk_CSW), bulk_CSW);
 257   1        while(!(UEPSTAX&TXCMP)) ;
 258   1        UEPSTAX&=(~(TXCMP));                                          //清除TXCMP
 259   1        UEPINT = 0;
 260   1      }
 261          
 262          void main_txdone()                                                       //数据发送完毕给出回复
 263          {
 264   1        UEPSTAX&=(~(TXCMP));                                           //清除TXCMP
 265   1        TransmitCSW();
 266   1      }
 267          
 268          //////////////////////////////////有关输出端点的调用//////////////////////////////////////////////
 269          #define Inquiry                                                 0x12
 270          #define Mode_Sense                                              0x1A
 271          #define Read10                                                  0x28
 272          #define Read_Capacity                                   0x25 
 273          #define Read_Format_Capacities          0x23 
 274          #define Test_Unit_Ready                                 0x00 
 275          #define Verify                                                  0x2F 
 276          #define Write10                                                 0x2A 
 277          #define Medium_Removal                                  0x1E
 278          
 279          #define SCSI_MSPGCD_TPP                     0x1C
 280          #define SCSI_MSPGCD_RETALL                          0x3F
 281          
 282          //SCSI-Inquiry命令的返回数据  
 283          code unsigned char B_InquiryData[] = {
 284                                                                  0x00,                          //Direct Access Device
 285                                                                  0x80,                          //RMB
 286                                                                  0x00,                          //ISO/ECMA/ANSI
 287                                                                  0x01,                          //Response Data Format
 288                                                                  0x1f,                          //Additional Length
 289                                                                  0x00,                          //Reserved
 290                                                                  0x00,                          //Reserved
 291                                                                  0x00,                          //Reserved 
 292                                                                  'K', 'T', '-', 'T', 'E', 'C', 'H', ' ',        //Vendor Information
 293                                                                  'M', 'P', '3', ' ', 'P', 'l', 'a', 'y', 'e', 'r', ' ', 'V', '1', '.', '0', '0',//Product Identifica
             -tion
 294                                                                  0, 0, 0, 0};                   //Product Revision Level n.nn
 295          
 296          //SCSI-Read_Format_capacities命令的返回数据      
 297          code unsigned char B_Read_Format_capacities[] = {0x00, 0x00, 0x00, 0x10,                //capacity list header
 298                                                                                  0x00, 0x00, 0x07, 0xf5, 0x01, 0x00, 0x02, 0x00, //capacity descriptor
 299                                                                              //Number of Blocks =2037,unformatted media,blocklength = 512Bytes
 300                                                                                  0x00, 0x00, 0x07, 0xfd, 0x00, 0x00, 0x02, 0x00  //Formattable Capacity Descriptors
 301                                                                                  };
 302          //SCSI-Read_Capacity命令的返回数据
C51 COMPILER V7.50   USB                                                                   02/08/2007 11:18:10 PAGE 6   

 303          code unsigned char B_Read_Capacity[] = {
 304                                                                          0x00, 0x00, 0xfe, 0xa0,    //Last  Logical Block Address for 32MB 
 305                                                                          0x00, 0x00, 0x02, 0x00     //block length in bytes
 306                                                                          };
 307          //SCSI-Mode_Sense命令的返回数据                         
 308          code unsigned char B_Mode_Sense_ALL[] = {0x0b, 0x00,       //Mode Data Length
 309                                                                  0x00, 0x08, 0x00, 0x00,
 310                                                                  0x7d, 0, 0, 0, 0x02, 0x00
 311                                                                  };
 312          //SCSI-Mode_Sense命令的返回数据                 
 313          code unsigned char B_Mode_Sense_TPP[] = {0xf0, 0x00,       //Mode Data Length
 314                                                                  05, 00, 00, 00, 00, 0x0b, 00, 00, 00, 00, 0x24, 00, 00, 00, 00, 00
 315                                                                  };
 316          //SCSI-Mode_Sense命令的返回数据                 
 317          code unsigned char B_Mode_Sense_ZERO[] = {0x00, 0x06,      //Mode Data Length
 318                                                                  0x00,                          //Medium Type Code
 319                                                                  0,                             //write enabled
 320                                                                  0, 0, 0, 0                     //reserved       
 321          };
 322          
 323          
 324          void SCSI_Mode_Sense()
 325          {
 326   1        if(bulk_CBW.CBWCB[2] == SCSI_MSPGCD_TPP)                 //Page Code=Timer and Potect Page
 327   1          {WriteEpBulk(1, sizeof(B_Mode_Sense_TPP), B_Mode_Sense_TPP);}
 328   1        else if(bulk_CBW.CBWCB[2] == SCSI_MSPGCD_RETALL)                 //Page Code=All
 329   1          {WriteEpBulk(1, sizeof(B_Mode_Sense_ALL), B_Mode_Sense_ALL);}
 330   1        else {WriteEpBulk(1, sizeof(B_Mode_Sense_ZERO), B_Mode_Sense_ZERO);}
 331   1      }
 332          
 333          void SCSI_Read_Format_Capacities()
 334          {
 335   1        if(bulk_CBW.CBWCB[7]==0 && bulk_CBW.CBWCB[8]==0)return;
 336   1        WriteEpBulk(1, sizeof(B_Read_Format_capacities), B_Read_Format_capacities);
 337   1      }
 338          
 339          extern void ReadFlash();
 340          extern void WriteFlash();

⌨️ 快捷键说明

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