大家好,采用51單片機,采用CH375A,往U盤中寫,在計算機上讀文件,時而好使,時而不好使,采用P3.5進行查詢方式 U盤為FAT格式化的。 問題: state=CH375DiskReady();state值不一定是啥,有時0xff,有時0x28,有時是0x20,還有其他情況,有時CH375DiskReady沒問題, 軟件如下,有問題嗎,還是硬件問題,reseti=p3.4,有時好使,有時不好使為啥啊,不好使的時候多,換過許多盤,都是這樣, 還有時寫進去,文件打不開,大家?guī)兔Π?,謝謝,我正煩著 #include #include #include
//關(guān)于中斷的宏定義 #define LIB_CFG_INT_EN 0 //CH375為查詢方式 #define CH375_INT_WIRE T1
//文件的讀寫方式設(shè)定 #define LIB_CFG_DISK_IO 3 //磁盤讀寫的數(shù)據(jù)的復制方式,3為"單DPTR和P2+R0復制" #define LIB_CFG_FILE_IO 3 // 文件讀寫的數(shù)據(jù)的復制方式,3為"單DPTR和P2+R0復制"
//命令口和數(shù)據(jù)口 #define CH375_CMD_PORT_ADDR 0xB001 //CH375命令端口的地址為B001 #define CH375_DAT_PORT_ADDR 0xB000 //CH375數(shù)據(jù)端口的地址為B000
//緩沖區(qū)定位,62256為32K,定0000H-3FFFH為全局變量,定4000H-41FFH為DISK-BASE-BUF(512字節(jié)) // 定4200H-7FFFH為FILE-DATA-BUF(共15872字節(jié),31個扇區(qū))
#define DISK_BASE_BUF_ADDR 0x4000 //外部RAM的磁盤數(shù)據(jù)緩沖區(qū)的起始地址,從該單元開始的緩沖區(qū)長度為SECTOR_SIZE #define FILE_DATA_BUF_ADDR 0x4200 //外部RAM的文件數(shù)據(jù)緩沖區(qū)的起始地址,緩沖區(qū)長度不小于一次讀寫的數(shù)據(jù)長度 #define FILE_DATA_BUF_LEN 0x3E00 //外部RAM的文件數(shù)據(jù)緩沖區(qū),緩沖區(qū)長度為31個扇區(qū),15872個字節(jié)
//為節(jié)省代碼,禁止程序中不用的函數(shù) #define NO_DEFAULT_CH375_F_ENUM 1 //未調(diào)用枚舉函數(shù)CH375FileEnumer程序 #define NO_DEFAULT_CH375_F_QUERY 1 // 未調(diào)用詢問函數(shù)CH375FileQuery程序
#include"CH375HF4.H"
//聲明外部變量ERROR; bit USB_ERROR;//ERROR的第6位表示USB錯;
sbit reset=P3^4;
UINT32 xdata FILESIZE=4000;//文件中的字節(jié)數(shù),文件較大時(大于15872個字節(jié)),一次寫入的扇區(qū)數(shù)為31,寫入長度為FILE_DATA_BUF_LEN, //共需調(diào)用FILESIZE/FILE_DATA_BUF_LEN次,每次文件長度為15872個字節(jié),最后不滿31個扇區(qū)的數(shù)據(jù),共有FILESIZE%FILE_DATA_BUF_LEN字節(jié), //最后寫入的扇區(qū)數(shù)為((FILESIZE%FILE_DATA_BUF_LEN)+511)/512扇區(qū),文件長度為(UINT16 )FILESIZE%FILE_DATA_BUF_LEN //文件長度較小時(小于15872個字節(jié)),只需調(diào)用一次,寫入的扇區(qū)數(shù)為(FILESIZE+511)/512扇區(qū)文件長度為(UINT16 ) //FILESIZE%FILE_DATA_BUF_LEN UINT16 xdata YEAR,MONTH,DAY;
//出錯處理,置位出錯標志 void erusb(UINT8 i) {if(i!=0) USB_ERROR=1; else return; }
void delay100ms(){ UINT8 i,j,k; for(i=0;i<200;i++) for(j=0;j<200;j++) k+=3;}
//向新文件中寫入數(shù)據(jù)(多次調(diào)用) void write(UINT8 seccount) { mCmdParam.WriteX.mSectorCount = seccount; //寫入扇區(qū)數(shù) mCmdParam.WriteX.mDataBuffer=&FILE_DATA_BUF[0];//緩沖區(qū)啟始地址 CH375FileWriteX( ); //以扇區(qū)為單位向文件寫入數(shù)據(jù) }
void datainbuf() {UINT16 i; for(i=0;i FILE_DATA_BUF[i]='o'; FILE_DATA_BUF[FILESIZE]='\0';}
void main()
{ UINT8 fstate,state=1,a=0; UINT8 ready_wait,seccount;//寫入的扇區(qū)數(shù) UINT32 addsize;//增加的文件長度 UINT32 newsize; YEAR=2007; MONTH=5; DAY=29;
USB_ERROR=0; addsize=0; datainbuf();
/* reset=1; delay100ms(); reset=0; delay100ms(); state=CH375LibInit( ); erusb(state);*/ while(state!=0){reset=1; delay100ms(); reset=0; delay100ms(); state=CH375LibInit( ); erusb(state); while(CH375DiskStatus!=DISK_CONNECT) xQueryInterrupt( ); delay100ms(); //查詢磁盤是否準備好 for(ready_wait=10;ready_wait!=0;ready_wait--) { state=CH375DiskReady(); delay100ms(); delay100ms(); if(state==ERR_SUCCESS) break;} //狀態(tài)位USB_DISK_DISCONNECT置1,U盤沒連上
//打開文件 strcpy( mCmdParam.Open.mPathName, "\\DATA1.DOC" ); //文件名,該文件在根目錄下 fstate=CH375FileOpen(); //打開文件 //找到文件.文件MDADTA.TXT尾部定位 if(fstate==0) // 找到文件 { newsize= CH375vFileSize; mCmdParam.Locate.mSectorOffset = 0xffffffff; //移動文件指針到文件末尾 CH375FileLocate(); }//移動文件指針,以便在原文件的末尾追加數(shù)據(jù)
//沒找到文件,創(chuàng)建新文件并寫入數(shù)據(jù) else if(fstate==ERR_MISS_FILE)//沒找到文件,創(chuàng)建新文件并寫入數(shù)據(jù) { strcpy( mCmdParam.Create.mPathName, "\\DATA1.DOC" ); //創(chuàng)建新文件,在根目錄下 state=CH375FileCreate( ); //新建文件并打開,如果文件已經(jīng)存在則先刪除后再新建 erusb(state);} //定扇區(qū)數(shù),寫入數(shù)據(jù) while(FILESIZE>=FILE_DATA_BUF_LEN) {seccount=FILE_DATA_BUF_LEN/512; delay100ms(); write(seccount); FILESIZE-=FILE_DATA_BUF_LEN; addsize=addsize+FILE_DATA_BUF_LEN;}
seccount=(FILESIZE+ 511 )>>9; addsize=addsize+FILESIZE; write(seccount) ; //最后寫入的扇區(qū)數(shù)為seccount,寫入的長度為newsize; //修改文件長度,文件時間等 newsize=newsize+addsize; mCmdParam.Modify.mFileAttr = 0xff; //輸入?yún)?shù): 新的文件屬性,為0FFH則不修改 mCmdParam.Modify.mFileTime = 0xffff; //輸入?yún)?shù): 新的文件時間,為0FFFFH則不修改,使用新建文件產(chǎn)生的默認時? mCmdParam.Modify.mFileDate = MAKE_FILE_DATE(YEAR,MONTH,DAY); //輸入?yún)?shù): 新的文件日期 mCmdParam.Modify.mFileSize = newsize; // 輸入?yún)?shù): 如果原文件較小,那么新的文件長度與原文件一樣長,否則被RAM所限,如果文件長度大于64KB,那么NewSize必須為UINT32 state= CH375FileModify(); //修改當前文件的信息,修改日期和長度 erusb(state); mCmdParam.Close.mUpdateLen = 0; // 不要自動計算文件長度,如果自動計算,那么該長度總是512的倍數(shù) state=CH375FileClose( );//長度更新 erusb(state); while(1);}}