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

📄 d12.lst

📁 c51单片机+pdiusbd12芯片的假u盘设计
💻 LST
📖 第 1 页 / 共 2 页
字号:
 241                          0x50,
 242                          0,
 243                  },
 244                  {
 245                          {0x07,0x05,0x82,0x02,0x4000,0},
 246                          {0x07,0x05,0x02,0x02,0x4000,0}
 247                  }
 248          };
 249          
 250          
 251          
 252          
 253          
 254          
 255          //D12底层硬件接口函数
 256          void Write_Com(uchar idata A)   //写命令到D12
 257          {D12_A0=1;D12_Data=A;D12_WR=0;D12_WR=1;}
 258          
 259          void Write_Data(uchar idata B)  //写数据到D12
 260          {D12_A0=0;D12_Data=B;D12_WR=0;D12_WR=1;}
 261          
 262          uchar Read_Data()               //从D12读数据
 263          {uchar idata C;D12_A0=0;D12_RD=0;C=D12_Data;D12_RD=1;return C;}
 264          //D12底层硬件接口函数
 265          
 266          void Enable_Enp()
 267          {
 268   1              Write_Com(enable_enp);
 269   1              Write_Data(0x01);       
 270   1      }
 271          void Set_Address(uchar idata add)
 272          {
 273   1              Write_Com(set_address);
 274   1              Write_Data(add|0x80);
 275   1              Enable_Enp();
 276   1      }
 277          void Set_Mode(uchar idata A,uchar idata B)
 278          {
 279   1              Write_Com(set_mode);
 280   1              Write_Data(A);
 281   1              Write_Data(B);  
 282   1      }
 283          
 284          void D12_Init()
 285          {
 286   1              TMOD=0X20;
 287   1              TH1=TL1=0XF3;
 288   1              SCON=0X50;
 289   1              TR1=1;
 290   1              TI=1;
 291   1      //设定波特率
 292   1              Set_Mode(0x0e,0x47);//断开D12连接
 293   1              Set_Address(0x00);//设置默认地址,使能端点
 294   1              Set_Mode(0x1e,0x47);//连接D12连接
 295   1              printf("初始化D12完毕\n");      
 296   1      }
 297          
 298          void Read_Interrupter_Register()
 299          {
 300   1              uchar temp;
 301   1              Write_Com(read_interrupter_register);
 302   1              temp=Read_Data();
C51 COMPILER V7.06   D12                                                                   11/12/2008 23:04:10 PAGE 6   

 303   1              Interrupter_register=temp;
 304   1              Interrupter_register=Interrupter_register<<8;
 305   1              temp=Read_Data();
 306   1              Interrupter_register=Interrupter_register|temp;
 307   1      }
 308          
 309          
 310          uchar Read_Enp_Last_Status(uchar idata enp)
 311          {
 312   1              Write_Com(enp+0x40);
 313   1              return Read_Data();     
 314   1      }
 315          
 316          uchar Select_Enp(uchar idata enp)
 317          {
 318   1              Write_Com(enp);
 319   1              return Read_Data();     
 320   1      }
 321          
 322          uchar Read_Enp_Status(uchar idata enp)
 323          {
 324   1              Write_Com(enp+0x80);
 325   1              return Read_Data();
 326   1      }
 327          
 328          void Validate(uchar idata enp)
 329          {
 330   1              Select_Enp(enp);
 331   1              Write_Com(0xfa);
 332   1      }
 333          
 334          
 335          uchar Read_Enp_Buffer(uchar idata enp,uchar idata len,uchar *pData)
 336          {
 337   1              uchar length,i;
 338   1              while(!(Select_Enp(enp)&Enp_Full_Empty));//端点接满了数据
 339   1              Write_Com(0xf0);                         //
 340   1              Read_Data();    
 341   1              length=Read_Data();
 342   1              if(length<len)
 343   1              len=length;
 344   1              //printf("输入"); 
 345   1              for(i=0;i<len;i++)
 346   1              {
 347   2                      *(pData+i)=Read_Data();
 348   2              //      printf("%x ",(uint16)*(pData+i)); 
 349   2              }
 350   1              //printf("\n");
 351   1              return len;
 352   1      }
 353          
 354          
 355          void Write_Enp_Buffer(uchar idata enp,uchar idata len,uchar * pData)
 356          {
 357   1              uchar i;
 358   1              Select_Enp(enp);
 359   1              Write_Com(0xf0);
 360   1              Write_Data(len);     
 361   1              Write_Data(len);
 362   1              //printf("输出");       
 363   1              for(i=0;i<len;i++)
 364   1              {
C51 COMPILER V7.06   D12                                                                   11/12/2008 23:04:10 PAGE 7   

 365   2                      Write_Data(*(pData+i));
 366   2              //      printf("%x  ",(uint16)*(pData+i)); 
 367   2              }
 368   1              //printf("\n");
 369   1              Validate(enp);  
 370   1      }
 371          
 372          void ACK(uchar idata enp)
 373          {
 374   1              Select_Enp(enp);
 375   1              Write_Com(0xf1);        
 376   1      }
 377          
 378          void Clean_Enp_Buffer(uchar idata enp)
 379          {
 380   1              Select_Enp(enp);
 381   1              Write_Com(0xf2);        
 382   1      }
 383          
 384          
 385          
 386          
 387          void Get_Device_Descriptor()
 388          {
 389   1              Device_Request_Buffer.pData=(uchar *)(&Device_Descriptor);
 390   1              if(Device_Request_Buffer.wLength>sizeof(Device_Descriptor)) 
 391   1                      Device_Request_Buffer.wLength=sizeof(Device_Descriptor);        
 392   1      }
 393          
 394          void Get_Construction_Descriptor()
 395          {
 396   1              Device_Request_Buffer.pData=(uchar *)(&Con_Inter_Endp_Descriptor);
 397   1              if(Device_Request_Buffer.wLength>sizeof(Con_Inter_Endp_Descriptor)) 
 398   1                      Device_Request_Buffer.wLength=sizeof(Con_Inter_Endp_Descriptor);                
 399   1      }
 400          
 401          
 402          void Set_D12_Address()
 403          {
 404   1              Set_Address(LSB(Device_Request_Buffer.Device_Request.wValue));  
 405   1      }
 406          
 407          void Get_Max_Lun()
 408          {
 409   1              Device_Request_Buffer.wLength=1;
 410   1              Device_Request_Buffer.pData=&Max_Lun;
 411   1      }
 412          
 413          void Fail()
 414          {
 415   1              csw.dCSWSignature=0x55534253;
 416   1              csw.dCSWTag=cbw.dCBWTag;
 417   1              csw.dCSWDataResidue=0;
 418   1              csw.bCSWStatus=1;
 419   1              Write_Enp_Buffer(5,sizeof(CSW),(uchar *)(&csw));
 420   1              Soft_Flag.success=0;            
 421   1              Soft_Flag.Enp4=0;
 422   1              Soft_Flag.Enp5=0;
 423   1              Soft_Flag.Allow_Main_In=0;
 424   1              Soft_Flag.Data=0;       
 425   1      }
 426          
C51 COMPILER V7.06   D12                                                                   11/12/2008 23:04:10 PAGE 8   

 427          
 428          void Success()
 429          {
 430   1              csw.dCSWSignature=0x55534253;
 431   1              csw.dCSWTag=cbw.dCBWTag;
 432   1              csw.dCSWDataResidue=0;
 433   1              csw.bCSWStatus=0;
 434   1              Write_Enp_Buffer(5,sizeof(CSW),(uchar *)(&csw));
 435   1              Soft_Flag.success=0;            
 436   1              Soft_Flag.Enp4=0;
 437   1              Soft_Flag.Enp5=0;
 438   1              Soft_Flag.Allow_Main_In=0;
 439   1              Soft_Flag.Data=0;
 440   1      }
 441          
 442          
 443          void Inquire1()
 444          {
 445   1              Write_Enp_Buffer(5,36,Inquire);
 446   1      //      wCount=36;
 447   1      //      printf("Inquire!\n");
 448   1      }
 449          
 450          
 451          void Read_Format_Cap()
 452          {
 453   1              Write_Enp_Buffer(5,20,Format_Cap);
 454   1      //      wCount=20;      
 455   1      //      printf("Format_Cap\n");
 456   1      }
 457          
 458          void Request_Sense()
 459          {       
 460   1              Write_Enp_Buffer(5,0x12,Sense); 
 461   1      }
 462          
 463          
 464          void Read_Cap()
 465          {
 466   1              Write_Enp_Buffer(5,8,Cap);
 467   1      //      wCount=8;
 468   1      //      printf("Read Cap!\n");  
 469   1      }
 470          
 471          void Read10()
 472          {                       
 473   1              if(cbw.cbwcb.LBA==0)
 474   1                      Device_Request_Buffer.pData=DBR;
 475   1              Soft_Flag.Data=1;                       
 476   1      }
 477          
 478          //void Mode_Sence6()
 479          //{
 480                  
 481          //}
 482          
 483          void Enp0()
 484          {
 485   1              Device_Request_Buffer.wLength=0;
 486   1              Device_Request_Buffer.wCount=0;
 487   1              if(!(Read_Enp_Last_Status(0)&Setup_Pack))
 488   1              {return;}//printf("PC return ACK!");
C51 COMPILER V7.06   D12                                                                   11/12/2008 23:04:10 PAGE 9   

 489   1              //接受到的是一个setup包

⌨️ 快捷键说明

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