我用了貴公司提供的判斷打印機(jī)的程序,但是發(fā)現(xiàn)判斷了之后,u盤不能正常寫入了。請(qǐng)問(wèn)我將如何判斷呢?
通過(guò)接口描述符中的接口類型判斷,為0x08則為大容量存儲(chǔ)類設(shè)備,即U盤
我確實(shí)能讀到8這個(gè)值,但是讀了這個(gè)值之后,運(yùn)行CH375FileOpen()函數(shù),程序會(huì)跑飛
你用我們的庫(kù),那就不需要你去判斷設(shè)備是不是U盤,庫(kù)中有子程序會(huì)做處理的。關(guān)于操作步驟,你可以下載CH375EVT.ZIP,里面有示例程序。
請(qǐng)問(wèn)是什么子程序?會(huì)返回什么樣的值?因?yàn)槲业膗sb口上可能會(huì)是打印機(jī),也可能會(huì)是u盤,所以我必須確認(rèn)
實(shí)際操作流程應(yīng)該是這樣的: 首先是設(shè)置375的模式為主機(jī)模式,然后獲取設(shè)備描述符和配置描述符,在配置描述符里面的接口描述符里面接口類型判斷,為0x08則為大容量存儲(chǔ)類設(shè)備,即U盤,如果是0X006的話就是打印機(jī),如果是U盤的話,你直接復(fù)位375芯片,在調(diào)用我們的庫(kù)來(lái)操作U盤,如果是打印機(jī)的話,就直接進(jìn)行數(shù)據(jù)的發(fā)送就可以了。
好像還是不行呢,下面是我的程序,幫我看看問(wèn)題出在哪吧! void check_upan() { unsigned char i,CH375IntStatus,status; CH375_WR_CMD_PORT( CMD_RESET_ALL ); // CH375執(zhí)行硬件復(fù)位 set_usb_mode( 6 ); // 設(shè)置USB主機(jī)模式 delay100ms(); set_usb_mode( 7 ); // 復(fù)位USB總線 for ( i=0; i<250; i++ ) { delay2us(); delay2us(); delay2us(); delay2us(); } set_usb_mode( 6 ); // 結(jié)束復(fù)位 CH375_CMD_PORT = CMD_GET_STATUS; // 獲取當(dāng)前中斷狀態(tài) //delay2us(); CH375IntStatus &= 0x80; if ( CH375IntStatus ) CH375IntStatus = 0; // 操作無(wú)意義,用于至少延時(shí)2uS CH375IntStatus = CH375_DAT_PORT; // 獲取中斷狀態(tài) if ( CH375IntStatus == USB_INT_DISCONNECT ) // 檢測(cè)到USB設(shè)備斷開事件 { SBUF= 0xf3; while(TI==0);TI=0; } else if ( CH375IntStatus == USB_INT_CONNECT ) // 檢測(cè)到USB設(shè)備連接事件 { status=get_descr_ex(); if ( p_cfg_descr->itf_descr.bInterfaceClass==8 ) { SBUF= 0xf1; while(TI==0);TI=0; } //檢測(cè)到u盤 else {SBUF= 0xf3; while(TI==0);TI=0;} //檢測(cè)到非u盤 } CH375_WR_CMD_PORT( CMD_RESET_ALL ); // CH375執(zhí)行硬件復(fù)位 set_usb_mode( 6 ); // 設(shè)置USB主機(jī)模式 delay100ms(); set_usb_mode( 7 ); // 復(fù)位USB總線 for ( i=0; i<250; i++ ) { delay2us(); delay2us(); delay2us(); delay2us(); } set_usb_mode( 6 ); // 結(jié)束復(fù)位 i = CH375LibInit( ); // 初始化CH375程序庫(kù)和CH375芯片,操作成功返回0 mStopIfError( i ); }
這邊應(yīng)該這樣來(lái)進(jìn)行操作: status=get_descr_ex(); if ( p_cfg_descr->itf_descr.bInterfaceClass==8 ) { CH375_WR_CMD_PORT( CMD_RESET_ALL ); // CH375執(zhí)行硬件復(fù)位 delay100ms();//一定需要延時(shí) i = CH375LibInit( );
} //檢測(cè)到u盤 else {SBUF= 0xf3; while(TI==0);TI=0; sent_data();//打印機(jī)發(fā)送數(shù)據(jù) } //檢測(cè)到非u盤 }
還是不行啊!我加了三倍延時(shí)都不行!為什么打印機(jī)可以直接發(fā)送數(shù)據(jù),U盤就不行呢?
按照上面的操作的話,在復(fù)位之后,需要延時(shí)50MS以上,然后在進(jìn)行對(duì)庫(kù)的初始化,你現(xiàn)在判斷出375的庫(kù)初始化CH375LibInit( )返回的值是多少?在你初始化完成之后,需要在檢測(cè)設(shè)備連接,你可以把你詳細(xì)的程序貼出來(lái)看下
返回值是0
前面的程序是向數(shù)組FILE_DATA_BUF中寫入文件內(nèi)容。 /* 開始操作U盤 */ /*新建或打開文件夾*/ mCopyCodeStringToIRAM( mCmdParam.Create.mPathName, "/UV1700" ); /* 目錄名,該目錄建在根目錄下 */ i = CreateDirectory( ); /* 新建或者打開目錄 */ mStopIfError( i ); i = CH375FileClose( ); /* 關(guān)閉文件 */ mStopIfError( i );
#ifdef EN_DISK_WRITE /* 子程序庫(kù)支持寫操作 */ /* 產(chǎn)生新文件 */ /* 寫操作 */ CH375vFileSize = FILE_SIZE; SecCount = ( CH375vFileSize + 511 ) >> 9; /* (CH375vFileSize+511)/512, 計(jì)算文件的扇區(qū)數(shù),因?yàn)樽x寫是以扇區(qū)為單位的,先加511是為了讀出文件尾部不足1個(gè)扇區(qū)的部分 */ NewSize = (unsigned int)CH375vFileSize; /* 原文件的長(zhǎng)度 */ mCopyStringToIRAM2( mCmdParam.Open.mPathName, FILE_DIR_NAME, FILE_DIR_NAME_LONG); i = CH375FileCreate( ); /* 新建文件并打開,如果文件已經(jīng)存在則先刪除后再新建 */ mStopIfError( i ); mCmdParam.Write.mSectorCount = SecCount; /* 寫入所有扇區(qū)的數(shù)據(jù) */ i = CH375FileWrite( ); /* 向文件寫入數(shù)據(jù) */ mStopIfError( i ); mCmdParam.Modify.mFileAttr = 0xff; /* 輸入?yún)?shù): 新的文件屬性,為0FFH則不修改 */ mCmdParam.Modify.mFileTime = 0xffff; /* 輸入?yún)?shù): 新的文件時(shí)間,為0FFFFH則不修改,使用新建文件產(chǎn)生的默認(rèn)時(shí)間 */ mCmdParam.Modify.mFileDate = MAKE_FILE_DATE( 2000, 0, 0 ); /* 輸入?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 ); mCmdParam.Close.mUpdateLen = 0; /* 不要自動(dòng)計(jì)算文件長(zhǎng)度,如果自動(dòng)計(jì)算,那么該長(zhǎng)度總是512的倍數(shù) */ i = CH375FileClose( ); mStopIfError( i );
程序會(huì)在進(jìn)入到CreateDirectory( ); 后運(yùn)行到 CH375FileOpen()函數(shù)跑飛。但是如果我不去讀取描述符,程序就不會(huì)跑飛。
那可能是RAM出現(xiàn)了問(wèn)題,你這樣,不進(jìn)行文件夾的創(chuàng)建,直接打開文件看下可以不可以?
直接打開文件也不行。ram會(huì)出現(xiàn)什么問(wèn)題呢?能具體點(diǎn)說(shuō)明嗎?
我借用了打印機(jī)的get_descr_ex( )程序,現(xiàn)在發(fā)現(xiàn)這個(gè)程序好像不適用于u盤。有什么適用于u盤的程序嗎?