DISK-BASE-BUF的問題

/* 2004.06.05 **************************************** ** Copyright (C) W.ch 1999-2004 ** ** Web: http://www.winchiphead.com ** **************************************** ** USB Host File Interface for CH375 ** ** TC2.0@PC, KC7.0@MCS51 ** **************************************** */ /* CH375 主機(jī)文件系統(tǒng)接口 */ /* 支持: FAT12/FAT16/FAT32 */

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

/* C51 CH375HFT.C */ /* LX51 CH375HFT.OBJ , CH375HFA.LIB */ /* OHX51 CH375HFT */

#include #include

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

#define CH375_CMD_PORT_ADDR 0xBDF1 /* CH375命令端口的I/O地址 */ #define CH375_DAT_PORT_ADDR 0xBCF0 /* CH375數(shù)據(jù)端口的I/O地址 */ /* 62256提供的32KB的RAM分為三部分: 0000H-01FFH為磁盤讀寫緩沖區(qū), 0200H-7DFFH為文件數(shù)據(jù)緩沖區(qū), 7E00H-7FFFH為外部RAM變量區(qū) */ #define DISK_BASE_BUF_ADDR 0x0000 /* 外部RAM的磁盤數(shù)據(jù)緩沖區(qū)的起始地址,從該單元開始的緩沖區(qū)長度為SECTOR_SIZE */ #define FILE_DATA_BUF_ADDR 0x0200 /* 外部RAM的文件數(shù)據(jù)緩沖區(qū)的起始地址,緩沖區(qū)長度不小于一次讀寫的數(shù)據(jù)長度 */ /* 由于演示板用的62256只有32K字節(jié),其中CH375子程序用512字節(jié),所以外部RAM剩余長度為31744字節(jié) */ #define FILE_DATA_BUF_LEN 0x7800 /* 外部RAM的文件數(shù)據(jù)緩沖區(qū),緩沖區(qū)長度不小于一次讀寫的數(shù)據(jù)長度 */ /* 如果準(zhǔn)備使用雙緩沖區(qū)交替讀寫,那么不要定義FILE_DATA_BUF_LEN,而是在參數(shù)中指定緩沖區(qū)起址,用CH375FileReadX代替CH375FileRead,用CH375FileWriteX代替CH375FileWrite */

#define CH375_INT_WIRE INT0 /* P3.2, INT0, CH375的中斷線INT#引腳,連接CH375的INT#引腳,用于查詢中斷狀態(tài) */

#define NO_DEFAULT_CH375_F_ENUM 1 /* 未調(diào)用CH375FileEnumer程序故禁止以節(jié)約代碼 */ #define NO_DEFAULT_CH375_F_QUERY 1 /* 未調(diào)用CH375FileQuery程序故禁止以節(jié)約代碼 */

#include "CH375HFA.H"

/* 在P1.4連接一個(gè)LED用于監(jiān)控演示程序的進(jìn)度,低電平LED亮,當(dāng)U盤插入后亮 */ sbit P1_4 = P1^4; #define LED_OUT_INIT( ) { P1_4 = 1; } /* P1.4 高電平 */ #define LED_OUT_ACT( ) { P1_4 = 0; } /* P1.4 低電平驅(qū)動(dòng)LED顯示 */ #define LED_OUT_INACT( ) { P1_4 = 1; } /* P1.4 低電平驅(qū)動(dòng)LED顯示 */ sbit P1_5 = P1^5; /* 在P1.5連接一個(gè)LED用于監(jiān)控演示程序的進(jìn)度,低電平LED亮,當(dāng)對(duì)U盤操作時(shí)亮 */ #define LED_RUN_ACT( ) { P1_5 = 0; } /* P1.5 低電平驅(qū)動(dòng)LED顯示 */ #define LED_RUN_INACT( ) { P1_5 = 1; } /* P1.5 低電平驅(qū)動(dòng)LED顯示 */ sbit P1_6 = P1^6; /* 在P1.6連接一個(gè)LED用于監(jiān)控演示程序的進(jìn)度,低電平LED亮,當(dāng)對(duì)U盤寫操作時(shí)亮 */ #define LED_WR_ACT( ) { P1_6 = 0; } /* P1.6 低電平驅(qū)動(dòng)LED顯示 */ #define LED_WR_INACT( ) { P1_6 = 1; } /* P1.6 低電平驅(qū)動(dòng)LED顯示 */

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

/* 將程序空間的字符串復(fù)制到外部RAM中,返回字符串長度 */ UINT8 mCopyCodeStringToXRAM( UINT8 xdata *iDestination, UINT8 code *iSource ) { UINT8 i = 0; while ( *iDestination = *iSource ) { iDestination ++; iSource ++; i ++; } return( i ); }

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

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

main( ) { UINT8 i, c, SecCount; UINT16 NewSize, count; /* 因?yàn)檠菔景宓腞AM容量只有32KB,所以NewSize限制為16位,實(shí)際上如果文件大于32256字節(jié),應(yīng)該分幾次讀寫并且將NewSize改為UINT32以便累計(jì) */ UINT8 code *pCodeStr; LED_OUT_INIT( ); LED_OUT_ACT( ); /* 開機(jī)后LED亮一下以示工作 */ mDelay100mS( ); /* 延時(shí)100毫秒 */ LED_OUT_INACT( ); mInitSTDIO( ); /* 為了讓計(jì)算機(jī)通過串口監(jiān)控演示過程 */ printf( "Start\n" );

i = CH375LibInit( ); /* 初始化CH375程序庫和CH375芯片,操作成功返回0 */ mStopIfError( i ); /* 其它電路初始化 */

while ( 1 ) { printf( "Wait Udisk\n" ); // while ( CH375DiskStatus != DISK_CONNECT ) xQueryInterrupt( ); /* 查詢CH375中斷并更新中斷狀態(tài),等待U盤插入 */ while ( CH375DiskStatus < DISK_CONNECT ) { /* 查詢CH375中斷并更新中斷狀態(tài),等待U盤插入 */ if ( CH375DiskConnect( ) == ERR_SUCCESS ) break; /* 有設(shè)備連接則返回成功,CH375DiskConnect同時(shí)會(huì)更新全局變量CH375DiskStatus */ mDelay100mS( ); } LED_OUT_ACT( ); /* LED亮 */ mDelay100mS( ); /* 延時(shí),可選操作,有的USB存儲(chǔ)器需要幾十毫秒的延時(shí) */ mDelay100mS( );

/* 檢查U盤是否準(zhǔn)備好,有些U盤不需要這一步,但是某些U盤必須要執(zhí)行這一步才能工作 */ for ( i = 0; i < 5; i ++ ) { /* 有的U盤總是返回未準(zhǔn)備好,不過可以被忽略 */ mDelay100mS( ); printf( "Ready ?\n" ); if ( CH375DiskReady( ) == ERR_SUCCESS ) break; /* 查詢磁盤是否準(zhǔn)備好 */ } /* 查詢磁盤物理容量 */ printf( "DiskSize\n" ); i = CH375DiskSize( ); mStopIfError( i ); printf( "TotalSize = %u MB \n", (unsigned int)( mCmdParam.DiskSize.mDiskSizeSec >> 11 ) ); LED_RUN_ACT( ); /* 開始操作U盤 */ #ifdef EN_DISK_WRITE /* 子程序庫支持寫操作 */ /* 產(chǎn)生新文件 */ LED_WR_ACT( ); /* 寫操作 */ printf( "Create\n" ); mCopyCodeStringToXRAM( mCmdParam.Create.mPathName, "\\NEWFILE.TXT" ); /* 新文件名,在根目錄下 */ // printf("%c", *(mCmdParam.Create.mPathName-1)); printf("%c",DISK_BASE_BUF_ADDR ); printf("%s",FILE_DATA_BUF_ADDR ); 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" ); mCopyCodeStringToXRAM( mCmdParam.Create.mPathName, "\\OLD" ); 將被刪除的文件名,在根目錄下 i = CH375FileErase( ); 刪除文件并關(guān)閉 if ( i != ERR_SUCCESS ) printf( "Error: %02X\n", (UINT16)i ); 顯示錯(cuò)誤 */ LED_WR_INACT( );

/* 查詢磁盤信息 */ /* 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 LED_RUN_INACT( ); printf( "Take out\n" ); // while ( CH375DiskStatus != DISK_DISCONNECT ) xQueryInterrupt( ); /* 查詢CH375中斷并更新中斷狀態(tài),等待U盤拔出

因?yàn)槲抑饕窍胱鲆粋€(gè)能寫U盤的系統(tǒng),所以只調(diào)試子程序庫支持寫的操作。U盤能順利初始化,檢測(cè)的容量是43690M,肯定是有問題,當(dāng)執(zhí)行到i = CH375FileCreate( ); 不能在往下執(zhí)行,停止不動(dòng)。是否打印DISK_BASE_BUF, #define DISK_BASE_BUF_ADDR 0x0000 /* 外部RAM的磁盤數(shù)據(jù)緩沖區(qū)的起始地址,從該單元開始的緩沖區(qū)長度為SECTOR_SIZE */這里應(yīng)該保存的是U盤容量的信息嗎?是不是在CH375DiskReady成功后就可以打???還是要在CH375FileCreate之后打??? 還有一個(gè)問題i = CH375FileCreate,不能執(zhí)行因該怎么分析,謝謝版主!


你用的是什么單片機(jī),程序空間及數(shù)據(jù)空間是否足夠。程序空間需要10K左右,數(shù)據(jù)空間為:512字節(jié)的DISK_BASE_BUF;90字節(jié)左右的變量;至少512字節(jié)的FILE_DATA_BUF。 前面是想讓你在i = CH375FileCreate( )失敗后打印出DISK_BASE_BUF看看里面的內(nèi)容。 for(i=0;i<512;i++) printf("%x\n",(unsigned short)DISK_BASE_BUF[ i ] ); i定義為int 。


這樣打印不對(duì)啊打印的 全是0


謝謝幫忙,急死了! 關(guān)鍵是i = CH375FileCreate( )這條指令無法執(zhí)行,也就無法執(zhí)行下面的mStopIfError( i );這個(gè)函數(shù)?這會(huì)是什么原因?也就沒法在錯(cuò)誤處理過程中打印DISK_BASE_BUF。為什么每到文件操作都不動(dòng)呢?能返回個(gè)錯(cuò)誤也好啊 單片機(jī)是89C52,外擴(kuò)62256存儲(chǔ)器。用的是CH375LIB中的FILELIBA,式為"單DPTR復(fù)制“


你用的單片機(jī)的ROM有多少?還有就是你的單片機(jī)的晶振是多少?


我的單片機(jī)ROM是8K ,晶振是12M


你看一下你編譯之后的程序代碼空間有多大,8K的程序空間應(yīng)該不夠,換個(gè)程序空間大點(diǎn)的單片機(jī)試一下。還有就是你可以將單片機(jī)的晶振換高點(diǎn)如:24MHZ試一下。


for(i=0;i<10;i++){ printf("%x\n",(unsigned short)DISK_BASE_BUF[i]);} i = CH375FileCreate( ); /* 新建文件并打開,如果文件已經(jīng)存在則先刪除后再新建 我把單片機(jī)換成了89C55 20k的ROM ,晶振也換為24M 我在CH375FileCreate之前打印,打印出來為0 2a 8a a2 e2 aa 21 8a 2a 88,這和U盤容量有關(guān)嗎? 還是不能執(zhí)行i = CH375FileCreate( ); ,天啊,這個(gè)庫怎么回事?


你是怎么樣調(diào)試的?是用仿真器調(diào)試還是直接燒到單片機(jī)里面去調(diào)試的,如果是仿真器的話,那么會(huì)出現(xiàn)你說的這種現(xiàn)象,那么你可以直接將程序燒到單片機(jī)里面去就應(yīng)該可以了,實(shí)際我想看的是你打開文件之后,出錯(cuò)之后DISK-BASE-BUF里面的數(shù)據(jù)。


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

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