完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
您好,使用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; } } |
|
|
|
只有小组成员才能发言,加入小组>>
463 浏览 1 评论
CH579M+RT-Thread,RTC从Sleep模式唤醒失败是什么原因?
2868 浏览 2 评论
2357 浏览 1 评论
807浏览 2评论
CH569通过HSPI实现USB3.0和FPGA高速双向通讯
630浏览 1评论
491浏览 1评论
CH32F103C8T6使用当前官网上的CDC例程会出现设备描述符请求失败
356浏览 1评论
630浏览 1评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 00:15 , Processed in 1.024567 second(s), Total 79, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号