CH375問題求解

我用ch375與51單片機用并口查詢方式通訊,功能是將存儲于存儲器中的數(shù)據(jù)以文件方式進行導出。主要程序如下: #include #include #include

//關于中斷的宏定義 #define LIB_CFG_INT_EN 0 //CH375為查詢方式

//文件的讀寫方式設定 #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 0x3800 //外部RAM的磁盤數(shù)據(jù)緩沖區(qū)的起始地址,從該單元開始的緩沖區(qū)長度為SECTOR_SIZE #define FILE_DATA_BUF_ADDR 0x4000 //外部RAM的文件數(shù)據(jù)緩沖區(qū)的起始地址,緩沖區(qū)長度不小于一次讀寫的數(shù)據(jù)長度 #define FILE_DATA_BUF_LEN 0x4000 //外部RAM的文件數(shù)據(jù)緩沖區(qū)

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

#define NO_DEFAULT_CH375_INT 1

#include"CH375HF4.H"

//聲明外部變量ERROR; bit USB_ERROR;//ERROR的第6位表示USB錯;

sbit P3_5=P3^5; #define CH375_INT_WIRE P3_5 sbit reset=P3^1;

//UINT8 fstate,state=1,a=0; UINT32 xdata FILESIZE=0x2000;//文件中的字節(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;

UINT8 fstate,state,a=0;

//出錯處理,置位出錯標志 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]=1; }

void xQueryInterrupt( void ) /* 查詢CH375中斷并更新中斷狀態(tài) */ { while ( P3_5==1 ); /* 如果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設備斷開事件 */ else if ( CH375IntStatus == USB_INT_CONNECT ) CH375DiskStatus = DISK_CONNECT; /* 檢測到USB設備連接事件 */ }

void main()

{ UINT8 temp=0; UINT8 ready_wait,seccount;//寫入的扇區(qū)數(shù) UINT32 addsize;//增加的文件長度 UINT32 newsize;//新文件長度

YEAR=2007; MONTH=7; DAY=8;

USB_ERROR=0; addsize=0; datainbuf();

delay100ms();

reset=1;//硬件復位 delay100ms(); reset=0; delay100ms(); state=CH375LibInit( );//初始化 erusb(state);//狀態(tài)是否出錯

while(1) { addsize=0;

while(CH375DiskStatus!=DISK_CONNECT) xQueryInterrupt( ); delay100ms();

while ( CH375DiskStatus < DISK_CONNECT ) { /* 查詢CH375中斷并更新中斷狀態(tài),等待U盤插入 */ if ( CH375DiskConnect( ) == ERR_SUCCESS ) break; /* 有設備連接則返回成功,CH375DiskConnect同時會更新全局變量CH375DiskStatus */ delay100ms(); //delay100ms(); //delay100ms(); } delay100ms(); delay100ms(); /* 延時,可選操作,有的USB存儲器需要幾十毫秒的延時 */ for(ready_wait=10;ready_wait!=0;ready_wait--) { delay100ms(); state=CH375DiskReady(); if(state==ERR_SUCCESS) break;}

//狀態(tài)位USB_DISK_DISCONNECT置1,U盤沒連上

//打開文件

strcpy( mCmdParam.Open.mPathName, "\\LODA.DAT" ); //文件名,該文件在根目錄下 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ù) { newsize=0; strcpy( mCmdParam.Create.mPathName, "\\LODA.DAT" ); //創(chuàng)建新文件,在根目錄下 state=CH375FileCreate( ); //新建文件并打開,如果文件已經(jīng)存在則先刪除后再新建 erusb(state);}

//定扇區(qū)數(shù),寫入數(shù)據(jù) while(FILESIZE>=FILE_DATA_BUF_LEN) { seccount=FILE_DATA_BUF_LEN/512;//寫入31整扇區(qū) write(seccount); FILESIZE-=FILE_DATA_BUF_LEN; addsize=addsize+FILE_DATA_BUF_LEN;}

seccount=(FILESIZE+ 511)>>9;//不足31個扇區(qū) 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 ( CH375DiskStatus != DISK_DISCONNECT ) xQueryInterrupt( ); delay100ms();

}

現(xiàn)在CH375用測試命令測試沒問題,插入U盤后也能夠識別。但執(zhí)行到state=CH375DiskReady()這一步時總返回0x28或0x20,下面的寫操作后返回0xb4,聽人說0x28是中斷等待超時,不知哪位高手知道這個問題怎么解決,感激不盡。


熱門產(chǎn)品 : USB3.0 HUB控制器:CH634

首先一個,如果你使用的單片機有自帶1K外部RAM的話,那么你是不能使用P2+R0的復制方式的,你可以把復制方式設置為單DPTR的復制方式.同時你去檢查下你的USB口的四根信號線是否連接正確,按照正常的連接的話,連接方式為VCC,D-,D+,GND.如果連接不正確的話,就會出現(xiàn)DISK-READY()函數(shù)操作不正確的現(xiàn)象.


先謝謝您,信號線肯定沒接錯,有時候還是能寫進去數(shù)的,但不好使時成天不好使。我換成單DPTR的復制方式仍然有這個問題,真急死我了。


那你需要注意下在不能的時候,你先做下RAM測試,看下RAM是不是有問題?其次就是 #include 應該換為 #include 否則有高128字節(jié)的外部RAM是沒辦法工作,或者分配的時候有問題


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

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