www.pudn.com > STM32_CH376-SPI.zip > udisk.c, change:2014-01-07,size:8134b


#include "udisk.h" 
#include "delay.h" 
 
unsigned char strfilename[16]={"\\NEWFILE.TXT"}; 
unsigned char buf[8]; 
unsigned char tempbuf[64]; 
unsigned char strReturn[6]={"\xd\xa"}; 
P_FAT_DIR_INFO	pDir; 
/******************************************************* 
*函数功能:初始化CH376芯片后,按照指定文件名在U盘中建新文件 
*返回值:1表示成功,0表示失败 
**********************************************************/ 
unsigned char CreateFileOnUDisk(void) 
{ 
    unsigned char uReturn=0; 
    unsigned char s; 
    unsigned int roundTime=0;//循环次数为1000次,如果1000次初始化后仍然失败,则给出提示 
    unsigned char MountTimes=0;	 
    //先初始化CH376芯片 
    CH376_RST	= 1;		/* 复位 */ 
	delay_ms( 20 ); 
	CH376_RST	= 0;	    /* 禁止复位 */ 
	delay_ms( 100 );       /* 延时100毫秒 */	 
	printf("Start\n"); 
	delay_ms( 1000 );            /*   调试用	*/ 
	s = mInitCH376Host( );       /* 初始化CH376 */ 
    printf( "s=%x \n", s);	   //如果是0xfa则说明通信失败,如果是0x14则说明通信成功,返回0x51说明模式操作成功 
	mStopIfError( s ); 
	printf( "Wait Disk\n" ); 
    while((roundTime<=100)&&(s!=USB_INT_SUCCESS)) 
    { 
        s=mInitCH376Host();  
        roundTime++; 
        printf("cycle times is %x\n",roundTime); 
    } 
    if(s==USB_INT_SUCCESS) 
    { 
        printf("INITIALED udisk succeed!\n"); 
        //判断是否有U盘插上,等待500ms,如果仍然没有MOUNT成功,则返回生成失败 
        while((CH376DiskConnect()!=USB_INT_SUCCESS)&&(MountTimes<=5)) 
        { 
            delay_ms(100); 
            MountTimes++; 
        } 
        if(MountTimes>=6) 
        { 
            printf("UDisk has not been inserted\n"); 
            uReturn=0; 
        } 
        else//说明U盘已经插上 
        { 
            printf("UDisk has been inserted\n"); 
            delay_ms(200);	    //延时,可选操作,有的USB存储器需要几十毫秒的延时 
			//mDelaymS(200);    //延时,可选操作,有的USB存储器需要几十毫秒的延时 
             
    		for (s=0;s<10;s++) //对于检测到USB设备的,最多等待100*50mS 
    		{ 
				delay_ms(50); 
    			//mDelaymS(50); 
    			printf("Ready ?\n"); 
    			if (CH376DiskMount()==USB_INT_SUCCESS)  
    			{ 
    			    break; //初始化磁盘并测试磁盘是否就绪 
    			} 
    		} 
            if(s>=10) 
            { 
                printf("UDisk does not Mount\n");  
                uReturn=0; 
            }     
            else//U盘准备就绪 
            { 
                printf("UDisk has Mounted\n"); 
                //新建文件,如果文件已经存在则自动先删除后新建 
				//delay_ms(10); 
                s = CH376FileCreate(strfilename); //CH376创建文件 
                if(s==USB_INT_SUCCESS) 
                { 
                    printf("create file succeseed\n"); 
                    uReturn=1; 
                } 
                else 
                { 
                    printf("create file failed\n"); 
                    uReturn=0; 
                } 
            } 
        } 
    } 
    else 
    { 
         printf("INITIALED udisk failed\n"); 
         uReturn=0; 
    } 
    return uReturn; 
} 
/******************************************************* 
*函数功能:获取U盘型号,剩余容量大小 
*返回值:U盘型号及剩余容量值(无) 
**********************************************************/ 
void udisk_num(void) 
{ 
unsigned char i,s;  
     i = CH376ReadBlock( tempbuf);                /* 如果需要,可以读取数据块CH376_CMD_DATA.DiskMountInq,返回长度 */ 
     if ( i == sizeof( INQUIRY_DATA ) )        /* U盘的厂商和产品信息 */ 
     {   
          tempbuf[ i ] = 0; 
          printf( "UdiskInfo: %s  \n", ((P_INQUIRY_DATA)tempbuf) -> VendorIdStr ); 
     } 
		printf( "DiskQuery:  " );	  	       /* 检查U盘或者SD卡的剩余空间 */ 
		s = CH376DiskQuery( (PUINT32)tempbuf );	   /* 查询磁盘剩余空间信息,扇区数 */ 
		printf("s=%02x  \n",(unsigned short)s ); 
		printf( "free cap = %ld MB   \n", *(PUINT32)tempbuf / ( 1000000 / DEF_SECTOR_SIZE ) ); 
 
} 
 
/******************************************************* 
*函数功能:读取U盘中的已存在的源文件 
*返回值:无 
**********************************************************/ 
void check_udiskfile() 
{ 
unsigned char s; 
		strcpy( (char *)tempbuf, "\\*" );                                                   /* C51子目录不存在则列出根目录下的文件 */				 
		printf( "List file %s\n", tempbuf ); 
		s = CH376FileOpenPath( tempbuf );                                               /* 枚举多级目录下的文件或者目录,输入缓冲区必须在RAM中 */ 
		while ( s == USB_INT_DISK_READ )                                            /* 枚举到匹配的文件 */ 
		{   
			CH376ReadBlock( tempbuf );                                                  /* 读取枚举到的文件的FAT_DIR_INFO结构,返回长度总是sizeof( FAT_DIR_INFO ) */ 
			pDir = (P_FAT_DIR_INFO)tempbuf;                                             /* 当前文件目录信息 */ 
			if ( pDir -> DIR_Name[0] != '.' )                                       /* 不是本级或者上级目录名则继续,否则必须丢弃不处理 */ 
			{   
				if ( pDir -> DIR_Name[0] == 0x05 )  
				{ 
				    pDir -> DIR_Name[0] = 0xE5;                                     /* 特殊字符替换 */ 
				} 
				pDir -> DIR_Attr = 0;                                               /* 强制文件名字符串结束以便打印输出 */ 
				printf( "*** EnumName: %s\n", pDir -> DIR_Name );                   /* 打印名称,原始8+3格式,未整理成含小数点分隔符 */ 
			} 
		 
			xWriteCH376Cmd( CMD0H_FILE_ENUM_GO );                                   /* 继续枚举文件和目录 */ 
			xEndCH376Cmd( ); 
			s = Wait376Interrupt( ); 
		} 
		 
		if ( s != ERR_MISS_FILE )                                                   /* 操作出错 */ 
		{ 
		    mStopIfError( s );   
		}							 
} 
 
/******************************************************** 
*函数名:EepromToUdisk 
*函数功能:依据提供的末地址写入UDISK 
*输入:页面地址、末地址 
*输出:无 
********************************************************/ 
void EepromToUdisk(unsigned char pageAddress,unsigned int IdleAddress) 
{ 
//    unsigned char s; 
    unsigned char i; 
//    unsigned int counter=0; 
//    unsigned char saveData[8];//每次写入U盘的字符数组 
//    unsigned int intCircle=0;//循环次数 
//    unsigned char reserve=0;//数据地址处以8之后的余数 
      
	 for(i=0;i<8;i++) 
     { 
        buf[i]=i|0x30;	 // saveData[i] 
     }              
	 i=CH376ByteWrite(buf,strlen(buf),NULL); //以字节为单位向文件写入数据    
} 
 
 
 
/******************************************************* 
*函数功能:向已经打开的文件中按照字节写入内容 
*返回值:1表示成功,0表示失败 
**********************************************************/ 
unsigned char WriteToUDisk(void) 
{ 
    unsigned char uReturn=0; 
    unsigned char s,buf[8]; 
    unsigned char i;     
//    unsigned char saveHigh=0x00; 
//    unsigned char saveLow=0x00; 
//    unsigned int saveAddress=0x0010;     
 
    s=CH376FileOpen(strfilename);//打开文件     
    if(s==USB_INT_SUCCESS) 
    {         
        printf("file open succeseed\n"); 
        //将EEPROM中全部内容全部读写到UDISK中,然后借助上位机进行筛选或删除 
        //读取EEPROM的第0页终止地址         
        
 
        //EepromToUdisk(0,saveAddress); 
      
        //EepromToUdisk(1,saveAddress);        
	     for(i=0;i<8;i++) 
	     { 
	        buf[i]=i|0x30;	 // saveData[i] 
	     }   
		             
		 s=CH376ByteWrite(buf,strlen(buf),NULL); //以字节为单位向文件写入数据            
		 printf("write success %d",s); 
		         
        if(s==USB_INT_SUCCESS) 
        { 
            //printf("file write succeseed\n"); 
            uReturn=1; 
        } 
        else 
        { 
            //printf("file write failed\n"); 
            uReturn=0; 
        }                 
		//printf("Close\n"); 
		s=CH376FileClose(TRUE);//关闭文件,自动计算文件长度,以字节为单位写文件,建议让程序库关闭文件以便自动更新文件长度  
		//printf("Take out\n"); 
        i=0; 
		while((CH376DiskConnect()==USB_INT_SUCCESS)&&(i<=5))//检查U盘是否连接,等待U盘拔出 
		{   
			delay_ms(100); 
            i++; 
		} 
        //将初始地址改写为0页面和0x0010首地址        
    
		delay_ms(100); 
    } 
    else//文件打开失败 
    { 
        //printf("file open failed\n"); 
        uReturn=0; 
    }     
    return uReturn; 
}