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