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

📄 usb_disk.c

📁 AT89C51SND1C是AT89C51核心的处理器
💻 C
📖 第 1 页 / 共 2 页
字号:
void SCSI_Read10()
{
  unsigned char data i;
	union
	{
		unsigned long   Block;
		unsigned char	Addr[4];
	}data BLK;
    unsigned char length;

	BLK.Addr[2] = bulk_CBW.CBWCB[4];
	BLK.Addr[3] = bulk_CBW.CBWCB[5];

    length = bulk_CBW.CBWCB[8];
    while(length>0)
     {

	  K9F_FUN = COMMAND;
	  K9F5608 = 0x00;
	  K9F_FUN = ADDRESS;
	  K9F5608 = 0;
	  K9F5608 = BLK.Addr[3];
	  K9F5608 = BLK.Addr[2];

	  K9F_FUN = D_DATA;
	  UEPNUM=0x01;
	  UEPSTAX|=DIR;
	  while(!(K9F_FUN & RB));

	  for(i=0;i<8;i++)
	  {
		  ReadFlash();
		  UEPSTAX|=TXRDY;
		  while(!(UEPSTAX&TXCMP));
		  UEPSTAX&=(~(TXCMP));
	  }
	  K9F5608 = INACTIVE;

	  length--;	
	  BLK.Block ++;
     }
  TransmitCSW();
}

void delay()
{
  unsigned char data i=20;
  while(i-->0);
}

void SCSI_Write10()	
{
    union
     {
	   unsigned long page;
	   unsigned char addr[4];
     }data PG; 

    unsigned char data i=0,length=0,nBeginPage=0;

 
    K9F_FUN = COMMAND;
    K9F5608 = 0x60;
    K9F_FUN = ADDRESS;
    K9F5608 = BuffBlock;
	K9F5608 = 0xff;
    K9F_FUN = COMMAND;						  
    K9F5608 = 0xd0;
    K9F_FUN = D_DATA;
	delay();

    while(!(K9F_FUN & RB));
	
	K9F_FUN = COMMAND;
    K9F5608 = 0x60;
    K9F_FUN = ADDRESS;
    K9F5608 = BuffBlock|0x20;	
	K9F5608 = 0xff;
    K9F_FUN = COMMAND;						  
    K9F5608 = 0xd0;
    K9F_FUN = D_DATA;	

	PG.addr[2] = bulk_CBW.CBWCB[4];
	PG.addr[3] = bulk_CBW.CBWCB[5];

	length = bulk_CBW.CBWCB[8];	
	nBeginPage = PG.addr[3]&0x1f;
	UEPNUM = 0x02;	
	delay();
	while(!(K9F_FUN & RB)); 

    if(nBeginPage>0)
	  {
	     for(i=0;i<nBeginPage;i++)
		   { 
			  K9F_FUN = COMMAND;
			  K9F5608 = 0x00;
			  K9F_FUN = ADDRESS;
              K9F5608 = 0;					 //A0-A7
              K9F5608 = (PG.addr[3]&0xe0)|i; 	 //A9-A16
	          K9F5608 = PG.addr[2]; 			 //A17-A24 
			  K9F_FUN = D_DATA;
              delay();
		      while(!(K9F_FUN & RB)); 

			  K9F_FUN = COMMAND;
			  K9F5608 = 0x8a;
			  K9F_FUN = ADDRESS;
              K9F5608 = 0;					          //A0-A7
              K9F5608 = BuffBlock|(PG.addr[3]&0x20)|i;  //A9-A16
	          K9F5608 = 0xff; 				          //A17-A24 
			  K9F_FUN = D_DATA;
			  delay();
		      while(!(K9F_FUN & RB));
		   }
		 nBeginPage=0;
	  }

	while(length>0)
	  {
	  	 K9F_FUN = COMMAND;
	     K9F5608 = 0x80;
	     K9F_FUN = ADDRESS;
	     K9F5608 = 0;							  //A0-A7	 
		 K9F5608 = (PG.addr[3]&0x3f)|BuffBlock;   //A9-A16  
		 K9F5608 = 0xff;				 		  //A17-A24
		 K9F_FUN = D_DATA;
		 for(i=0;i<8;i++)
		   {
			  while (!(UEPINT & EP2));	
			  WriteFlash();
			  UEPSTAX &= 0xB9;
		   }
		 K9F_FUN = COMMAND;
		 K9F5608 = 0x10;
		 K9F_FUN = D_DATA;
		 length--;	
		 delay();
		 while(!(K9F_FUN & RB));

	     if(((PG.addr[3]&0x1f)==0x1f)||(length==0))
		   {
		   
			    for(i=((PG.addr[3]&0x1f)+1);i<32;i++)
	             {
	               K9F_FUN = COMMAND;
		           K9F5608 = 0x00;
		           K9F_FUN = ADDRESS;
                   K9F5608 = 0;						     //A0-A7  
                   K9F5608 = (PG.addr[3]&0xe0)|i; 	     //A9-A16
	               K9F5608 = PG.addr[2]; 			     //A17-A24 
		           K9F_FUN = D_DATA;
		           delay();
		           while(!(K9F_FUN & RB));

		           K9F_FUN = COMMAND;
		           K9F5608 = 0x8a;
		           K9F_FUN = ADDRESS;
                   K9F5608 = 0;						        //A0-A7
                   K9F5608 = (PG.addr[3]&0x20)|BuffBlock|i; //A9-A16
	               K9F5608 = 0xff; 				            //A17-A24 
		           K9F_FUN = D_DATA;
		           delay();
		           while(!(K9F_FUN & RB));
	             }
			  	
		   	  K9F_FUN = COMMAND;
              K9F5608 = 0x60;				 //擦除当前block
              K9F_FUN = ADDRESS;
              K9F5608 = PG.addr[3];          //A9-A16
	          K9F5608 = PG.addr[2]; 		 //A17-A24 
              K9F_FUN = COMMAND;
              K9F5608 = 0xd0;
              K9F_FUN = D_DATA;
			  delay();
		      while(!(K9F_FUN & RB));        //等待操作完成  

			  for(i=0;i<32;i++)	
			    {
				   K9F_FUN = COMMAND;
				   K9F5608 = 0x00;
			  	   K9F_FUN = ADDRESS;
                   K9F5608 = 0;				                //A0-A7
                   K9F5608 = (PG.addr[3]&0x20)|BuffBlock|i; //A9-A16
	               K9F5608 = 0xff; 			                //A17-A24 
				   K9F_FUN = D_DATA;
				   delay();
		           while(!(K9F_FUN & RB)); 

				   K9F_FUN = COMMAND;
				   K9F5608 = 0x8a;  
			  	   K9F_FUN = ADDRESS;
                   K9F5608 = 0;						   //A0-A7
                   K9F5608 = (PG.addr[3]&0xe0)|i;      //A9-A16
	               K9F5608 = PG.addr[2]; 			   //A17-A24 
				   K9F_FUN = D_DATA;
				   delay();
		           while(!(K9F_FUN & RB));
  			    }

			  if(length>0)
			    {
				   K9F_FUN = COMMAND;
                   K9F5608 = 0x60;
                   K9F_FUN = ADDRESS;
                   K9F5608 = (PG.addr[3]&0x20)|BuffBlock;  //A9-A16
	               K9F5608 = 0xff; 				           //A17-A24 
                   K9F_FUN = COMMAND;
                   K9F5608 = 0xD0;
                   K9F_FUN = D_DATA;
				   delay();
				   while(!(K9F_FUN & RB));
				}
 		   }
		  PG.page++;
	  }

	TransmitCSW();	
}	

void main_rxdone()
{
  unsigned char data i;
  unsigned char data Buf[64];

  i = ReadEp(2,Buf);

	 P3_5 =0;
	 bulk_CSW[4] = Buf[4];  bulk_CSW[5] = Buf[5]; bulk_CSW[6] = Buf[6]; bulk_CSW[7] = Buf[7];
	 for(i=0;i<12;i++) bulk_CBW.CBWCB[i] = Buf[i+15];
	 switch(bulk_CBW.CBWCB[0])
		{
			case Inquiry			     :WriteEpBulk(1,36,B_InquiryData);break;
			case Mode_Sense			     :SCSI_Mode_Sense();              break;
			case Read10				     :SCSI_Read10();                  break;
			case Read_Capacity		     :WriteEpBulk(1, sizeof(B_Read_Capacity), B_Read_Capacity);break;
			case Read_Format_Capacities	 :SCSI_Read_Format_Capacities();  break;
			case Test_Unit_Ready	     :TransmitCSW();                  break;
			case Verify				     :TransmitCSW();                  break;
			case Write10			     :SCSI_Write10();                 break;
			case Medium_Removal		     :TransmitCSW();                  break;
		}
     P3_5 =1;
}

void Flash_Reset(void)		                                     //flash reset
{ 
	unsigned int data i;
	K9F_FUN = COMMAND;                     
	K9F5608 = 0xff;	                 //reset command
	for (i=0; i<3000; i++) ;	                                 //delay 	
}


void ReadPage(unsigned int block, unsigned int page, unsigned char *pPage)
{
	int i;
	unsigned int blockPage = (block << 5) | page;

	K9F_FUN = COMMAND;
	K9F5608 = 0x00;
	K9F_FUN = ADDRESS;
    K9F5608 = 0;						 //A0-A7
    K9F5608 = blockPage & 0xff; 	     //A9-A16
	K9F5608 = (blockPage >> 8) & 0xff;   //A17-A24 
	K9F_FUN = D_DATA;

	i = 512;
    while(!(K9F_FUN & RB));

	while((i--)>0) 
	{
		*pPage++ = K9F5608; 
	}
}

⌨️ 快捷键说明

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