有關(guān)CH375V的問題,幫忙一下,謝謝!

U盤是FAT格式的,前幾天用CH375V來讀能不能讀出容量大小,但是打不開指定的文件,運(yùn)行到這兒i = CH375FileOpen();死了. 今天我再去試,發(fā)送連容量大小都讀不出來了,可能是那方面的原因?

你說的容量大小讀取不了,那前面的CH375LibInit(庫初始化)和 CH375DiskReady( 查詢磁盤是否準(zhǔn)備好)能正常通過嗎?操作不成功時(shí),你得查看一下返回的是什么錯(cuò)誤代碼。


可以正常通過,返回值是0X00,而且寫一個(gè)字節(jié),讀出來是反的也正確


你用的是什么單片機(jī)??(速度是多少??)還有就是 CH375DiskReady()這個(gè)函數(shù)你確定可以通過??


確定可以通過,返回是OXOO,我特意看了一下 用的是S3C44BOX,庫文件是CH375HF9.DLL,和CH375HF9.H


那你可以不可以將你的延時(shí)子程序(延時(shí)1US的函數(shù))以及三個(gè)讀寫子函數(shù)帖出來看下。


void xWriteCH375Cmd(U8 mCmd) /* 外部定義的被CH375程序庫調(diào)用的子程序,向CH375寫命令 */ { Delay(2); CH375Cmd = mCmd; Delay(2); }

void xWriteCH375Data(U8 mData) /* 外部定義的被CH375程序庫調(diào)用的子程序,向CH375寫數(shù)據(jù) */ { CH375Dat = mData ; Delay(2); }

U8 xReadCH375Data(void) /* 外部定義的被CH375程序庫調(diào)用的子程序,從CH375讀數(shù)據(jù) */ { U8 mData; Delay(2); mData = (U8)CH375Dat; return(mData); }

/**************************************************************************** 【功能說明】通用延時(shí)函數(shù),延時(shí)time個(gè)100us time=0: adjust the Delay function by WatchDog timer. time>0: the number of loop time 100us resolution. ****************************************************************************/ static int delayLoopCount=400; void Delay(int time) { int i,adjust=0;

if(time==0) { time=200; adjust=1; delayLoopCount=400; rWTCON=((MCLK/1000000-1)<<8)|(2<<3); //MCLK/1M,Watch-dog disable,1/64,interrupt disable,reset disable rWTDAT=0xffff;//for first update rWTCNT=0xffff;//resolution=64us @any MCLK rWTCON=((MCLK/1000000-1)<<8)|(2<<3)|(1<<5); //Watch-dog timer start }

for(;time>0;time--)

for(i=0;i if(adjust==1) { rWTCON=((MCLK/1000000-1)<<8)|(2<<3);//Watch-dog timer stop i=0xffff-rWTCNT; //1count->64us, 200*400 cycle runtime = 64*i us delayLoopCount=8000000/(i*64); //200*400:64*i=1*x:100 -> x=80000*100/(64*i) } } //*************************************************************************** 是這些吧?


很奇怪,幾天前還能讀出容量大小的,今天只讀出來OMB


void USBInit(void) { U8 i; CH375Reset(); Delay(500 ); /* 延時(shí)50ms */ i = CH375LibInit(); /* 初始化CH375程序庫和CH375芯片,操作成功返回0 */ mStopIfError(i); xWriteCH375Cmd(CMD_CHECK_EXIST); xWriteCH375Data(0x5A); i=xReadCH375Data(); if(i==0xA5) DebugPrintf("\nUSB Port is right!"); else DebugPrintf("\nUSB Port isn't exist!"); DebugPrintf("\nUSB initialized."); }

void USBMain(void) { U8 i, c, SecCount; U16 NewSize, count; /* 因?yàn)镽AM容量有限,所以NewSize限制為16位,實(shí)際上如果文件較大,應(yīng)該分幾次讀寫并且將NewSize改為UINT32以便累計(jì) */ U8 *pCodeStr; while(1) { /* 查詢CH375中斷并更新中斷狀態(tài),等待U盤插入 */ while(CH375DiskStatus!=DISK_CONNECT) Delay(200); OSIntEnter(); /* 檢查U盤是否準(zhǔn)備好,有些U盤不需要這一步,但是某些U盤必須要執(zhí)行這一步才能工作 */ /* 有的U盤總是返回未準(zhǔn)備好,不過可以被忽略 */ for (i=0; i<10; i++) { DebugPrintf("\nReady ?"); if(CH375DiskReady() == ERR_SUCCESS) break; /* 查詢磁盤是否準(zhǔn)備好 */ } /* 查詢磁盤物理容量 */ DebugPrintf("\nDiskSize"); i = CH375DiskSize(); mStopIfError(i); DebugPrintf("\nTotalSize = %d MB ", (unsigned int)(mCmdParam.DiskSize.mDiskSizeSec >> 11));

/* 讀取原文件 */ DebugPrintf("\nOpen"); strcpy((char *)mCmdParam.Open.mPathName, "\\C51\\CH375HFT.C"); /* 文件名,該文件在C51子目錄下 */ i = CH375FileOpen(); /* 打開文件 */ if ( i == ERR_MISS_DIR || i == ERR_MISS_FILE ) { /* 沒有找到文件,列出文件 */ if (i == ERR_MISS_DIR) pCodeStr = (U8 *)"\\*"; /* C51子目錄不存在則列出根目錄下的文件 */ else pCodeStr = (U8 *)"\\C51\\CH375*"; /* CH375HFT.C文件不存在則列出\C51子目錄下的以CH375開頭的文件 */ DebugPrintf("\nList file %s", pCodeStr); /* 最多搜索前255個(gè)文件 */ for (c=0;c<255;c++) { strcpy( (char *)mCmdParam.Open.mPathName, (char *)pCodeStr); /* 搜索文件名,*為通配符,適用于所有文件或者子目錄 */ i = strlen((char const *)mCmdParam.Open.mPathName); /* 計(jì)算文件名長度,以處理文件名結(jié)束符 */ mCmdParam.Open.mPathName[i] = c; /* 根據(jù)字符串長度將結(jié)束符替換為搜索的序號(hào),從0到255 */ i = CH375FileOpen(); /* 打開文件,如果文件名中含有通配符*,則為搜索文件而不打開 */ if (i == ERR_MISS_FILE) break; /* 再也搜索不到匹配的文件,已經(jīng)沒有匹配的文件名 */ /* 搜索到與通配符相匹配的文件名,文件名及其完整路徑在命令緩沖區(qū)中 */ if (i == ERR_FOUND_NAME) { DebugPrintf("\n match file %03d#: %s", (unsigned int)c, mCmdParam.Open.mPathName); /* 顯示序號(hào)和搜索到的匹配文件名或者子目錄名 */ continue; /* 繼續(xù)搜索下一個(gè)匹配的文件名,下次搜索時(shí)序號(hào)會(huì)加1 */ } else { mStopIfError(i); break; } } pCodeStr = (U8 *)"找不到/C51/CH375HFT.C文件\xd\n"; for (i = 0;i != 255;i++) { if((FILE_DATA_BUF[i] = *pCodeStr)== 0) break; pCodeStr++; } NewSize = i; /* 新文件的長度 */ SecCount = 1; /* (NewSize+511)/512, 計(jì)算文件的扇區(qū)數(shù),因?yàn)樽x寫是以扇區(qū)為單位的 */ } else { /* 找到文件或者出錯(cuò) */ mStopIfError(i); /*printf( "Query\n" ); i = CH375FileQuery( ); mStopIfError( i );*/ DebugPrintf("\nRead"); if ( CH375vFileSize > FILE_DATA_BUF_LEN ) { SecCount = FILE_DATA_BUF_LEN / 512; /* 由于演示板用的62256只有32K字節(jié),其中CH375子程序用512字節(jié),所以只讀取不超過63個(gè)扇區(qū),也就是不超過32256字節(jié) */ NewSize = FILE_DATA_BUF_LEN; } else { /* 如果原文件較小,那么使用原長度 */ SecCount = (CH375vFileSize + 511) >> 9; /* (CH375vFileSize+511)/512, 計(jì)算文件的扇區(qū)數(shù),因?yàn)樽x寫是以扇區(qū)為單位的,先加511是為了讀出文件尾部不足1個(gè)扇區(qū)的部分 */ NewSize = (U16)CH375vFileSize; /* 原文件的長度 */ } DebugPrintf( "\nSize=%ld, Len=%d, Sec=%d", CH375vFileSize, NewSize, (U16)SecCount ); mCmdParam.Read.mSectorCount = SecCount; /* 讀取全部數(shù)據(jù),如果超過60個(gè)扇區(qū)則只讀取60個(gè)扇區(qū) */ /*current_buffer = & FILE_DATA_BUF[0]; 如果文件讀寫的數(shù)據(jù)的復(fù)制方式為"外部子程序",那么需要設(shè)置存放數(shù)據(jù)的緩沖區(qū)的起始地址 */ CH375vFileSize += 511; /* 默認(rèn)情況下,以扇區(qū)方式讀取數(shù)據(jù)時(shí),無法讀出文件尾部不足1個(gè)扇區(qū)的部分,所以必須臨時(shí)加大文件長度以讀取尾部零頭 */ i = CH375FileRead(); /* 從文件讀取數(shù)據(jù) */ CH375vFileSize -= 511; /* 恢復(fù)原文件長度 */ mStopIfError(i); /*如果文件比較大,一次讀不完,可以再調(diào)用CH375FileRead繼續(xù)讀取,文件指針自動(dòng)向后移動(dòng) while ( 1 ) { c = 32; 每次讀取32個(gè)扇區(qū) mCmdParam.Read.mSectorCount = c; 指定讀取的扇區(qū)數(shù) CH375FileRead(); 讀完后文件指針自動(dòng)后移 處理數(shù)據(jù) if ( mCmdParam.Read.mSectorCount < c ) break; 實(shí)際讀出的扇區(qū)數(shù)較小則說明文件已經(jīng)結(jié)束 }

如果希望從指定位置開始讀寫,可以移動(dòng)文件指針 mCmdParam.Locate.mSectorOffset = 3; 跳過文件的前3個(gè)扇區(qū)開始讀寫 i = CH375FileLocate( ); mCmdParam.Read.mSectorCount = 10; CH375FileRead(); 直接讀取從文件的第(512*3)個(gè)字節(jié)開始的數(shù)據(jù),前3個(gè)扇區(qū)被跳過

如果希望將新數(shù)據(jù)添加到原文件的尾部,可以移動(dòng)文件指針 i = CH375FileOpen( ); mCmdParam.Locate.mSectorOffset = 0xffffffff; 移到文件的尾部,以扇區(qū)為單位,如果原文件是3字節(jié),則從512字節(jié)開始添加 i = CH375FileLocate( ); mCmdParam.Write.mSectorCount = 10; CH375FileWrite(); 在原文件的后面添加數(shù)據(jù) */ DebugPrintf("\nClose"); i = CH375FileClose(); /* 關(guān)閉文件 */ mStopIfError(i);

i = FILE_DATA_BUF[100]; FILE_DATA_BUF[100] = 0; /* 置字符串結(jié)束標(biāo)志,最多顯示500個(gè)字符 */ DebugPrintf("\nLine 1: %s", FILE_DATA_BUF); FILE_DATA_BUF[100] = i; /* 恢復(fù)原字符 */ for(count=0; count { /* 將文件中的小寫字符轉(zhuǎn)換為大寫 */ c = FILE_DATA_BUF[ count ]; if (c >= 'a' && c <= 'z') FILE_DATA_BUF[count] = c - ('a' - 'A'); } }

//#ifdef EN_DISK_WRITE /* 子程序庫支持寫操作 */ /* 產(chǎn)生新文件 */ // printf( "Create\n" ); // strcpy( (char *)mCmdParam.Create.mPathName, "\\NEWFILE.TXT" ); /* 新文件名,在根目錄下 */ // i = CH375FileCreate( ); /* 新建文件并打開,如果文件已經(jīng)存在則先刪除后再新建 */ // mStopIfError( i ); // printf( "Write\n" ); // mCmdParam.Write.mSectorCount = SecCount; /* 寫入所有扇區(qū)的數(shù)據(jù) */ /* current_buffer = & FILE_DATA_BUF[0]; 如果文件讀寫的數(shù)據(jù)的復(fù)制方式為"外部子程序",那么需要設(shè)置存放數(shù)據(jù)的緩沖區(qū)的起始地址 */ // i = CH375FileWrite( ); /* 向文件寫入數(shù)據(jù) */ // mStopIfError( i ); // printf( "Modify\n" ); // mCmdParam.Modify.mFileAttr = 0xff; /* 輸入?yún)?shù): 新的文件屬性,為0FFH則不修改 */ // mCmdParam.Modify.mFileTime = 0xffff; /* 輸入?yún)?shù): 新的文件時(shí)間,為0FFFFH則不修改,使用新建文件產(chǎn)生的默認(rèn)時(shí)間 */ // mCmdParam.Modify.mFileDate = MAKE_FILE_DATE( 2004, 5, 18 ); /* 輸入?yún)?shù): 新的文件日期: 2004.05.18 */ // mCmdParam.Modify.mFileSize = NewSize; /* 輸入?yún)?shù): 如果原文件較小,那么新的文件長度與原文件一樣長,否則被RAM所限,如果文件長度大于64KB,那么NewSize必須為UINT32 */ // i = CH375FileModify( ); /* 修改當(dāng)前文件的信息,修改日期和長度 */ // mStopIfError( i ); // printf( "Close\n" ); // mCmdParam.Close.mUpdateLen = 0; /* 不要自動(dòng)計(jì)算文件長度,如果自動(dòng)計(jì)算,那么該長度總是512的倍數(shù) */ // i = CH375FileClose( ); // mStopIfError( i );

/* 刪除某文件 */ /* printf( "Erase\n" ); strcpy( (char *)mCmdParam.Create.mPathName, "\\OLD" ); 將被刪除的文件名,在根目錄下 i = CH375FileErase( ); 刪除文件并關(guān)閉 if ( i != ERR_SUCCESS ) printf( "Error: %02X\n", (UINT16)i ); 顯示錯(cuò)誤 *//* 查詢磁盤信息 */ // printf( "Disk\n" ); // i = CH375DiskQuery( ); // mStopIfError( i ); // printf( "Fat=%d, Total=%ld, Free=%ld\n", (UINT16)mCmdParam.Query.mDiskFat, mCmdParam.Query.mTotalSector, mCmdParam.Query.mFreeSector ); //#endif OSIntExit(); Delay(200); DebugPrintf("\n請拔出U盤!"); while (CH375DiskStatus != DISK_DISCONNECT) xQueryInterrupt(); /* 查詢CH375中斷并更新中斷狀態(tài),等待U盤拔出 */ Delay(200); }

}


延時(shí)如果準(zhǔn)確的話,那么讀寫子函數(shù)應(yīng)該沒有什么問題,那么在打開文件的時(shí)候死在庫里面還是返回了錯(cuò)誤代碼?如果返回,那么請看下返回的錯(cuò)誤代碼是多少?


是死在庫里面了


庫文件能不能給源碼來調(diào)試看看


CH375V會(huì)不會(huì)有問題?


再幫忙分析一下,同過反匯編看是一直在循環(huán)這個(gè)函數(shù)里了 void xQueryInterrupt( void ) /* 查詢中斷狀態(tài),等待硬件中斷 */ { while ( CH375IntStatus == 0 ); /* 子程序庫調(diào)用該子程序之前CH375IntStatus=0,硬件中斷后,由中斷服務(wù)程序置為非0的實(shí)際中斷狀態(tài)后返回 */ }


實(shí)際在操作的時(shí)候,DISK_READY()函數(shù)和FILE_OPEN函數(shù)的差別就在于多用了一個(gè)DISK_BASE_BUF這個(gè)緩沖區(qū),所以建議你先檢查下你的RAM會(huì)不會(huì)有問題,最簡單的方法就是往DISK_BASE_BUF緩沖區(qū)里面寫隨即的數(shù),在讀出來進(jìn)行比較看會(huì)不會(huì)出錯(cuò),還有就是你的使用ADS1。2編譯的時(shí)候,是使用小端模式編譯的吧


是的,小端模式


只有登錄才能回復(fù),可以選擇微信賬號(hào)登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频