[求助]求一份CH376 U盘和SD卡数据互相转存的例程

求一份CH376 U盘和SD卡数据互相转存的例程,谢谢

您好,使用CH376做SD卡和U盘数据互传需要不断的切换模式,导致速度比较慢,不建议这么使用。代码可以参考该链接http://www.wch.cn/index.php/bbs/thread-51696-1.html,代码如下

UINT8 xdata buf[1024]; 
//用单片机将CH376设置成读写SD卡模式( 模式3 ) 
void CH376_SD_Mode( ){ 
UINT8 s; 
xWriteCH376Cmd( CMD11_SET_USB_MODE ); /* 设备USB工作模式 */ 
xWriteCH376Data( 0x03 ); //操作SD卡模式(0x03) 
mDelaymS( 1 );  
xReadCH376Data( ); //模式设置成功 应返回操作成功状态(0x51) 
xEndCH376Cmd( ); 
for ( s = 0; s < 10; s ++ ) { /* 最长等待时间,10*50mS */ 
mDelaymS( 50 ); 
printf( "Ready ?\n" ); 
if ( CH376DiskMount( ) == USB_INT_SUCCESS ) break; /* 初始化磁盘并测试磁盘是否就绪 */ 



//用单片机将CH376设置成读写U盘模式 
void CH376_UDisk_Mode( ){ 
UINT8 s; 
xWriteCH376Cmd( CMD11_SET_USB_MODE ); /* 设备USB工作模式 */ 
xWriteCH376Data( 0x06 ); //0x06模式 
mDelaymS( 1 ); 
xReadCH376Data( ); //模式设置成功 应返回操作成功状态(0x51) 
xEndCH376Cmd( ); 
for ( s = 0; s < 10; s ++ ) { /* 最长等待时间,10*50mS */ 
mDelaymS( 50 ); 
printf( "Ready ?\n" ); 
if ( CH376DiskMount( ) == USB_INT_SUCCESS ) break; /* 初始化磁盘并测试磁盘是否就绪 */ 


UINT8 Copy_SD_TO_UDisk(PUINT8 SourName, PUINT8 TarName ){ 
UINT8 s; 
UINT16 len; 
UINT32 Count,FileSize; 

CH376_SD_Mode( ); //设置成SD模式 
printf(" 读取文件长度 \n"); 
s = CH376FileOpen( SourName ); //打开文件,该文件在根目录下 
if ( s == USB_INT_SUCCESS ){ //文件存在并且已经被打开 
FileSize = CH376GetFileSize( ); //读取当前文件长度 
//mStopIfError( s ); 
}else{ //源文件不存在 出错 
printf(" no SourName \n"); 
return ( s ); 

//以上操作主要是为了获取源文件的 文件大小FileSize. 

Count=0; 
do{ 
printf(" 打开源文件并读出 \n"); 
CH376_SD_Mode( ); //切换到SD模式 
s = CH376FileOpen( SourName ); //打开文件,该文件在根目录下 
if (s==USB_INT_SUCCESS){ //文件存在并且已经被打开,以字节方式移动文件指针以便读取后续数据 
s = CH376ByteLocate( Count ); //移动到上次读取文件的末尾 
CH376ByteRead( buf, sizeof(buf), &len ); // 以字节为单位从当前位置读取数据块,请求长度同缓冲区大小,返回实际长度在ThisLen中 
Count += len; //计数已经读取的字节数 
//s = CH376FileClose( FALSE ); //对于读取文件,是否关闭文件可选操作。 
mStopIfError( s ); 
}else { 
printf("Open file error %02x \n",(UINT16)s); 
return s; 


printf(" 打开目标文件并写入 \n"); 
CH376_UDisk_Mode( ); //切换到U盘模式 
s = CH376FileOpen( TarName ); //打开文件,该文件在根目录下 
if ( s == USB_INT_SUCCESS ){ //文件存在并且已经被打开 
s = CH376ByteLocate( 0xffffffff ); //移动文件指针到尾部以便添加数据 
s = CH376ByteWrite( buf, len, NULL ); //以字节为单位向文件写入数据 
mStopIfError( s ); 
s = CH376FileClose( TRUE ); //关闭文件 
mStopIfError( s ); 
}else if ( s == ERR_MISS_FILE ){ //没有找到文件,必须新建文件 
printf( "Create\n" ); 
s = CH376FileCreate( NULL ); //新建文件并打开 
mStopIfError( s ); 
s = CH376ByteWrite( buf, len, NULL ); //以字节为单位向文件写入数据 
mStopIfError( s ); 
s = CH376FileClose( TRUE ); // 关闭文件 
mStopIfError( s ); 
}else return s; 
}while(Count < FileSize); 
return ( 0x95 ); //文件复制成功 


main(){ 
UINT8 s;
Init_Device(); //设备初始化 
ES0=0; TI0=1; TXEN=0; 
mDelaymS(10); //延时10毫秒 
CH376_RSTI=0; //CH376复位 
mDelaymS(100); //延时100毫秒 
s=mInitCH376Host(); //初始化CH376 
mStopIfError(s); //如果错误就停止 

while (1){ 
if(CH376DiskConnect() == USB_INT_SUCCESS ) { //检查U盘是否连接,等待U盘插入 
TXEN=1; 
mDelaymS(100); 
printf(" U盘初始化并等待就绪 \n"); 
for ( s = 0; s < 10; s ++ ) { //最长等待时间,10*50mS 
mDelaymS( 50 ); 
printf( "Ready ?\n" ); 
if(CH376DiskMount()==USB_INT_SUCCESS) break; //初始化磁盘并测试磁盘是否就绪 

mDelaymS( 200 ); // 延时,可选操作,有的USB存储器需要几十毫秒的延时 

printf(" SD初始化并等待就绪 \n"); 
CH376_SD_Mode( ); //将CH376设置成SD卡模式 
for ( s = 0; s < 10; s ++ ) { // 最长等待时间,10*50mS 
mDelaymS( 50 ); 
printf( "Ready ?\n" ); 
if(CH376DiskMount()==USB_INT_SUCCESS) break; //初始化磁盘并测试磁盘是否就绪 


printf(" 开始复制文件 \n"); 
s = Copy_SD_TO_UDisk("\\CH376HFT.C","\\CH376HFT.TXT"); 
if(s == 0x95 ) 
printf("copy file success \n"); else printf("copy file error %02x \n",(UINT16)s); 

printf(" 请取出U盘 \n"); 
while(CH376DiskConnect()==USB_INT_SUCCESS) mDelaymS(100); //检查U盘连接,等待U盘拔出 
TXEN=0; 

//完成后LED闪烁 
mDelaymS(500); 
LED=!LED; 


只有登录才能回复,可以选择微信账号登录