WCH沁恒单片机
直播中

维生素B2

12年用户 970经验值
私信 关注
[问答]

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

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

回帖(1)

李猛

2022-7-13 10:47:03
您好,使用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( "Createn" );
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;
}
}
举报

更多回帖

发帖
×
20
完善资料,
赚取积分