CH375A寫U盤的問題,幫幫我

大家好,采用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);}}

自己補充一下state=CH375DiskReady();有時還返回0x2c,0x82,


你的程序上面沒什么問題,按照你說的現(xiàn)象的話,在DISK-READY會出現(xiàn)0X82或者0X2C的情況的話,這個好象是你給U盤的供電是不是夠?還有就是你單片機的晶振是多少?速度太慢的話也會出現(xiàn)你說的這種問題的


我測了電壓,接上盤后4.9v ,單片機晶振12m


你用的是哪一個庫?將單片機速度調(diào)快點試下,USB接口上面加一個電解電容,大小為100U左右


hcn,謝謝你,我用的是CH375HF4.lib,怎么才能將單片機的速度調(diào)快啊,12M晶振挺快了吧,是在USB的電源接口接個電容嗎


用24M試試,是的,在電源端口


電源端口已有47uf電容,是否還有可能是其他原因,375的時鐘是否一定要單獨接,現(xiàn)在是從單片機上引下來。


你的USB口有沒有串電阻?如果有串的話,那么串的是多少歐姆的?建議串的電阻在0-5歐姆之間


單片機的具體型號是什么,當讀出來狀態(tài)不正確時,看下晶振有沒有起振,25腳26腳電壓. 或者可以用例子程序試下看硬件有沒有問題.


USB口無電阻,現(xiàn)在的問題是,下面這個函數(shù)有中斷,但CH375DiskStatus 不等于DISK_CONNECT;,始終在這循環(huán) void xQueryInterrupt( void ) /* 查詢CH375中斷并更新中斷狀態(tài) */ { while ( CH375_INT_WIRE ); /* 如果CH375的中斷引腳輸出高電平則等待 */ CH375_CMD_PORT = CMD_GET_STATUS; /* 獲取當前中斷狀態(tài) */ CH375IntStatus &= 0x80; if ( CH375IntStatus ) CH375IntStatus = 0; /* 操作無意義,用于至少延時2uS */ CH375IntStatus = CH375_DAT_PORT; /* 獲取中斷狀態(tài) */ if ( CH375IntStatus == USB_INT_DISCONNECT ) CH375DiskStatus = DISK_DISCONNECT; /* 檢測到USB設(shè)備斷開事件 */ else if ( CH375IntStatus == USB_INT_CONNECT ) CH375DiskStatus = DISK_CONNECT; /* 檢測到USB設(shè)備連接事件 */ }


USB口無電阻,現(xiàn)在的問題是,下面這個函數(shù)有中斷,但CH375DiskStatus 不等于DISK_CONNECT;,始終在這循環(huán) void xQueryInterrupt( void ) /* 查詢CH375中斷并更新中斷狀態(tài) */ { while ( CH375_INT_WIRE ); /* 如果CH375的中斷引腳輸出高電平則等待 */ CH375_CMD_PORT = CMD_GET_STATUS; /* 獲取當前中斷狀態(tài) */ CH375IntStatus &= 0x80; if ( CH375IntStatus ) CH375IntStatus = 0; /* 操作無意義,用于至少延時2uS */ CH375IntStatus = CH375_DAT_PORT; /* 獲取中斷狀態(tài) */ if ( CH375IntStatus == USB_INT_DISCONNECT ) CH375DiskStatus = DISK_DISCONNECT; /* 檢測到USB設(shè)備斷開事件 */ else if ( CH375IntStatus == USB_INT_CONNECT ) CH375DiskStatus = DISK_CONNECT; /* 檢測到USB設(shè)備連接事件 */ }


那CH375DiskStatus等于什么值,還有你看下CH375模式可設(shè)置成功了


這個文件是WINHEX讀出數(shù)據(jù)的截圖。


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

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