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

📄 sl811.c

📁 SPI FLASH,SL811HST驱动
💻 C
📖 第 1 页 / 共 3 页
字号:
	return COMPLETED;
		
} 

/****************************************************************************************/
//	WRITE_SECTOR Function
/****************************************************************************************/
unsigned char sl811_write_sector(unsigned long sector, void * buf0)
{
	unsigned char tmp,i;
	unsigned char *buf=buf0;
	sl811_usb_ready();
	while(sl811_usb_ready() !=0)pause_ms(20);
	
	//Fill buffer
	sl811_write(0x10, 'U');	
	sl811_write_next('S');	
	sl811_write_next('B');	
	sl811_write_next('C');	
	sl811_write_next('P');	
	sl811_write_next('I');	
	sl811_write_next('K');	
	sl811_write_next('A');	
	sl811_write_next(0x00);	
	sl811_write_next(0x02);		//512 bytes
	sl811_write_next(0x00);	
	sl811_write_next(0x00);	
	sl811_write_next(0x00);	
	sl811_write_next(0x00);	
	sl811_write_next(0x0C);
	sl811_write_next(0x2A);     //WRITE
	sl811_write_next(0x00);	
	sl811_write_next(sector>>24);	
	sl811_write_next(sector>>16);	
	sl811_write_next(sector>>8);
	sl811_write_next(sector);	
	sl811_write_next(0x00);	
	sl811_write_next(0x00);			
	sl811_write_next(0x01);		//sector number
	sl811_write_next(0x00);	
	sl811_write_next(0x00);	
	sl811_write_next(0x00);	
	sl811_write_next(0x00);	
	sl811_write_next(0x00);	
	sl811_write_next(0x00);	
	sl811_write_next(0x00);	

	tmp = 0;
	while(tmp ==0)
	{	
		sl811_write(0x01, 0x10);		
		sl811_write(0x02, 0x1F);				//size
		sl811_write(0x03, 0x10 + endp_out);		//PID OUT ENDP1
		sl811_write(0x04, adr);					//device address
	
		sl811_write(0x0D, 0x01);
		if((data_toggle & 0x01) == 0)sl811_write(0x00, 0x27);
		else sl811_write(0x00, 0x67);
		
		for(tmp=255; tmp!= 0; tmp--)
		{
			asm("nop");
		} 
		while((sl811_read(0x0D)&0x01) == 0);
		if((sl811_read(0x03)&0x01) == 1)tmp =2;
	}
	data_toggle = data_toggle ^ 0x01;

//send 8 OUT packets of 64 bytes each 
	for(i=0; i!= 8; i++)
	{		
		pause_ms(1);
		tmp = 0;
		while(tmp ==0)
		{
			sl811_write_buf(0x10, buf + (i*0x40), 0x40);
			
			sl811_write(0x01, 0x10);			
			sl811_write(0x02, 0x40);					//size 64
			sl811_write(0x03, 0x10 + endp_out);			//PID OUT ENDP1
			sl811_write(0x04, adr);						//device address

			sl811_write(0x0D, 0x01);
			if((data_toggle & 0x01) == 0)sl811_write(0x00, 0x27);
			else sl811_write(0x00, 0x67);
			for(tmp=255; tmp!= 0; tmp--)
			{
				asm("nop");
			} 
			while((sl811_read(0x0D)&0x01) == 0);
			if((sl811_read(0x03)&0x01) == 1)
			{				
				tmp =2;
			}
		}
		data_toggle = data_toggle ^ 0x01;

	}	
	pause_ms(1);
	ClearLcd();
//get CSW "USBS" to verify errors
	tmp =0;
	while(tmp == 0)
	{
		sl811_write(0x01, 0x10);			
		sl811_write(0x02, 0x0D);					//size
		sl811_write(0x03, 0x90 + endp_in);			//PID IN
		sl811_write(0x04, adr);						//device address
		sl811_write(0x0D, 0x01);
		sl811_write(0x00, 0x23);					//send cmd
		for(tmp=255; tmp!= 0; tmp--)
		{
			asm("nop");
		} 
	
		while((sl811_read(0x0D)&0x01) == 0);
		if((sl811_read(0x03)&0x01) == 1)
		{
			tmp =2;
		}
	}
				ClearLcd();
				GotoXY(1,0);
				Print("CSW OK");
				pause_ms(80);
	if(sl811_read(0x10+ 0x0C) != 0)return ERROR;		
	
	return COMPLETED;	
} 


/****************************************************************************************/
//	USB_READY Function
/****************************************************************************************/
unsigned char sl811_usb_ready(void)
{
	unsigned char tmp;
	//fill buffer
	sl811_write(0x10, 'U');	
	sl811_write_next('S');	
	sl811_write_next('B');	
	sl811_write_next('C');	
	sl811_write_next('P');	
	sl811_write_next('I');	
	sl811_write_next('K');	
	sl811_write_next('A');	
	sl811_write_next(0x00);	
	sl811_write_next(0x00);	
	sl811_write_next(0x00);	
	sl811_write_next(0x00);	
	sl811_write_next(0x00);	
	sl811_write_next(0x00);	
	sl811_write_next(0x0C);
	sl811_write_next(0x00);   //TEST UNIT READY
	sl811_write_next(0x00);	
	sl811_write_next(0x00);	
	sl811_write_next(0x00);	
	sl811_write_next(0x00);
	sl811_write_next(0x00);	
	sl811_write_next(0x00);	
	sl811_write_next(0x00);		
	sl811_write_next(0x00);	
	sl811_write_next(0x00);	
	sl811_write_next(0x00);	
	sl811_write_next(0x00);	
	sl811_write_next(0x00);	
	sl811_write_next(0x00);	
	sl811_write_next(0x00);	
	sl811_write_next(0x00);	

	tmp = 0;
	while(tmp ==0)
	{	
		sl811_write(0x01, 0x10);		
		sl811_write(0x02, 0x1F);				//size
		sl811_write(0x03, 0x10 + endp_out);		//PID OUT + ENDP
		sl811_write(0x04, adr);					//device address
	
		sl811_write(0x0D, 0x01);
		if((data_toggle & 0x01) == 0)sl811_write(0x00, 0x27);
		else sl811_write(0x00, 0x67);
		data_toggle = data_toggle ^ 0x01;
		for(tmp=255; tmp!= 0; tmp--)
		{
			asm("nop");
		} 
		while((sl811_read(0x0D)&0x01) == 0);
		if((sl811_read(0x03)&0x01) == 1)tmp =2;
	}


	pause_ms(1);

//get CSW "USBS" to verify errors
	tmp =0;
	while(tmp == 0)
	{
		sl811_write(0x01, 0x10);			
		sl811_write(0x02, 0x0D);					//size
		sl811_write(0x03, 0x90 + endp_in);			//PID IN
		sl811_write(0x04, adr);						//device address

		sl811_write(0x0D, 0x01);
		sl811_write(0x00, 0x23);					//send cmd
		for(tmp=255; tmp!= 0; tmp--)
		{
			asm("nop");
		} 
	
		while((sl811_read(0x0D)&0x01) == 0);
		if((sl811_read(0x03)&0x01) == 1)tmp =2;

	}
	if((sl811_read(0x04) == 0) && (sl811_read(0x1C) == 0))return READY;
	else return BUSY;	
} 

/***************************************************************************************/
//SL811_INIT Function
/****************************************************************************************/
void sl811_init(void)  //设备插入之前初始化
{
//	TRISB0=1;
	TRISE0=0;
	TRISE1=0;
	TRISE2=0;
//	TRISD=0xFF;
	A0 = 0;
	NRD = 1;
	NWR = 1;

	pause_ms(1);
	sl811_write(0x06, 0x60);
	sl811_write(0x0F, 0xae);
	sl811_write(0x05, 0x08);
	sl811_write(0x05, 0x00);
	sl811_write(0x0F, 0xae);
	sl811_write(0x05, 0x08);
	pause_ms(10);
	sl811_write(0x05, 0x00);
	pause_ms(1);
	sl811_write(0x0D, 0xFF);
}

/****************************************************************************************/
//SL811_START Function
/****************************************************************************************/
unsigned char sl811_start()  //设备插入以后对设备初始化
{
	unsigned char tmp;
	unsigned char added_temp;   //added

	//adr=0x01;

	data_toggle =0;		                    	//init toggle           data_toggle 第一次出现,已赋值
	pause_ms(10);

	pause_ms(10);
	tmp = 255;
	while(tmp != 0)						//wait device full speed
	{
		pause_ms(4);
		/********wait device*********/
		GotoXY(1,1);
		Print("wait device.");
		/********************/
		if(!(sl811_read(0x0D)& 0x40))
		{
			tmp = 0;	//read bit "device detected"
		}	
	}
	GotoXY(2,1);
	Print("device ok!");						
	if((sl811_read(0x0D) & 0x80) == 0)
	{
		GotoXY(1,1);
		Print("low speed!!");
		pause_ms(10);
		return NOT_FULL_SPEED;		//return error if low speed device detected
	}
	else{
//	RB1=0;
//	pause_ms(50);
		GotoXY(1,1);
		Print("high speed!!");
		pause_ms(100);
	}
	GotoXY(2,1);
	Print("device initial..!!");
	sl811_write(0x01, 0x10);	//EP0Address
	sl811_write(0x09, 0x50);	//EP1Address	

	sl811_write(0x0F, 0xAE);		//config host & frame generator prescaler  cSOFcnt 
	sl811_write(0x0E, 0xE0);		//cDATASet
	sl811_write(0x05, 0x01);		//CtrlReg
	sl811_write(0x00, 0x01);		//EP0Control
	sl811_write(0x04, 0x00);		//device address
	
	pause_ms(50);
	adr = 0;

	sl811_write(0x05, 0x09);		//reset usb device
	pause_ms(20);
	sl811_write(0x05, 0x01);

	
	pause_ms(50);					//wait 50 ms

	adr = 1;
	sl811_set_addr();				//Set Address : address will be 0x01        adr 第一次出现 adr 要先初始化,可为0x01

	pause_ms(20);
	sl811_get_device_desc(buffer);                                                //buffer is here 第一次出现

	pause_ms(20);
	sl811_get_device_conf(buffer);

//check device class : 0x08 => MASS STORAGE CLASS
	if(buffer[14] != 0x08 || buffer[9] != 0x09 || buffer[10] != 0x04)return NOT_MASS_STORAGE;
	else{
	/*****LCD显示:大容量设备******/
	GotoXY(1,1);
	Print("MASS Storage!!");
	/*****************************/
	pause_ms(100);
	}
//get endpoint number
	if((buffer[0x12] == 0x07) && (buffer[0x13] == 0x05))
	{
		if((buffer[0x14] & 0x80) != 0)endp_in = buffer[0x14] & 0x0F;           //end_in is here, 第一次出现已赋值;
		else endp_out = buffer[0x14] & 0x0F;                                    //end_out is here,第一次出现,已赋值
		if((buffer[0x19] == 0x07) && (buffer[0x1A] == 0x05))
		{
			if((buffer[0x1B] & 0x80) != 0)endp_in = buffer[0x1B] & 0x0F;
			else endp_out = buffer[0x1B] & 0x0F;
		}
	}

	pause_ms(20);
	sl811_set_conf();
	
	pause_ms(100);

	sl811_usb_ready();
					
	if(sl811_get_capacity(buffer) == STALL)
	{
		sl811_clear_feature();
	}	
	pause_ms(250);
	
	for(tmp = 10 ; tmp != 0 ; tmp--)
	{
		sl811_usb_ready();
	}	
		
		/***********/
		GotoXY(2,0);
		Print("GET CAPACITY!!");
		/*****************************/
		pause_ms(200);
//get device capacity
	sl811_get_capacity(buffer);
	sl811_get_capacity(buffer);

	added_temp=sl811_read_sector(0x00000000, buffer);  //
	
	added_temp=sl811_read_sector(0x00000000, buffer);	//
	
	added_temp=sl811_read_sector(0x00000000, buffer);   //
	
	if(added_temp==COMPLETED)
	{
		/***********/
		GotoXY(2,0);
		Print("READ LBA0 OK!!");
		/*****************************/
		pause_ms(200);
	}
	else
	{
		/***********/
		GotoXY(2,0);
		Print("ERROR!!");
		/*****************************/
		pause_ms(200);
	}
	pause_ms(200);

	while(sl811_usb_ready() != 0)
	{
		  /*******usb ready*********/
 	    GotoXY(2,0);
		Print("usb busy!!");
		pause_ms(20);//==0.准备好
	}
    /*******usb ready*********/
    GotoXY(2,0);
	Print("usb ready!!");
	/*****************************/
	return COMPLETED;
}

/****************************************************************************************/
// Active wait, time in ms
/****************************************************************************************/
void pause_ms(unsigned char tps)
{
	unsigned char i, j;
	while(tps-- != 0)
	{
		for(i=9; i!= 0; i--)
		{
			for(j=11;j !=0; j--)
			{
				asm("nop");
			}
		}
	}
}




⌨️ 快捷键说明

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