[求助]請hcn大哥幫我看一下

當我的程序運行到/* 查詢磁盤物理容量 */這部分時候,就報錯了: DiskSize Error: 2C TotalSize = 0 MB

請問是什么原因呢? 我的部分程序如下:

/* 檢查操作狀態(tài),如果錯誤則顯示錯誤代碼并停機 */ void mStopIfError( UINT8 iError ) { if ( iError == ERR_SUCCESS ) return; /* 操作成功 */ printf( "Error: %02X\n", (UINT16)iError ); /* 顯示錯誤 */ }

/* 查詢磁盤物理容量 */ printf( "DiskSize\n" ); i = CH375DiskSize( ); mStopIfError( i ); printf( "TotalSize = %u MB \n", (unsigned int)( mCmdParam.DiskSize.mDiskSizeSec >> 11 ) ); //顯示為以MB為單位的容量

你的DISK-READY()過了沒有?


這是我的源程序 請你幫我看看: /* CH375 主機文件系統(tǒng)接口 */ /* 支持: FAT16 */

/* MCS-51單片機C語言的U盤文件讀寫示例程序, 適用于89C52或者更大程序空間的單片機 */ /* 該程序?qū)盤中的/C51/CH375HFT.C文件中的小寫字母轉(zhuǎn)成大寫字母后, 寫到新建的文件NEWFILE.TXT中, 如果找不到原文件CH375HFT.C, 那么該程序?qū)@示C51子目錄下所有以CH375開頭的文件名, 并新建NEWFILE.TXT文件并寫入提示信息, 如果找不到C51子目錄, 那么該程序?qū)@示根目錄下的所有文件名, 并新建NEWFILE.TXT文件并寫入提示信息 */ /* CH375的INT#引腳采用查詢方式處理, 數(shù)據(jù)復制方式為"單DPTR復制", 所以速度較慢, 適用于所有MCS51單片機 */

#include #include #include #include

/* 以下定義的詳細說明請看CH375HF4.H文件 */ #define LIB_CFG_DISK_IO 1 /* 磁盤讀寫的數(shù)據(jù)的復制方式,1為"單DPTR復制",2為"雙DPTR復制",3為"單DPTR和P2+R0復制" */ #define LIB_CFG_FILE_IO 1 /* 文件讀寫的數(shù)據(jù)的復制方式,0為"外部子程序",1為"單DPTR復制",2為"雙DPTR復制",3為"單DPTR和P2+R0復制" */ #define LIB_CFG_INT_EN 0 /* CH375的INT#引腳連接方式,0為"查詢方式",1為"中斷方式" */

#define CH375_CMD_PORT_ADDR 0x7FFF /* CH375命令端口的I/O地址 */ #define CH375_DAT_PORT_ADDR 0x7EFF /* CH375數(shù)據(jù)端口的I/O地址 */ #define DISK_BASE_BUF_ADDR 0x0000 /* 外部RAM的磁盤數(shù)據(jù)緩沖區(qū)的起始地址,從該單元開始的緩沖區(qū)長度為SECTOR_SIZE */ unsigned char xdata FILE_DATA_BUF_ADDR[512] _at_ 0x0000; /* 外部RAM的文件數(shù)據(jù)緩沖區(qū)的起始地址,緩沖區(qū)長度不小于一次讀寫的數(shù)據(jù)長度 */ #define FILE_DATA_BUF_LEN 0x0200 /* 外部RAM的文件數(shù)據(jù)緩沖區(qū),緩沖區(qū)長度不小于一次讀寫的數(shù)據(jù)長度 */

#define CH375_INT_WIRE INT1 /* P3.3, INT1, CH375的中斷線INT#引腳,連接CH375的INT#引腳,用于查詢中斷狀態(tài) */ #include "CH375INC.H" #include "CH375HF4.H" #include "ram.h" #define uchar unsigned char; #define uint unsigned int;

sfr AUXR = 0x8E;

uchar Counter; //數(shù)組的長度值 uchar Mid ; //發(fā)送數(shù)據(jù)的暫存變量

UINT16 start; //全局變量確定圖片數(shù)據(jù)的開始位置

/* 延時2微秒,不精確 */ void delay2us( ) { unsigned char i; for ( i = 2; i != 0; i -- ); }

/* 延時1微秒,不精確 */ void delay1us( ) { unsigned char i; for ( i = 1; i != 0; i -- ); }

void delay( unsigned char i ) { unsigned char k; for( k = i ; k > 0 ; k-- ); }

/* 延時100毫秒,不精確 */ void mDelay100mS( ) { UINT8 i, j, c; for ( i = 200; i != 0; i -- ) for ( j = 200; j != 0; j -- ) c+=3; }

UINT8 mCopyCodeStringToIRAM_i( UINT8 idata *iDestination, UINT8 idata *iSource ) { UINT8 i = 0; while ( *iDestination = *iSource ) { iDestination ++; iSource ++; i ++; } return( i ); }

/* 將程序空間的字符串復制到內(nèi)部RAM中,返回字符串長度 */ UINT8 mCopyCodeStringToIRAM( UINT8 idata *iDestination, UINT8 code *iSource ) { UINT8 i = 0; while ( *iDestination = *iSource ) { iDestination ++; iSource ++; i ++; } return( i ); }

/* 檢查操作狀態(tài),如果錯誤則顯示錯誤代碼并停機 */ void mStopIfError( UINT8 iError ) { if ( iError == ERR_SUCCESS ) return; /* 操作成功 */ printf( "Error: %02X\n", (UINT16)iError ); /* 顯示錯誤 */ }

/* 為printf和getkey輸入輸出初始化串口 */ void mInitSTDIO( ) { SCON = 0x50; PCON = 0x80; TMOD = 0x21; TH1 = -6; /* 11.0592MHz晶振, 19200bps */ TR1 = 1; TI = 1; } /////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////

main( ) { // UINT8 c; UINT16 SecCount; /* 因為圖片只有8KB,所以NewSize限制為16位,實際上如果文件大于32256字節(jié),應該分幾次讀寫并且將NewSize改為UINT32以便累計 */ UINT32 NewSize; unsigned char i; unsigned int Count = 0; unsigned int TotleSize = 0; AUXR = 0x00;

while(1) { mInitSTDIO( ); /* 為了讓計算機通過串口監(jiān)控演示過程 */

printf( "Start\n" ); i = CH375LibInit( ); /* 初始化CH375程序庫和CH375芯片,操作成功返回0 */ // i = mCH375Init( ); /* 初始化CH375程序庫和CH375芯片,操作成功返回0 */ printf( "%d\n",i ); mStopIfError( i ); /* 其它電路初始化 */ printf( "Wait Udisk\n" ); while ( CH375DiskStatus != DISK_CONNECT ) xQueryInterrupt( ); /* 查詢CH375中斷并更新中斷狀態(tài),等待U盤插入 */ mDelay100mS( ); /* 延時,可選操作,有的USB存儲器需要幾十毫秒的延時 */ mDelay100mS( );

/* 檢查U盤是否準備好,有些U盤不需要這一步,但是某些U盤必須要執(zhí)行這一步才能工作 */ for ( i = 0; i < 10; i ++ ) /* 有的U盤總是返回未準備好,不過可以被忽略 */ { mDelay100mS( ); printf( "Ready ?\n" ); if ( CH375DiskReady( ) == ERR_SUCCESS ) //break; /* 查詢磁盤是否準備好 */ { printf("OK") ; } else printf("jing gao\n") ; break; /* 查詢磁盤是否準備好 */ }

/////////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////// /* 查詢磁盤物理容量 */

printf( "DiskSize\n" ); i = CH375DiskSize( ); mStopIfError( i ); printf( "TotalSize = %u MB \n", (unsigned int)( mCmdParam.DiskSize.mDiskSizeSec >> 11 ) ); //顯示為以MB為單位的容量 /* 讀取Road.txt文件*/ printf( "Open SAVEDATA.bin\n" ); mCopyCodeStringToIRAM( mCmdParam.Open.mPathName, "\\SAVEDATA.BIN" ); i = CH375FileOpen( ); mStopIfError( i ); printf( "Road\n" ); if ( CH375vFileSize > FILE_DATA_BUF_LEN ) { SecCount = FILE_DATA_BUF_LEN / 512; //由于演示板用的62256只有32K字節(jié),其中CH375子程序用512字節(jié),所以只讀取不超過63個扇區(qū),也就是不超過32256字節(jié) NewSize = FILE_DATA_BUF_LEN; // 由于RAM有限所以限制長度 } else { // 如果原文件較小,那么使用原長度 SecCount = ( CH375vFileSize + 511 ) / 512; // (CH375vFileSize+511)/512, 計算文件的扇區(qū)數(shù),因為讀寫是以扇區(qū)為單位的,先加511是為了讀出文件尾部不足1個扇區(qū)的部分 NewSize = CH375vFileSize; // 原文件的長度 } printf( "Size=%ld, Len=%ld, Sec=%d\n", CH375vFileSize, NewSize, SecCount );

TotleSize = CH375vFileSize;

SecCount = 1;

mCmdParam.Read.mSectorCount = SecCount; //讀取全部數(shù)據(jù),如果超過60個扇區(qū)則只讀取60個扇區(qū) CH375vFileSize += 511; // 默認情況下,以扇區(qū)方式讀取數(shù)據(jù)時,無法讀出文件尾部不足1個扇區(qū)的部分,所以必須臨時加大文件長度以讀取尾部零頭 i = CH375FileRead( ); // 從文件讀取數(shù)據(jù) CH375vFileSize -= 511; // 恢復原文件長度 mStopIfError( i ); printf( "Close\n" ); i = CH375FileClose( ); // 關(guān)閉文件 mStopIfError( i );

printf("%d\n",FILE_DATA_BUF[0]);

printf( "ok ! You can Take out your usb! \n" ); while ( CH375DiskStatus != DISK_DISCONNECT ) xQueryInterrupt( ); /* 查詢CH375中斷并更新中斷狀態(tài),等待U盤拔出 */ //ram_end( ); mDelay100mS( ); mDelay100mS( ); } while(1); }

運行結(jié)果如下: Start 0 Wait Udisk Ready ? jing gao DiskSize Error: 2C TotalSize = 0 MB Open SAVEDATA.bin Error: 2C Road Size=0, Len=0, Sec=0 Error: B4 Close Error: B4 29108 ok ! You can Take out your usb!


你的DISK-READY沒過??!你在DISK-READY那加循環(huán)看可以不可以過,還有就是你的U盤供電多少?有的U盤供電低于4。8V就不工作了,要是還不行的話,換個U盤試下。


我的U盤供電是4.86V,而且ACT#的信號燈是亮的 我也將部分程序該為 /* 檢查U盤是否準備好,有些U盤不需要這一步,但是某些U盤必須要執(zhí)行這一步才能工作 */ for ( i = 0; i < 10; i ++ ) /* 有的U盤總是返回未準備好,不過可以被忽略 */ { mDelay100mS( ); printf( "Ready ?\n" ); if ( CH375DiskReady( ) == ERR_SUCCESS ) //break; /* 查詢磁盤是否準備好 */ { printf("OK") } else printf("jing gao\n") break; /* 查詢磁盤是否準備好 */ }

改為: for ( i = 0; i < 10; i ++ ) /* 有的U盤總是返回未準備好,不過可以被忽略 */ { mDelay100mS( ); printf( "Ready ?\n" ); while ( CH375DiskReady( ) == ERR_SUCCESS ); //break; /* 查詢磁盤是否準備好 */ printf("OK\n") ; //else printf("jing gao\n") ; break; /* 查詢磁盤是否準備好 */ }

運行結(jié)果如下:這說明是能檢測到U盤的,而且磁盤是準備好的 Start 0 Wait Udisk Ready ? OK DiskSize Error: 2C TotalSize = 0 MB Open SAVEDATA.bin Error: 2C Road Size=0, Len=0, Sec=0 Error: B4 Close Error: B4 20916 ok ! You can Take out your usb!


程序這樣改在試下: for ( i = 0; i < 10; i ++ ) /* 有的U盤總是返回未準備好,不過可以被忽略 */ { mDelay100mS( ); printf( "Ready ?\n" ); if ( CH375DiskReady( ) == ERR_SUCCESS ) break; /* 查詢磁盤是否準備好 */ }


我改了,運行結(jié)果如下:好象沒有檢測到U盤呀 這是為什么呀?????。。。?! Start 0 Wait Udisk Ready ? Ready ? Ready ? Ready ? Ready ? Ready ? Ready ? Ready ? Ready ? Ready ? DiskSize Error: 2C TotalSize = 0 MB Open SAVEDATA.bin Error: 2C Road Size=0, Len=0, Sec=0 Error: B4 Close Error: B4 20916 ok ! You can Take out your usb!


那是你上面的程序有問題,這樣的話,你換個U盤試下看可以不可以


我用 CH375DiskReady( ) 這個子程序是在庫CH375HF4.LIB里頭的 應該是沒問題的呀 為什么檢測不到U盤呢


通過下面的程序知道磁盤已經(jīng)連接,但是尚未初始化或者無法識別該磁盤。 也就是在 if ( CH375DiskReady( ) == ERR_SUCCESS ) break; /* 查詢磁盤是否準備好 */ 這一步?jīng)]有成功操作,這是為什么???

while ( CH375DiskStatus != DISK_CONNECT ) xQueryInterrupt( ); /* 查詢CH375中斷并更新中斷狀態(tài),等待U盤插入 */ printf("OKOKOKOK\n"); mDelay100mS( ); /* 延時,可選操作,有的USB存儲器需要幾十毫秒的延時 */ mDelay100mS( );


磁盤連接并不代表磁盤可以進行操作。初始化的時候分為以下幾個步驟: 1,初始化USB寄存器 2,獲取USB存儲器的容量 3,檢測USB存儲器是否準備好 實際在庫中的操作比這個還要全面,是按照計算機對U盤進行初始化過程進行操作的


能不能將 “初始化USB寄存器” 的程序給在下呀


我給的只是一個參考的過程,實際在庫文件里面做的比這個全面,所以我建議你換個U盤試下


我在啟動程序時測量了一下 CS#引腳的 電壓發(fā)現(xiàn)是 4.9V 是不是這個原因呀


CS的電壓在不工作的時候是高電平,你用萬用表是看不出來的,要看就要拿示波器看


我也不知道是什么原因,我想是不是硬件上相連的和程序的地址不匹配呀? 我在硬件上是這樣相連的 連接 單片機 CH375 P0口 —— D0~D7 P2_0 —— A0 P2_7 —— CS# INT1 —— INT# RD#(17腳) —— RD#(4腳) WR#(16腳) —— WR#(3腳)


只有登錄才能回復,可以選擇微信賬號登錄

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