單片機:32K代碼空間,256+2K內(nèi)存,24M主頻1T高速。 單片機與CH376接口:并口(模擬),INT0中斷。 CH376與SD卡接口:4線SPI接口。
目前已經(jīng)可以在U盤或SD卡內(nèi)部拷貝文件。 想實現(xiàn)將SD卡文件復制到U盤中,暫時定義了1K緩存,發(fā)現(xiàn)只能復制1K數(shù)據(jù),之后的數(shù)據(jù)不能復制。估計是模式切換前后的問題。
請指導一下,如何才能?如能提供示例最好,不勝感激!
單片機:32K代碼空間,256+2K內(nèi)存,24M主頻1T高速。 單片機與CH376接口:并口(模擬),INT0中斷。 CH376與SD卡接口:4線SPI接口。
目前已經(jīng)可以在U盤或SD卡內(nèi)部拷貝文件。 想實現(xiàn)將SD卡文件復制到U盤中,暫時定義了1K緩存,發(fā)現(xiàn)只能復制1K數(shù)據(jù),之后的數(shù)據(jù)不能復制。估計是模式切換前后的問題。
請指導一下,如何才能?如能提供示例最好,不勝感激!
發(fā)現(xiàn)只能復制1K數(shù)據(jù),之后的數(shù)據(jù)不能復制? 請詳細說明復制1K數(shù)據(jù)后出現(xiàn)什么現(xiàn)象。
讀取SD卡文件開始,ByteCount=0---- SD卡初始化.... 打開源文件.... 字節(jié)地址定位.... 讀源文件到緩沖區(qū).... 階段讀取完成.... 寫入U盤開始.... U盤初始化.... 新建一個目標文件.... 從緩沖區(qū)寫入U盤.... 關閉目標文件.... 讀取SD卡文件開始,ByteCount=0---- //這里不知為何是0 SD卡初始化.... 打開源文件.... 字節(jié)地址定位.... 讀源文件到緩沖區(qū).... 階段讀取完成.... 寫入U盤開始.... U盤初始化.... //此時再次初始化時,感覺時間較長 打開目標文件.... 返回值為:16896,請拔出U盤 //再次打開文件時出錯
附件中是一個用CH376實現(xiàn)SD卡和U盤之間數(shù)據(jù)對拷的例程, 請參考 UploadImages/201191311273957.rar
非常感謝!
上面的程序經(jīng)過驗證了嗎?我這里還是不能成功。 先保持原樣,不能成功,后將2個模式設置里的磁盤初始化加上(原先被注釋掉的部分),僅能夠復制一部分數(shù)據(jù)。
上面的程序測試過的,可以正常使用, 有沒有測試過 單獨讀寫U盤和SD卡文件的操作。 復制一部分,那么中間有沒有報錯,文件復制的速度會比較慢
不進行模式切換,單獨操作U盤或SD卡都沒問題。以下是我的調(diào)試程序
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 ){ //文件存在并且已經(jīng)被打開 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){ //文件存在并且已經(jīng)被打開,以字節(jié)方式移動文件指針以便讀取后續(xù)數(shù)據(jù) s = CH376ByteLocate( Count ); //移動到上次讀取文件的末尾 CH376ByteRead( buf, sizeof(buf), &len ); // 以字節(jié)為單位從當前位置讀取數(shù)據(jù)塊,請求長度同緩沖區(qū)大小,返回實際長度在ThisLen中 Count += len; //計數(shù)已經(jīng)讀取的字節(jié)數(shù) //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 ){ //文件存在并且已經(jīng)被打開 s = CH376ByteLocate( 0xffffffff ); //移動文件指針到尾部以便添加數(shù)據(jù) s = CH376ByteWrite( buf, len, NULL ); //以字節(jié)為單位向文件寫入數(shù)據(jù) 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 ); //以字節(jié)為單位向文件寫入數(shù)據(jù) 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( ); //模式設置成功 應返回操作成功狀態(tài)(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( ); //模式設置成功 應返回操作成功狀態(tài)(0x51) // xEndCH376Cmd( ); // for ( s = 0; s < 10; s ++ ) { /* 最長等待時間,10*50mS */ // mDelaymS( 50 ); // printf( "Ready ?\n" ); // if ( CH376DiskMount( ) == USB_INT_SUCCESS ) break; /* 初始化磁盤并測試磁盤是否就緒 */ // } }
/*以下是通過串口監(jiān)視到的信息 U盤初始化并等待就緒 Ready ? SD初始化并等待就緒 Ready ? 開始復制文件 讀取文件長度 打開源文件并讀出 打開目標文件并寫入 Create 打開源文件并讀出 打開目標文件并寫入 打開源文件并讀出 打開目標文件并寫入 //此后持續(xù)了大約幾秒 Error: 82 */ //U盤文件已經(jīng)生成,但僅寫入了1個字節(jié)
單片機的速度比較快,設置完模式之后延時1ms在讀取返回的狀態(tài)試試。 //用單片機將CH376設置成讀寫U盤模式 void CH376_UDisk_Mode( ){ UINT8 s; xWriteCH376Cmd( CMD11_SET_USB_MODE ); /* 設備USB工作模式 */ xWriteCH376Data( 0x06 ); //0x06模式 mDelaymS( 1 ); xReadCH376Data( ); //模式設置成功 應返回操作成功狀態(tài)(0x51) // xEndCH376Cmd( ); // for ( s = 0; s < 10; s ++ ) { /* 最長等待時間,10*50mS */ // mDelaymS( 50 ); // printf( "Ready ?\n" ); // if ( CH376DiskMount( ) == USB_INT_SUCCESS ) break; /* 初始化磁盤并測試磁盤是否就緒 */ // } }
估計是指令速度太快的原因,發(fā)現(xiàn)在模式切換之前加入適當?shù)难訒r,已經(jīng)可以成功了,正在摸索中。。。 感謝您的指導
收藏
請問可不可以重新發(fā)一下這個例程?
現(xiàn)在無法打開了。