1,等于大于4GU盘无法检测到。 2,不知道是硬件问题还是程序问题,写入程序一段时间后,U盘文件(2G)读取正常,但是当开机一段时间(5H),小部分机器就出现了无法找到文件名。 请各位前辈指点指点一下。 程序: #include "string.h" #include "..\s3c44b0\Target\44b.h" #include "..\s3c44b0\Target\44blib.h" #include "..\s3c44b0\Target\option.h"
#include "..\UCOSII\os_cpu.h" #include "..\UCOSII\includes.h"
#include "CH376.h" #include "FAT16.h" #include "CHFAT.h" #include
#define INT8U unsigned char #define INT16U unsigned short #define INT32U unsigned int /* *********************************************OK**************************************************************** - 函数名称 : void SD_GPIO_Init(void) - 函数说明 : SDA引脚方向处理 - 输入参数 : 1:输入 0:输出 - 输出参数 : 无 ************************************************************************************************************* */ void CH376WriteVar32( INT8U var, INT32U dat ) // 写CH376芯片内部的32位变量 { _USBCmd( CMD50_WRITE_VAR32 ); _USBWrite( var ); _USBWrite( (INT8U)dat ); _USBWrite( (INT8U)( (INT16U)dat >> 8 ) ); _USBWrite( (INT8U)( dat >> 16 ) ); _USBWrite( (INT8U)( dat >> 24 ) ); CH_Cs_H (); } /* *********************************************OK**************************************************************** - 函数名称 : void SD_GPIO_Init(void) - 函数说明 : SDA引脚方向处理 - 输入参数 : 1:输入 0:输出 - 输出参数 : 无 ************************************************************************************************************* */ void CH376SetFileName( char * name ) // 设置将要操作的文件的文件名 { INT8U c; _USBCmd( CMD10_SET_FILE_NAME ); c = *name; _USBWrite( c ); while ( c ) { name ++; c = *name; if ( c == DEF_SEPAR_CHAR1 || c == DEF_SEPAR_CHAR2 ) c = 0; // 强行将文件名截止 _USBWrite( c ); } CH_Cs_H (); } /* *********************************************OK**************************************************************** - 函数名称 : void SD_GPIO_Init(void) - 函数说明 : SDA引脚方向处理 - 输入参数 : 1:输入 0:输出 - 输出参数 : 无 ************************************************************************************************************* */ INT8U CH376FileOpen( char * name ) // 在根目录或者当前目录下打开文件或者目录(文件夹) { unsigned char mIntStatus; CH376SetFileName( name ); // 设置将要操作的文件的文件名 if ( name[0] == DEF_SEPAR_CHAR1 || name[0] == DEF_SEPAR_CHAR2 ) CH376WriteVar32( VAR_CURRENT_CLUST, 0 ); // 等待U盘连接 _USBCmd(CMD0H_FILE_OPEN); CH_Cs_H (); mIntStatus = CH375_WaitInterrupt( ); //Uart_Printf( "mIntStatus=%02X\n", mIntStatus ); return(mIntStatus); } /* *********************************************OK**************************************************************** - 函数名称 : void SD_GPIO_Init(void) - 函数说明 : SDA引脚方向处理 - 输入参数 : 1:输入 0:输出 - 输出参数 : 无 ************************************************************************************************************* */ INT8U CH376ReadBlock( char *buf ) // 从当前主机端点的接收缓冲区读取数据块,返回长度 { INT8U s, l; _USBCmd( CMD01_RD_USB_DATA0 ); s = l = _USBRead( ); // 长度 if ( l ) { do { *buf = _USBRead( ); buf ++; } while ( -- l ); } CH_Cs_H (); return( s ); } /* *********************************************OK**************************************************************** - 函数名称 : void SD_GPIO_Init(void) - 函数说明 : SDA引脚方向处理 - 输入参数 : 1:输入 0:输出 - 输出参数 : 无 ************************************************************************************************************* */ INT8U CH376ByteRead( char *buf, INT16U ReqCount, INT16U * RealCount ) // 以字节为单位从当前位置读取数据块 { INT8U s; _USBCmd( CMD2H_BYTE_READ ); _USBWrite( (INT8U)ReqCount ); _USBWrite( (INT8U)(ReqCount>>8) ); CH_Cs_H (); if ( RealCount ) *RealCount = 0; while ( 1 ) { s = CH375_WaitInterrupt( ); if ( s == USB_INT_DISK_READ ) { s = CH376ReadBlock( buf ); // 从当前主机端点的接收缓冲区读取数据块,返回长度 _USBCmd( CMD0H_BYTE_RD_GO ); CH_Cs_H (); buf += s; if ( RealCount ) *RealCount += s; } else return( s ); // 错误 } } /* *********************************************OK**************************************************************** - 函数名称 : void SD_GPIO_Init(void) - 函数说明 : SDA引脚方向处理 - 输入参数 : 1:输入 0:输出 - 输出参数 : 无 ************************************************************************************************************* */ INT32U CH376Read32bitDat( void ) // 从CH376芯片读取32位的数据并结束命令 { INT8U c0, c1, c2, c3; c0 = _USBRead( ); c1 = _USBRead( ); c2 = _USBRead( ); c3 = _USBRead( ); CH_Cs_H (); return( c0 | (INT16U)c1 << 8 | (INT32U)c2 << 16 | (INT32U)c3 << 24 ); } /* *********************************************OK**************************************************************** - 函数名称 : void SD_GPIO_Init(void) - 函数说明 : SDA引脚方向处理 - 输入参数 : 1:输入 0:输出 - 输出参数 : 无 ************************************************************************************************************* */ INT32U CH376ReadVar32( unsigned char var ) // 读CH376芯片内部的32位变量 { _USBCmd( CMD14_READ_VAR32 ); _USBWrite( var ); return( CH376Read32bitDat( ) ); // 从CH376芯片读取32位的数据并结束命令 } /* *********************************************OK**************************************************************** - 函数名称 : void SD_GPIO_Init(void) - 函数说明 : SDA引脚方向处理 - 输入参数 : 1:输入 0:输出 - 输出参数 : 无 ************************************************************************************************************* */ INT32U CH376GetFileSize( void ) // 读取当前文件长度 { return( CH376ReadVar32( VAR_FILE_SIZE ) ); } /* *********************************************OK**************************************************************** - 函数名称 : void SD_GPIO_Init(void) - 函数说明 : SDA引脚方向处理 - 输入参数 : 1:输入 0:输出 - 输出参数 : 无 ************************************************************************************************************* */ unsigned char Open_File1(unsigned long *U_Size) // 在根目录或者当前目录下打开文件或者目录(文件夹) { INT8U *Buffer_Usb1 = (INT8U *)DFT_DOWNLOAD_ADDR; INT32U TotalCount,Size1; INT8U sta; INT16U RealCount,i; char buf[512]; strcpy( buf,"/CARDLAN.BIN" ); sta = CH376FileOpen( buf ); // 枚举文件和目录 //Uart_Printf( "mIntStatus=%02X\n", s ); if ( sta == ERR_MISS_DIR || sta == ERR_MISS_FILE ) { // Uart_Printf("没有找到文件\n"); return(1); } else { Size1 = 0; // Uart_Printf("找到文件\n"); TotalCount = CH376GetFileSize( ); // Uart_Printf(0,"FileSize = %02d\n",TotalCount); *U_Size = TotalCount; // 准备读取总长度 // printf( "从文件中读出的前%d个字符是:\n",(UINT16)TotalCount ); while ( TotalCount ) { // 如果文件比较大,一次读不完,可以再调用CH376ByteRead继续读取,文件指针自动向后移动 if ( TotalCount > sizeof(buf) ) i = sizeof(buf); // 剩余数据较多,限制单次读写的长度不能超过缓冲区大小 else i = TotalCount; // 最后剩余的字节数 sta = CH376ByteRead(buf, i, &RealCount ); // 以字节为单位读取数据块,单次读写的长度不能超过缓冲区大小,第二次调用时接着刚才的向后读 TotalCount -= (unsigned char)RealCount; // 计数,减去当前实际已经读出的字符数 // for ( s=0; s!=RealCount; s++ ) // Uart_SendByte( buf[s] ); // 显示读出的字符 memcpy(Buffer_Usb1 + Size1,buf,512); Size1 = Size1 +512; if