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

📄 sl811.c

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


		
		sl811_read_buf(0x10, buf + 8, 0x08);
		
		tmp = 0;
		while(tmp == 0)
		{
			sl811_write(0x01, 0x10);		
			sl811_write(0x02, 0x08);
			sl811_write(0x03, 0x90);		//PID IN
			sl811_write(0x04, adr);

			sl811_write(0x0D, 0x01);
			sl811_write(0x00, 0x03);		//send cmd


			for(tmp=255; tmp!= 0; tmp--)
			{
				asm("nop");
			} 
	
			while((sl811_read(0x0D)&0x01) == 0);
			if((sl811_read(0x03)&0x40) == 0)tmp =2;
		
		}
		sl811_read_buf(0x10, buf + 16, 0x08);

//8 last bytes
		
		tmp = 0;
		while(tmp == 0)
		{
			sl811_write(0x01, 0x10);		
			sl811_write(0x02, 0x08);
			sl811_write(0x03, 0x90);		//PID IN
			sl811_write(0x04, adr);

			sl811_write(0x0D, 0x01);
			sl811_write(0x00, 0x03);		//send cmd


			for(tmp=255; tmp!= 0; tmp--)
			{
				asm("nop");
			} 
	
			while((sl811_read(0x0D)&0x01) == 0);
			if((sl811_read(0x03)&0x40) == 0)tmp =2;
		
		}

		sl811_read_buf(0x10, buf + 24, 0x08);	
	}
		
	pause_ms(2);
// send a PID OUT to finish request		

	sl811_write(0x01, 0x00);		
	sl811_write(0x02, 0x00);		//size
	sl811_write(0x03, 0x10);		//PID OUT
	sl811_write(0x04, adr);			//device address
	
	sl811_write(0x0D, 0x01);
	sl811_write(0x00, 0x47);		//PID DATA1 
	for(tmp=255; tmp!= 0; tmp--)
	{
		asm("nop");
	} 

	while((sl811_read(0x0D)&0x01) == 0);
}



/****************************************************************************************/
// SET_CONFIGURATION function
/****************************************************************************************/
unsigned char sl811_set_conf(void)
{
	unsigned char tmp;
	sl811_write(0x10, 0x00);
	sl811_write_next(0x09);
	sl811_write_next(0x01);
	sl811_write_next(0x00);
	sl811_write_next(0x00);
	sl811_write_next(0x00);
	sl811_write_next(0x00);
	sl811_write_next(0x00);
	
	sl811_write(0x01, 0x10);			
	sl811_write(0x02, 0x08);			//size
	sl811_write(0x03, 0xD0);			//PID SETUP
	sl811_write(0x04, adr);				//device address

	sl811_write(0x0D, 0x01);
	sl811_write(0x00, 0x07);
	for(tmp=255; tmp!= 0; tmp--)
	{
		asm("nop");
	} 

	while((sl811_read(0x0D)&0x01) == 0);
	

	pause_ms(1);


	sl811_write(0x01, 0x10);			
	sl811_write(0x02, 0x08);			//size
	sl811_write(0x03, 0x90);			//PID IN
	sl811_write(0x04, adr);				//device address
	sl811_write(0x0D, 0x01);
	sl811_write(0x00, 0x03);			//send commande
	for(tmp=255; tmp!= 0; tmp--)
	{
		asm("nop");
	} 

	while((sl811_read(0x0D)&0x01) == 0);
	if((sl811_read(0x03)&0x01) == 0)return ERROR;	
	return COMPLETED;

}


/****************************************************************************************/
//	GET_CAPACITY function
/****************************************************************************************/
unsigned char sl811_get_capacity(unsigned char * buf)
{
	unsigned char tmp;

//Send CBW "USBC"
	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(0x08);	
	sl811_write_next(0x00);	
	sl811_write_next(0x00);	
	sl811_write_next(0x00);	
	sl811_write_next(0x80);	
	sl811_write_next(0x00);	
	sl811_write_next(0x0C);
	sl811_write_next(0x25);
	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 ENDP1 /*OUT 0001 (1 Hex) *///USB-A/USB-B Host PID, Device Endpoint (Write)/USB Status (Read) [03H, 0BH]
		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);
	tmp = 0;
	while(tmp ==0)
	{
		sl811_write(0x01, 0x10);			
		sl811_write(0x02, 0x08);			//size
		sl811_write(0x03, 0x90 + endp_in);	//PID IN ENDP2 /*IN 1001 (9 Hex) */USB-A/USB-B Host PID, Device Endpoint (Write)/USB Status (Read) [03H, 0BH]
		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(0x03)&0x80) != 0)return STALL;
	}
	
	sl811_read_buf(0x10, buf, 0x08);
	
	pause_ms(1);

//Get CSW "USBS"
	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(0x10+ 0x0C) != 0)return ERROR;
	return COMPLETED;
	
}

/****************************************************************************************/
// CLEAR_FEATURE Function 
/****************************************************************************************/
void sl811_clear_feature(void)
{
	unsigned char tmp;
	
	sl811_write(0x10, 0x02);
	sl811_write_next(0x01);
	sl811_write_next(0x00);
	sl811_write_next(0x00);
	sl811_write_next(0x80 + endp_in);
	sl811_write_next(0x00);
	sl811_write_next(0x00);
	sl811_write_next(0x00);
	
	sl811_write(0x01, 0x10);			
	sl811_write(0x02, 0x08);			//size
	sl811_write(0x03, 0xD0);			//PID SETUP
	sl811_write(0x04, adr);				//adevice address

	sl811_write(0x0D, 0x01);
	sl811_write(0x00, 0x27);			//send cmd
	for(tmp=255; tmp!= 0; tmp--)
	{
		asm("nop");
	} 

	while((sl811_read(0x0D)&0x01) == 0);
	

	tmp = 0;
	while(tmp == 0)
	{
		sl811_write(0x01, 0x10);			
		sl811_write(0x02, 0x08);			//size
		sl811_write(0x03, 0x90);			//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;
	}
//get error frame

	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;
	}


}

/****************************************************************************************/
//	READ_SECTOR Function
/****************************************************************************************/
unsigned char sl811_read_sector(unsigned long sector, void * buf0)
{
	unsigned char tmp,i;
	unsigned char *buf=buf0;
	sl811_usb_ready();
	sl811_usb_ready();
	sl811_usb_ready();
	while(sl811_usb_ready() !=0)pause_ms(20);
	
	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(0x80);	
	sl811_write_next(0x00);	
	sl811_write_next(0x0C);
	sl811_write_next(0x28);       //UFI READ(10)
	sl811_write_next(0x00);	
	sl811_write_next((char)(sector>>24));	
	sl811_write_next((char)(sector>>16));	
	sl811_write_next((char)(sector>>8));
	sl811_write_next((char)(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); //Bit6 :Data Toggle Bit ,“0” if DATA0, “1” if DATA1.
		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;
	}

	for(i=0; i!= 8; i++)
	{		
		pause_ms(1);
		tmp = 0;
		while(tmp ==0)
		{		ClearLcd();
				GotoXY(1,0);
				Print("IN tmp");
			sl811_write(0x01, 0x10);			
			sl811_write(0x02, 0x40);				//size
			sl811_write(0x03, 0x90 + endp_in);		//PID IN ENDP2
			sl811_write(0x04, adr);					//device address
			sl811_write(0x0D, 0x01);
			sl811_write(0x00, 0x23);				//send cmd Bit2: Direction When set = “1” transmit to Host. When “0” receive from Host.
			for(tmp=255; tmp!= 0; tmp--)
			{
				asm("nop");
			} 
			while((sl811_read(0x0D)&0x01) == 0);
			if((sl811_read(0x03)&0x01) == 1)
			{
				tmp =2;
			}
		}
	
		sl811_read_buf(0x10, buf + (i*0x40), 0x40);
	}

	
	pause_ms(1);

//get CSW "USBS" frame 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("RDCSW OK");
				pause_ms(80);
	if(sl811_read(0x10+ 0x0C) != 0)return ERROR; 

⌨️ 快捷键说明

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