int main( void ) { int i; int j; UINT8 res; UINT8 s; UINT8 NameBuf[20] = {0}; UINT8 CountT = 0; UINT32 U_D; PUINT32 pU_D; pU_D = &U_D; // Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD; P1DIR_bit.P1DIR0 = 1; P1OUT_bit.P1OUT0 = 1; UartInit(); code_start: CountT ++; for(i = 0;i<30000;i++); printk("Code Start !\r\n"); printk("程序开始 !\r\n"); do{ for(i = 0;i<30000;i++); res = mInitCH376Host(); }while(res != USB_INT_SUCCESS); printk("USB_INT_SUCCESS !\r\n"); do{ for(i = 0;i<30000;i++); res = CH376DiskConnect( ); /* 查询U盘是否连接,返回USB_INT_SUCCESS则说明当前已连接 */ }while(res!=USB_INT_SUCCESS); printk(" Connect SUCCESS\r\n"); do{ for(i = 0;i<30000;i++); res = CH376DiskMount( ); /* 查询U盘或SD卡是否准备好,有些U盘可能需多次调用才能成功 */ }while(res!=USB_INT_SUCCESS); printk(" U is OK !\r\n"); s = CH376DiskCapacity(pU_D); mStopIfError( s ); printk(" U盘大小:"); printHex((unsigned int)U_D); printHex((unsigned int)(U_D>>16)); printk("\r\n"); s = CH376DiskQuery(pU_D); mStopIfError( s ); printk(" 剩余大小:"); printHex((unsigned int)U_D); printHex((unsigned int)(U_D>>16)); printk("\r\n"); strcpy( NameBuf, "\\2012.TXT" ); /* 目标文件名 */ #if 0 printf( "Open\r\n" ); s = CH376FileOpenPath( NameBuf ); mStopIfError( s ); if ( s == ERR_MISS_FILE ){ printf( "Create\r\n" ); s = CH376FileCreatePath( NameBuf ); /* 新建多级目录下的文件,支持多级目录路径,输入缓冲区必须在RAM中 */ mStopIfError( s ); } printf( "CH376ByteLocate\r\n" ); s = CH376ByteLocate(0xFFFFFFFF); mStopIfError( s ); printf( "Write\r\n" ); strcpy( buf, "时间 数据 ---\xd\n" ); s = CH376ByteWrite( buf, strlen(buf), NULL ); /* 以字节为单位向当前位置写入数据块 */ mStopIfError( s ); strcpy( buf, "2012-12-01 01 ---\xd\n" ); buf[9] = '0' + CountT; for(i = 0; i < 100;i ++){ buf[12] = '0' + i/10; buf[13] = '0' + i%10; printf( "Write %s" ,buf); s = CH376ByteWrite( buf, strlen(buf), NULL ); /* 以字节为单位向当前位置写入数据块 */ mStopIfError( s ); } printf( "Close\r\n" ); s = CH376FileClose( TRUE ); /* 关闭文件,对于字节读写建议自动更新文件长度 */ mStopIfError( s ); #endif /* 如果MY_ADC.TXT文件已经存在则添加数据到尾部,如果不存在则新建文件 */ printf( "Open\n" ); s = CH376FileOpen( NameBuf ); /* 打开文件,该文件在根目录下 */ if ( s == USB_INT_SUCCESS ) { /* 文件存在并且已经被打开,移动文件指针到尾部以便添加数据 */ printf( "File size = %ld\n", CH376GetFileSize( ) ); /* 读取当前文件长度 */ printf( "Locate tail\n" ); s = CH376ByteLocate( 0xFFFFFFFF ); /* 移到文件的尾部 */ mStopIfError( s ); } else if ( s == ERR_MISS_FILE ) { /* 没有找到文件,必须新建文件 */ printf( "Create\n" ); s = CH376FileCreate( NULL ); /* 新建文件并打开,如果文件已经存在则先删除后再新建,不必再提供文件名,刚才已经提供给CH376FileOpen */ mStopIfError( s ); } else mStopIfError( s ); /* 打开文件时出错 */ printf( "Write begin\n" ); s = sprintf( buf, "此前文件长度= %ld 字节\xd\xa", CH376GetFileSize( ) ); /* 注意字符串长度不能溢出buf,否则加大缓冲区或者分多次写入 */ s = CH376ByteWrite( buf, s, NULL ); /* 以字节为单位向文件写入数据 */ mStopIfError( s ); printf( "Write ADC data\n" ); printf( "Current offset ( file point ) is : "); for(i = 0;i<1000;i++){ s = sprintf( buf, "%02d.%02d.%02d.%d\xd\xa", 2012 + i/365, 1 + (i / 30) % 12, 1 + i % 30, i ); /* 将二制制数据格式为一行字符串 */ s = CH376ByteWrite( buf, s, NULL ); /* 以字节为单位向文件写入数据 */ /* 有些U盘可能会要求在写数据后等待一会才能继续操作, 所以,如果在某些U盘中发生数据丢失现象, 建议在每次写入数据后稍作延时再继续 */ for(j = 0;j<30;j++); mStopIfError( s ); printf( "\b\b\b\b\b\b" ); printf( "%6ld", CH376ReadVar32( VAR_CURRENT_OFFSET ) ); /* 读取当前文件指针 */ } printf( "Write end\n" ); strcpy( buf, "今天的ADC数据到此结束\xd\xa" ); s = CH376ByteWrite( buf, strlen( buf ), NULL ); /* 以字节为单位向文件写入数据 */ mStopIfError( s ); /* 如果实际产品中有实时时钟,可以根据需要将文件的日期和时间修改为实际值,参考EXAM10用CH376DirInfoRead/CH376DirInfoSave实现 */ printf( "Close\n" ); s = CH376FileClose( TRUE ); /* 关闭文件,自动计算文件长度,以字节为单位写文件,建议让程序库关闭文件以便自动更新文件长度 */ mStopIfError( s ); do{ for(i = 0;i<30000;i++); P1OUT_bit.P1OUT0 = 1; for(i = 0;i<30000;i++); P1OUT_bit.P1OUT0 = 0; res = CH376DiskConnect( ); /* 查询U盘是否连接,返回USB_INT_SUCCESS则说明当前已连接 */ }while(res!=ERR_DISK_DISCON); printk(" ERR_DISK_DISCON\r\n"); goto code_start; }
/* 设置将要操作的文件的文件名 */ uchar c; xWriteCH376Cmd( CMD10_SET_FILE_NAME ); c = *name; xWriteCH376Data(c); while (c) { name++; c = *name; if (c == DEF_SEPAR_CHAR1 || c == DEF_SEPAR_CHAR2) c = 0; /* 强行将文件名截止 */ xWriteCH376Data(c); } if (name[0] == DEF_SEPAR_CHAR1 || name[0] == DEF_SEPAR_CHAR2) CH376WriteVar32( VAR_CURRENT_CLUST, 0 ); return(CH376SendCmdWaitInt(CMD0H_FILE_OPEN)); } #define CMD1H_FILE_CLOSE 0x36 /* 主机文件模式: 关闭当前已经打开的文件或者目录(文件夹) */ uchar CH376FileClose(uchar UpdateSz) /* 关闭当前已经打开的文件或者目录(文件夹) */ { xWriteCH376Cmd(CMD1H_FILE_CLOSE); xWriteCH376Data(UpdateSz); return(Wait376Interrupt()); } #define CMD01_RD_USB_DATA0 0x27 /* 从当前USB中断的端点缓冲区或者主机端点的接收缓冲区读取数据块 */ uchar CH376ReadBlock(uchar * buf) /* 从当前主机端点的接收缓冲区读取数据块,返回长度 */ { uchar s, l; xWriteCH376Cmd(CMD01_RD_USB_DATA0); s = l = xReadCH376Data( ); /* 长度 */ if(l) { do { *buf = xReadCH376Data( ); buf ++; } while ( -- l ); } return( s ); } #define CMD2H_BYTE_READ 0x3A /* 主机文件模式: 以字节为单位从当前位置读取数据块 */ #define USB_INT_DISK_READ 0x1D /* USB存储器请求数据读出 */ #define CMD0H_BYTE_RD_GO 0x3B /* 主机文件模式: 继续字节读 */ uchar CH376ByteRead(uchar * buf, uint ReqCount, uint * RealCount ) /* 以字节为单位从当前位置读取数据块 */ { uchar s; xWriteCH376Cmd(CMD2H_BYTE_READ); xWriteCH376Data((uchar)ReqCount); xWriteCH376Data((uchar)(ReqCount>>8)); if (RealCount) *RealCount = 0; while ( 1 ) { s = Wait376Interrupt( ); if (s == USB_INT_DISK_READ) { s = CH376ReadBlock(buf); /* 从当前主机端点的接收缓冲区读取数据块,返回长度 */ xWriteCH376Cmd(CMD0H_BYTE_RD_GO); buf += s; if (RealCount) *RealCount += s; } else return(s); /* 错误 */ } } unsigned long CH376Read32bitDat( void ) /* 从CH376芯片读取32位的数据并结束命令 */ { uchar c0, c1, c2, c3; c0 = xReadCH376Data( ); c1 = xReadCH376Data( ); c2 = xReadCH376Data( ); c3 = xReadCH376Data( ); return(((unsigned long)c3 << 24) | ((unsigned long)c2 << 16) | ((unsigned long)c1 << 8) | c0 ); } #define CMD14_READ_VAR32 0x0C /* 读取指定的32位文件系统变量 */ unsigned long CH376ReadVar32(uchar var) /* 读CH376芯片内部的32位变量 */ { xWriteCH376Cmd(CMD14_READ_VAR32); xWriteCH376Data(var); return(CH376Read32bitDat( ) ); /* 从CH376芯片读取32位的数据并结束命令 */ } #define VAR_FILE_SIZE 0x68 /* 当前文件的长度(总长度32位,低字节在前) */ unsigned long CH376GetFileSize(void) /* 读取当前文件长度 */ { return(CH376ReadVar32(VAR_FILE_SIZE)); }