[求助]CH376怎样同时管理U盘和SD卡?

单片机:32K代码空间,256+2K内存,24M主频1T高速。 单片机与CH376接口:并口(模拟),INT0中断。 CH376与SD卡接口:4线SPI接口。

目前已经可以在U盘或SD卡内部拷贝文件。 想实现将SD卡文件复制到U盘中,暂时定义了1K缓存,发现只能复制1K数据,之后的数据不能复制。估计是模式切换前后的问题。

请指导一下,如何才能?如能提供示例最好,不胜感激!

发现只能复制1K数据,之后的数据不能复制? 请详细说明复制1K数据后出现什么现象。


读取SD卡文件开始,ByteCount=0---- SD卡初始化.... 打开源文件.... 字节地址定位.... 读源文件到缓冲区.... 阶段读取完成.... 写入U盘开始.... U盘初始化.... 新建一个目标文件.... 从缓冲区写入U盘.... 关闭目标文件.... 读取SD卡文件开始,ByteCount=0---- //这里不知为何是0 SD卡初始化.... 打开源文件.... 字节地址定位.... 读源文件到缓冲区.... 阶段读取完成.... 写入U盘开始.... U盘初始化.... //此时再次初始化时,感觉时间较长 打开目标文件.... 返回值为:16896,请拔出U盘 //再次打开文件时出错


附件中是一个用CH376实现SD卡和U盘之间数据对拷的例程, 请参考 UploadImages/201191311273957.rar


非常感谢!


上面的程序经过验证了吗?我这里还是不能成功。 先保持原样,不能成功,后将2个模式设置里的磁盘初始化加上(原先被注释掉的部分),仅能够复制一部分数据。


上面的程序测试过的,可以正常使用, 有没有测试过 单独读写U盘和SD卡文件的操作。 复制一部分,那么中间有没有报错,文件复制的速度会比较慢


不进行模式切换,单独操作U盘或SD卡都没问题。以下是我的调试程序

UINT8 xdata buf[1024]; 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; } }

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 ); //文件复制成功 }

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

/*以下是通过串口监视到的信息 U盘初始化并等待就绪 Ready ? SD初始化并等待就绪 Ready ? 开始复制文件 读取文件长度 打开源文件并读出 打开目标文件并写入 Create 打开源文件并读出 打开目标文件并写入 打开源文件并读出 打开目标文件并写入 //此后持续了大约几秒 Error: 82 */ //U盘文件已经生成,但仅写入了1个字节


单片机的速度比较快,设置完模式之后延时1ms在读取返回的状态试试。 //用单片机将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; /* 初始化磁盘并测试磁盘是否就绪 */ // } }


估计是指令速度太快的原因,发现在模式切换之前加入适当的延时,已经可以成功了,正在摸索中。。。 感谢您的指导


收藏


image.png

请问可不可以重新发一下这个例程?

现在无法打开了。



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