我的U盤是4G的,我格式化了,就用ch375創(chuàng)建個(gè)文本文件,里面寫幾個(gè)中文, 結(jié)果出來是對(duì)的,但是花了很長(zhǎng)時(shí)間啊,特別是創(chuàng)建文件, 我用的是內(nèi)部固件。 請(qǐng)問這是為什么,代碼延時(shí)什么的也不是很長(zhǎng),估計(jì)不是這個(gè)原因。
簡(jiǎn)單的說一下你的MCU資源,速度。 另外把讀寫函數(shù)貼出來看看。 文件系統(tǒng)是用我們提供的庫還是你自己編寫的?
MCU是atmega128,應(yīng)該挺快的。 下面是代碼,我只要能實(shí)現(xiàn)向一個(gè)文本文件寫入東西就行。代碼我亂改了,見笑
while ( 1 ) { printf( "等待U盤插入\n" ); while ( CH375DiskStatus < DISK_CONNECT ) { /* 查詢CH375中斷并更新中斷狀態(tài),等待U盤插入 */ if ( CH375DiskConnect( ) == ERR_SUCCESS ) break; /* 有設(shè)備連接則返回成功,CH375DiskConnect同時(shí)會(huì)更新全局變量CH375DiskStatus */ mDelaymS( 100 ); } mDelaymS( 250 ); /* 延時(shí),可選操作,有的USB存儲(chǔ)器需要幾十毫秒的延時(shí) */
/* 檢查U盤是否準(zhǔn)備好,有些U盤不需要這一步,但是某些U盤必須要執(zhí)行這一步才能工作 */ for ( i = 0; i < 5; i ++ ) { /* 有的U盤總是返回未準(zhǔn)備好,不過可以被忽略 */ mDelaymS( 100 ); printf( "U盤準(zhǔn)備完畢 ?\n" ); if ( CH375DiskReady( ) == ERR_SUCCESS ) break; /* 查詢磁盤是否準(zhǔn)備好 */ } #if DISK_BASE_BUF_LEN if ( DISK_BASE_BUF_LEN < CH375vSectorSize ) { /* 檢查磁盤數(shù)據(jù)緩沖區(qū)是否足夠大,CH375vSectorSize是U盤的實(shí)際扇區(qū)大小 */ printf( "扇區(qū)太大\n" ); while ( CH375DiskConnect( ) == ERR_SUCCESS ) mDelaymS( 100 ); continue; } #endif
/* 查看是否有目標(biāo)目錄 */ printf( "打開U盤\n" ); strcpy( (char *)mCmdParam.Open.mPathName, "\\C51" ); /* 找這個(gè)目錄 */ i = CH375FileOpen( ); /* 打開文件 */ if ( i == ERR_MISS_DIR) { send_string("沒有找到目錄"); /* 沒有找到文件目錄,要新建 */ } else { /* 找到文件或者出錯(cuò) */ mStopIfError( i ); send_string("找到目錄"); }
#ifdef EN_DISK_WRITE /* 子程序庫支持寫操作 */ /* 產(chǎn)生新文件 */ printf( "創(chuàng)建新文件\n" ); strcpy( (char *)mCmdParam.Create.mPathName, "\\NEWFILE.TXT" ); /* 新文件名,在根目錄下 */ i = CH375FileCreate(); /* 新建文件并打開,如果文件已經(jīng)存在則先刪除后再新建 */ mStopIfError( i ); printf( "寫入數(shù)據(jù)\n" ); for(i=0;i<100;i++)FILE_DATA_BUF[i]='a'; FILE_DATA_BUF[99]=0; //strcpy(FILE_DATA_BUF, "鄭澤凱\n鄭澤凱鄭澤凱\n鄭澤凱\t鄭澤凱鄭\n澤凱" ); mCmdParam.Write.mSectorCount = 1; i = CH375FileWrite(); /* 向文件寫入數(shù)據(jù) */ mStopIfError( i ); printf( "屬性\n" ); mCmdParam.Modify.mFileAttr = 0xff; /* 輸入?yún)?shù): 新的文件屬性,為0FFH則不修改 */ mCmdParam.Modify.mFileTime = MAKE_FILE_TIME( 11, 11, 11 ); /* 輸入?yún)?shù): 新的文件時(shí)間,為0FFFFH則不修改,使用新建文件產(chǎn)生的默認(rèn)時(shí)間 */ mCmdParam.Modify.mFileDate = MAKE_FILE_DATE( 1111, 11, 11 ); /* 輸入?yún)?shù): 新的文件日期: 2004.05.18 */ mCmdParam.Modify.mFileSize = NewSize; /* 輸入?yún)?shù): 如果原文件較小,那么新的文件長(zhǎng)度與原文件一樣長(zhǎng),否則被RAM所限,如果文件長(zhǎng)度大于64KB,那么NewSize必須為UINT32 */ i = CH375FileModify( ); /* 修改當(dāng)前文件的信息,修改日期和長(zhǎng)度 */ mStopIfError( i ); printf( "關(guān)閉\n" ); mCmdParam.Close.mUpdateLen = 0; /* 不要自動(dòng)計(jì)算文件長(zhǎng)度,如果自動(dòng)計(jì)算,那么該長(zhǎng)度總是CH375vSectorSize的倍數(shù) */ i = CH375FileClose( ); mStopIfError( i );
#endif printf( "退出U盤\n" ); while ( CH375DiskStatus >= DISK_CONNECT ) { /* 查詢CH375中斷并更新中斷狀態(tài),等待U盤拔出 */ if ( CH375DiskConnect( ) != ERR_SUCCESS ) break; mDelaymS( 100 ); } mDelaymS( 200 ); }
用的是內(nèi)部固件,ch375hfb
主程序上面沒什么問題,主要看你三個(gè)讀寫子函數(shù)。還有單片機(jī)晶振是多少?
void xWriteCH375Cmd( UINT8 mCmd ) /* 外部定義的被CH375程序庫調(diào)用的子程序,向CH375寫命令 */ { mDelay1uS( ); mDelay1uS( ); /* 至少延時(shí)1uS */ A0(1);mDelaymS(1); /* 輸出A0=1 */ PORTA = mCmd;mDelaymS(1); /* 向CH375的并口輸出數(shù)據(jù) */ DDRA = 0xFF;mDelaymS(1); /* 并口D0-D7輸出 */ CS(0);mDelaymS(1);A0(1);mDelaymS(1);WR(0);mDelaymS(1);RD(1);mDelaymS(1); /* 輸出有效寫控制信號(hào), 寫CH375芯片的命令端口, A0=1; CS=0; WR=0; RD=1; */ mDelay1uS( );DDRA = 0xFF; /* 該操作無意義,僅作延時(shí),CH375要求讀寫脈沖寬度大于100nS */ CS(1);mDelaymS(1);WR(1);mDelaymS(1); /* 輸出無效的控制信號(hào), 完成操作CH375芯片, A0=1; CS=1; WR=1; RD=1; */ DDRA = 0x00;mDelaymS(1); /* 禁止數(shù)據(jù)輸出 */ A0(0);mDelaymS(1); /* 輸出A0=0; 可選操作 */ mDelay1uS( ); /* 至少延時(shí)2uS */ }
void xWriteCH375Data( UINT8 mData ) /* 外部定義的被CH375程序庫調(diào)用的子程序,向CH375寫數(shù)據(jù) */ { PORTA = mData; /* 向CH375的并口輸出數(shù)據(jù) */ DDRA = 0xFF; /* 并口D0-D7輸出 */ CS(0);mDelaymS(1);A0(0);mDelaymS(1);WR(0);mDelaymS(1);RD(1);mDelaymS(1); /* 輸出有效寫控制信號(hào), 寫CH375芯片的數(shù)據(jù)端口, A0=0; CS=0; WR=0; RD=1; */ mDelay1uS( );mDelay1uS( );DDRA = 0xFF; /* 該操作無意義,僅作延時(shí),CH375要求讀寫脈沖寬度大于100nS */ CS(1);mDelaymS(1);WR(1);mDelaymS(1); /* 輸出無效的控制信號(hào), 完成操作CH375芯片, A0=0; CS=1; WR=1; RD=1; */ DDRA = 0x00;mDelaymS(1); /* 禁止數(shù)據(jù)輸出 */ mDelay1uS( ); /* 至少延時(shí)1.2uS */ }
UINT8 xReadCH375Data( void ) /* 外部定義的被CH375程序庫調(diào)用的子程序,從CH375讀數(shù)據(jù) */ { UINT8 mData; mDelay1uS( ); /* 至少延時(shí)1.2uS */ DDRA = 0x00;mDelaymS(1); /* 數(shù)據(jù)輸入 */ CS(0);mDelaymS(1);A0(0);mDelaymS(1);WR(1);mDelaymS(1);RD(0);mDelaymS(1); /* 輸出有效讀控制信號(hào), 讀CH375芯片的數(shù)據(jù)端口, A0=0; CS=0; WR=1; RD=0; */ mData = PINA;mDelaymS(1); /* 從CH375的并口PA輸入數(shù)據(jù) */ mDelay1uS( );mDelay1uS( );DDRA = 0x00; /* 該操作無意義,僅作延時(shí),CH375要求讀寫脈沖寬度大于100nS */ CS(1);mDelaymS(1);RD(1);mDelaymS(1); /* 輸出無效的控制信號(hào), 完成操作CH375芯片, A0=0; CS=1; WR=1; RD=1; */ return( mData ); }
那幾個(gè)CS(),WR()宏定義如下,應(yīng)該沒問題: #define A0(n) {PORTE=(PORTE&0XBF)^(n<<6);} #define CS(n) {PORTE=(PORTE&0X7F)^(n<<7);} #define WR(n) {PORTE=(PORTE&0XEF)^(n<<4);} #define RD(n) {PORTE=(PORTE&0XDF)^(n<<5);} #define RST(n) {PORTE=(PORTE&0XF7)^(n<<3);} 自己琢磨出來的方法,不過沒問題。
主要是我不知道那個(gè)文件長(zhǎng)度怎么弄,因?yàn)槲乙淮沃灰獙懭朊拷M14字節(jié)的數(shù)據(jù),要寫很多組。 但是那個(gè)mCmdParam.Write.mSectorCount = 1;一次至少一個(gè)扇區(qū),太多了。 我想在txt里每寫14字節(jié)的數(shù)據(jù)就換行,再寫一組,請(qǐng)問該怎么辦?。? 沒認(rèn)真看用戶手冊(cè),先大概問問。
三個(gè)讀寫子函數(shù)里面這么有mDelaymS(1);延時(shí)啊,這樣速度肯定很慢啊
我改改試試看,請(qǐng)教下面的問題。 主要是我不知道那個(gè)文件長(zhǎng)度怎么弄,因?yàn)槲乙淮沃灰獙懭朊拷M14字節(jié)的數(shù)據(jù),要寫很多組。 但是那個(gè)mCmdParam.Write.mSectorCount = 1;一次至少一個(gè)扇區(qū),太多了。 我想在txt里每寫14字節(jié)的數(shù)據(jù)就換行,再寫一組,請(qǐng)問該怎么辦??? 沒認(rèn)真看用戶手冊(cè),先大概問問。
你可以按照字節(jié)方式來寫。這樣就可以解決你的問題了。
我用字節(jié)了,能創(chuàng)建文件,但是沒有數(shù)據(jù)啊,U盤里有文件record.txt,但是打不開,還刪不了,只能格式化
printf( "創(chuàng)建新文件\n" ); strcpy( (char *)mCmdParam.Create.mPathName, "\\record.txt" ); /* 新文件名 */ i = CH375FileCreate(); /* 新建文件并打開,如果文件已經(jīng)存在則先刪除后再新建 */ mStopIfError( i );
printf( "寫入數(shù)據(jù)\n" ); mCmdParam.ByteWrite.mByteCount = 28; strcpy((char *)mCmdParam.ByteWrite.mByteBuffer ,"adfhgfhsfdghsdf"); i = CH375ByteWrite(); mStopIfError( i ); mCmdParam.ByteWrite.mByteCount=0; i = CH375ByteWrite(); mStopIfError( i );
文件名必須為大寫,否則打不開,寫完28字節(jié)之后,直接關(guān)閉文件,關(guān)閉文件的變量為1.自動(dòng)更新文件長(zhǎng)度。
解決了,謝謝了