自檢通過,創(chuàng)建文件返回0x10,結(jié)束文件返回0xb4,插入和拔出的返回狀態(tài)都是對的,但是就是寫入文件后 U盤內(nèi)沒有文件,請問怎么回事?是3.3V的原因嗎?
應(yīng)該不是,可能是你的程序上面沒控制好
哪里沒有控制好?寫的時候U盤的燈還一閃一閃的呢,可就是數(shù)據(jù)沒有寫入進去
你在寫完數(shù)據(jù)之后有沒有更新文件長度?
有,現(xiàn)在是連文件名都創(chuàng)建不了,發(fā)送 strcpy( (char *)mCmdParam.Create.mPathName, "\\2.TXT" ); /* 新文件名,在根目錄下 */ i = CH375FileCreate(); /* 新建文件并打開,如果文件已經(jīng)存在則先刪除后再新建 */ 后返回 0x10; mCmdParam.Write.mSectorCount = 1; i = CH375FileWriteX( );/* 向文件寫入數(shù)據(jù) */ 后返回0xb4就關(guān)閉文件了. 這個我用51做過 ch375A的
那你前面的初始化都過了沒有?
有呀,i=CH375LibInit(); Uart0_Send_A_Byte(0xff); Uart0_Send_A_Byte(i); // 如果成功,返回值為0 返回0x00.
是不是我寫數(shù)據(jù)的函數(shù)不對?但是我檢查不出來問題呀 void xWriteCH375Data( uint8 mData ) /* 外部定義的被CH375程序庫調(diào)用的子程序,向CH375寫數(shù)據(jù) */ { IO1CLR |= 0x00FF0000; /* 清并口輸出 */ IO1SET |= (uint32)mData << 16; /* 向CH375的并口輸出數(shù)據(jù) */ IO1DIR |= 0x00FF0000; /* 設(shè)置8位并口為輸出 */ IO0DIR |= 0x002D0000; /* 寫操作所以數(shù)據(jù)輸出, 設(shè)置CS,WR,RD,A0為輸出 */ /* 寫CH375芯片的數(shù)據(jù)端口, A0(P0.16)=0; CS(P0.21)=0; WR=(P0.18)=0; RD(P0.19)=1; */ IO0CLR |= USB_A0; IO0CLR |= USB_CS; IO0CLR |= USB_WR; IO0SET |= USB_RD; IO0DIR = IO0DIR; IO0DIR = IO0DIR; IO0DIR = IO0DIR;IO0DIR = IO0DIR; /* 該操作無意義,僅作延時,CH375要求讀寫脈沖寬度大于100nS */ mDelay1_2uS( ); /* 輸出無效的控制信號, 完成操作CH375芯片, A0(P0.16)=0; CS(P0.21)=1; WR=(P0.18)=1; RD(P0.19)=1; */ IO0SET |= USB_RD; IO0SET |= USB_CS; IO0SET |= USB_WR; IO0CLR |= USB_A0; /* 輸出A0(P0.16)=0; 可選操作 */ IO1DIR &= 0xFF00FFFF; /* 禁止數(shù)據(jù)輸出 */ mDelay1_2uS( ); mDelay1_2uS( ); mDelay1_2uS( ); /* 至少延時1.2uS */ }
這個寫數(shù)據(jù)的函數(shù)沒什么問題,那你的DISK-READY過了沒有?
有哦 if(USBDiskStatus != CH375IntStatus) {USBDiskStatus = CH375IntStatus; Uart0_Send_A_Byte(0xee); Uart0_Send_A_Byte(CH375IntStatus); if(CH375IntStatus ==USB_INT_CONNECT) // 如果檢測到U盤插上了 {mDelaymS( 200 ); /* 延時,可選操作,有的USB存儲器需要幾十毫秒的延時 */ //* 檢查U盤是否準備好,有些U盤不需要這一步,但是某些U盤必須要執(zhí)行這一步才能工作 */ for(i=0;i<10;i++) { /* 有的U盤總是返回未準備好,不過可以被忽略 */ mDelaymS(100); if ( CH375DiskReady( ) == ERR_SUCCESS ) break; /* 查詢磁盤是否準備好 */ } i=CH375DiskQuery(); // 查詢當前文件的信息 CH375DirtyBuffer(); Uart0_Send_A_Byte(0xe0); Uart0_Send_A_Byte(i); mDelaymS( 200 ); write_file_step=0x01; //開始寫文件 } else if(CH375IntStatus ==USB_INT_DISCONNECT) // 如果檢測到U盤斷開了 {write_file_step=0x00; //不再寫文件結(jié)束 } }
插入和拔出檢測都是對的
上面的程序,DISK-READY函數(shù),假如你運行了10次的話,你的程序沒有做任何的判斷,那么你的程序也認為是過了的。
是呀,示范程序就這么寫的呀,用單片機實現(xiàn)是對的
你后面返回的0X10可能就是你前面的DISK-READY沒有過
哦,謝謝,我再試試,可這個disc_ready要是不過怎么辦?
就是這個沒有過,可是我等很久它都不過,那怎么辦? for(i=0;i<200;i++) { /* 有的U盤總是返回未準備好,不過可以被忽略 */ mDelaymS(100); if ( CH375DiskReady( ) == ERR_SUCCESS ) break; /* 查詢磁盤是否準備好 */ } 現(xiàn)在除了返回0x10外,還能返回0x14,但是一樣的產(chǎn)生不了文件名
這是USB的寫入程序,請幫我看看 void USBProcess(void) { static uint8 USBDiskStatus=USB_INT_DISCONNECT; static uint8 write_file_step=0x00; //寫文件的 uint8 i=0; // 查詢 U盤 是否有插入和拔出 xQueryInterrupt(); // 取得USB的信息狀態(tài) // 如果 檢測到有U盤插入 if(USBDiskStatus != CH375IntStatus) {USBDiskStatus = CH375IntStatus; Uart0_Send_A_Byte(0xee); Uart0_Send_A_Byte(CH375IntStatus); if(CH375IntStatus ==USB_INT_CONNECT) // 如果檢測到U盤插上了 {mDelaymS( 200 ); /* 延時,可選操作,有的USB存儲器需要幾十毫秒的延時 */ //* 檢查U盤是否準備好,有些U盤不需要這一步,但是某些U盤必須要執(zhí)行這一步才能工作 */ for(i=0;i<200;i++) { /* 有的U盤總是返回未準備好,不過可以被忽略 */ mDelaymS(100); if ( CH375DiskReady( ) == ERR_SUCCESS ) break; /* 查詢磁盤是否準備好 */ } Uart0_Send_A_Byte(0xe0); Uart0_Send_A_Byte(i); i=CH375DiskQuery(); // 查詢當前文件的信息 CH375DirtyBuffer(); Uart0_Send_A_Byte(0xe0); Uart0_Send_A_Byte(i); mDelaymS( 200 ); write_file_step=0x01; //開始寫文件 } else if(CH375IntStatus ==USB_INT_DISCONNECT) // 如果檢測到U盤斷開了 {write_file_step=0x00; //不再寫文件結(jié)束 } } // ------------------------------------------------------------------------ // ---------數(shù)據(jù)的寫入---------------------------- if(write_file_step!=0x00) {if(write_file_step==0x01) //創(chuàng)建文件名 {strcpy( (char *)mCmdParam.Create.mPathName, "\\2.TXT" ); /* 新文件名,在根目錄下 */ i = CH375FileCreate(); /* 新建文件并打開,如果文件已經(jīng)存在則先刪除后再新建 */ Uart0_Send_A_Byte(0xec); Uart0_Send_A_Byte(i); write_file_step=0x02; } else if(write_file_step==0x02) {write_file_step=0x03; } else if(write_file_step==0x03) //寫入文件 {mCmdParam.Write.mSectorCount = 1; i = CH375FileWriteX( );/* 向文件寫入數(shù)據(jù) */ Uart0_Send_A_Byte(0xeb); Uart0_Send_A_Byte(i); write_file_step=0x04; } else if(write_file_step==0x04) {mCmdParam.Modify.mFileAttr = 0xff; /* 輸入?yún)?shù): 新的文件屬性,為0FFH則不修改 */ mCmdParam.Modify.mFileTime = 0xffff; /* 輸入?yún)?shù): 新的文件時間,為0FFFFH則不修改,使用新建文件產(chǎn)生的默認時間 */ mCmdParam.Modify.mFileDate = MAKE_FILE_DATE( 2006, 8, 18 ); /* 輸入?yún)?shù): 新的文件日期: 2004.05.18 */ mCmdParam.Modify.mFileSize = 4096; /* 輸入?yún)?shù): 如果原文件較小,那么新的文件長度與原文件一樣長,否則被RAM所限,如果文件長度大于64KB,那么NewSize必須為UINT32 */ i = CH375FileModify( ); /* 修改當前文件的信息,修改日期和長度 */ mCmdParam.Close.mUpdateLen = 0; /* 不要自動計算文件長度,如果自動計算,那么該長度總是512的倍數(shù) */ write_file_step=0x05; } else if(write_file_step==0x05) //結(jié)束文件 {i = CH375FileClose( ); /* 關(guān)閉文件 */ Uart0_Send_A_Byte(0xea); Uart0_Send_A_Byte(i); write_file_step=0x00; }
}
}