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

📄 u_test.c

📁 开发一个U盘的全套资料
💻 C
字号:
#include <host_811.h>

WORD  xdata TotalWriteSize,ErrorCapacity;
LWORD xdata ValidCapacity;

WORD CheckFreeCapacity(WORD TotalWriteSize,WORD *FreeList,WORD ErrorCapacity);//查询U盘空闲容量,得到空闲簇的地址列表
BYTE ResultExport(WORD *FreeList);//结果导出到一个文件

unsigned char U_Disk_Test(void)
{
	BYTE i;
	BYTE xdata FATNum;

	sl811h_init();
	i=0;
	while(!SLAVE_ENUMERATED){
    	slave_detect();
		i++;
		if(i>0x10) return 0x01;//没有检测到USB设备 
    }

	if(uDev[1].bClass!=0x08){//判断USB设备是否是U盘
		return 0x02;//USB设备不是U盘
	}
	if(uDev[1].bNumOfEPs<2){//判断USB设备端点个数
		return 0x03;//USB设备不是U盘
	}
	//确定端口的输入输出特性
	EPOut =0x00;
	EPIn  =0x00;	 
	if((uDev[1].bEPAddr[1]==0x01)&&(uDev[1].bEPAddr[2]==0x82)){
		EPOut =0x01;
		EPIn  =0x02;
	}
	if((uDev[1].bEPAddr[1]==0x81)&&(uDev[1].bEPAddr[2]==0x02)){
		EPOut =0x02;
		EPIn  =0x01;
	}
	if((EPOut ==0x00)||(EPIn  ==0x00)){
		return 0x04;//USB设备不是U盘
	}
	//判断端点的传输特性,必须是批量传输
	if((uDev[1].bAttr[1]!=0x02)||(uDev[1].bAttr[2]!=0x02)){
		return 0x05;//USB设备不是U盘
	}
	OutPayLoad=WordSwap(uDev[1].wPayLoad[EPOut]);
	InPayLoad=WordSwap(uDev[1].wPayLoad[EPIn]);
	
//	Get_LUN();//取得设备最大逻辑单元,对爱国者迷你王128M(U盘型),Max_LUN=1
//	MaxLUN=MassStorageDataBuf[0];

//	if(MaxLUN>1)  return 0x11;//USB设备不支持本通信协议

	if(!UFLInquiry()){//获取设备信息
		return 0x06;//USB设备不支持本通信协议
	}
	
	i=0;
	while(i<20){
		if(UFLReadCapacity()) break;

		USB_Delay(200);				

		Reset_U();//如果读取数据失败,则Reset USB设备和接口
	
		USB_Delay(200);				
	
		UFLRequestSense();
		
		USB_Delay(200);	
		i++;	
	}	
	if(i==20) return 0x07;//USB设备不支持本通信协议

/*********************************************************************************		
Read Main Boot Record(MBR)  Sector=0x00
	MassStorageDataBuf[446]==0x80 --> First partition is active partition
	MassStorageDataBuf[450]==0x04 --> FAT16
							 0x01 --> FAT12
							 0x06 --> BigFAT16
							 0x07 --> NTFS
							 0x0B --> FAT32
							 0x0C --> FAT32 LBA
**********************************************************************************/
//	if(MaxLUN){//U盘为爱国者128M
//		DBRAddr=0;
//	}
//	else{
		if(UFLRead10(0x00)){
//			if((MassStorageDataBuf[446]==0x80)){
				DBRAddr=(WORD)MassStorageDataBuf[455]<<8|(WORD)MassStorageDataBuf[454];
				USBCapacity=(LWORD)MassStorageDataBuf[461]<<24|(LWORD)MassStorageDataBuf[460]<<16|
						(LWORD)MassStorageDataBuf[459]<<8|(LWORD)MassStorageDataBuf[458];
//			}
		}
		else{
			return 0x09;//USB设备不支持本通信协议
		}
//	}
/*********************************************************************************		
Read DOS Boot Record  Sector=DBRAddr
	MassStorageDataBuf[11,12]	w Byte Pre Sector
	MassStorageDataBuf[13]		b Sector Pre Cluster
	MassStorageDataBuf[14,15]	w Reserved sector
	MassStorageDataBuf[16]		b Number of FATs
	MassStorageDataBuf[17,18]	w Entry of Root 
	MassStorageDataBuf[22,23]	w Sector Pre FAT
	
**********************************************************************************/
	i=0;
	while(i<20){
		if(UFLRead10(DBRAddr)) break;

		USB_Delay(200);				

		Reset_U();
	
		USB_Delay(200);				
	
		UFLRequestSense();
		
		USB_Delay(200);	
		i++;	
	}	
	if(i==20) return 0x0a;//USB设备不支持本通信协议

	SectorSize=(WORD)MassStorageDataBuf[12]<<8|(WORD)MassStorageDataBuf[11];
	ClusterSize=MassStorageDataBuf[13];
	FATAddr=DBRAddr+((WORD)MassStorageDataBuf[15]<<8|(WORD)MassStorageDataBuf[14]);
	FATNum=MassStorageDataBuf[16];
	RootDirNum=(WORD)MassStorageDataBuf[18]<<8|(WORD)MassStorageDataBuf[17];
	RootDirSize=(RootDirNum<<5)/SectorSize;
	FATLength =(WORD)MassStorageDataBuf[23]<<8|(WORD)MassStorageDataBuf[22];
	RootDirAddr=FATAddr+FATLength*FATNum;
	FileDataAddr=RootDirAddr+RootDirSize;
//	if(MaxLUN)//U盘为爱国者128M
//		USBCapacity=(LWORD)MassStorageDataBuf[35]<<24|(LWORD)MassStorageDataBuf[34]<<16|
//			(LWORD)MassStorageDataBuf[33]<<8|(LWORD)MassStorageDataBuf[32];
	ValidCapacity=USBCapacity-1-RootDirSize-FATLength*FATNum;
	ErrorCapacity=(LWORD)(FATLength*256-2)*ClusterSize-ValidCapacity;

    UFLRead10(FATAddr);//读FAT表
    
    UFLRead10(RootDirAddr);//读根目录区
    
	return 0x00;
}



⌨️ 快捷键说明

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