求助CH375B做 Host讀U盤

小弟先謝過(guò)了?。?! 我有個(gè)地方不知道怎么處理:就是我用CH375的串口方式去讀U盤。在讀的例程中每次讀?。眰€(gè)扇區(qū)就是512 字節(jié)的數(shù)據(jù)。  同時(shí)我的程序中有一處要使用一個(gè)外部中斷處理一個(gè)IIC的通信的任務(wù),于是我發(fā)現(xiàn)如果當(dāng)CH375正在讀U盤的時(shí)候 產(chǎn)生中斷,那么 回來(lái)的話CH375就像死掉了一樣不能繼續(xù)讀數(shù)據(jù)了。 請(qǐng)問(wèn)這該如何處理才能讓CH375盡快恢復(fù)狀態(tài)?我試過(guò)重新初始化U盤,但并不是每次都能成功。這個(gè)應(yīng)該是ch375 的問(wèn)題吧??? 求助~~~

1,如果在讀取512字節(jié)過(guò)程中來(lái)中斷的話,那么中斷打斷時(shí)間不能超過(guò)2MS左右,如果時(shí)間過(guò)長(zhǎng)可能會(huì)出現(xiàn)U盤掛起的現(xiàn)象。如果重新初始化還不成功的話,那么,你需要看下CH375給你返回的錯(cuò)誤碼是多少?或者你把你的初始化的程序帖出來(lái)看下,看下有沒(méi)有需要修改的地方。


我貼出來(lái)阿,麻煩幫我分析下阿~~: 代碼在幾個(gè)函數(shù)里,我把弄出來(lái)了;

usb_state = USB_DISCONNECT ; #if DEBUG_PRINTF sea_printf("...begin to init CH375... "); #endif CH375_INT_FLAG = 1 ;

Status = mSetBaudrate( 1 ); //修改串口的 波特率 mStopIfError( Status ) ;

#if TEST_CH375_PORT unsigned char c ; CH375_WR_CMD( CMD_CHECK_EXIST ); /* 2aê?1¤×÷×′ì? */ DelayMs(1); CH375_WR_DAT( 0x55 ); /* 2aê?êy?Y 55->aa,*/ DelayMs(1); c = CH375_RD_DAT( ); c=c+1; #endif //TEST_CH375_PORT

/* 初始化 */ CH375_WR_CMD( CMD_SET_USB_MODE ); DelayMs(0x01); CH375_WR_DAT( 6 ); DelayMs(0x01);

if ( CH375_RD_DAT( ) == CMD_RET_SUCCESS ) { #if DEBUG_PRINTF sea_printf("CH375 initialize ok.\n"); #endif

usb_state = USB_CH375_OK ; return( 0x00 ); } else { usb_state = USB_DISCONNECT ; return( USB_TIMEOUT ); }

//下面是等待U盤的中斷 void wait_usb() { int mIntStatus ; do { mIntStatus = mWaitInterrupt(); // DelayMs(0x10); } while (mIntStatus != USB_INT_CONNECT); // usb_state = USB_CONNECT ; }

// /* 初始化U盤 */ CH375_WR_CMD( CMD_DISK_INIT ); DelayMs( 0x10 ); //?aà?μ??óê±ò2òaμ÷??£?£?£? mIntStatus = mWaitInterrupt( ); if ( mIntStatus != USB_INT_SUCCESS ) /* ·μ??USB_INT_SUCCESS±êê?2ù×÷3é1| */ { usb_state = USB_DISCONNECT ; return( USB_TIMEOUT ); }


另外出現(xiàn)問(wèn)題時(shí)是:一直在初始化CH375,也就是發(fā)送CH375_WR_CMD( CMD_SET_USB_MODE ); 這條命令不成功,即發(fā)送后沒(méi)有響應(yīng)。。??墒前眩毡P拔下來(lái)再插上去就可以了。。。 但是這個(gè)做成產(chǎn)品怎么可以呢??總不能讓用戶不停的拔插U盤吧 ??? 求助阿~~


檢測(cè)到設(shè)備拔除之后,是不需要設(shè)置CH375的模式的,還有就是初始化函數(shù)可以進(jìn)行修改下,請(qǐng)拿這部分代碼去測(cè)試下看你的U盤可以不可以初始化: UINT8 mInitDisk( void ) { /* 初始化磁盤 */ UINT8 Status,i,j=0; CH375_WR_CMD_PORT( CMD_GET_STATUS ); /* 產(chǎn)生操作完成中斷, 獲取中斷狀態(tài) */ Status = CH375_RD_DAT_PORT( ); if ( Status == USB_INT_DISCONNECT ) return( Status ); /* USB設(shè)備斷開(kāi) */ CH375_WR_CMD_PORT( CMD_DISK_INIT ); /* 初始化USB存儲(chǔ)器 */ Status = mWaitInterrupt( ); /* 等待中斷并獲取狀態(tài) */ if ( Status != USB_INT_SUCCESS ) return( Status ); /* 出現(xiàn)錯(cuò)誤 */ while(1){j++; CH375_WR_CMD_PORT( CMD_DISK_SIZE ); /* 獲取USB存儲(chǔ)器的容量 */ Status = mWaitInterrupt( ); /* 等待中斷并獲取狀態(tài) */ if ( Status == USB_INT_SUCCESS ) break; /* 出現(xiàn)錯(cuò)誤 */ /*這里需要加上這個(gè)之后才可以,正確的做法也是這樣*/ CH375_WR_CMD_PORT( CMD_DISK_R_SENSE ); /* 獲取USB存儲(chǔ)器的容量 */ mDelaymS( 250 ); if(j==5) return(Status); } Status = mWaitInterrupt( ); /* 等待中斷并獲取狀態(tài) */ if ( Status == USB_INT_SUCCESS ){ /* 出現(xiàn)錯(cuò)誤 */ for(i=0;i!=5;i++){ printf("Ready\n"); CH375_WR_CMD_PORT( CMD_DISK_READY ); /* 獲取USB存儲(chǔ)器的容量 */ Status = mWaitInterrupt( ); /* 等待中斷并獲取狀態(tài) */ if ( Status == USB_INT_SUCCESS ) break; /* 出現(xiàn)錯(cuò)誤 */ CH375_WR_CMD_PORT( CMD_DISK_R_SENSE ); /* 獲取USB存儲(chǔ)器的容量 */ mDelaymS( 250 ); } } return( 0 ); /* U盤已經(jīng)成功初始化 */ }


(1)如果單片機(jī)具備10K以上程序空間、600字節(jié)以上RAM,那么可以建議使用子程序庫(kù),即使這些資源不具備,我們另有一款內(nèi)置文件系統(tǒng)的CH376芯片,這兩種方式對(duì)U盤的兼容都很高 (2)這樣子肯定不行,不過(guò)問(wèn)題基本都是程序上的,CH375的命令和數(shù)據(jù)之間的延時(shí)都微秒級(jí)的,如果是剛接觸操作U盤,建議先用我們的例程去調(diào)試,熟悉后再根據(jù)需要修改移植。下載CH375EVT.ZIP,參看MISCELL下的例程,這些例程僅需要修改CH375的地址、中斷線及根據(jù)單片機(jī)主要調(diào)整微/毫秒級(jí)延時(shí)即可,其余部分不要修改


上面的大哥你的程序是不是有問(wèn)題阿??? CH375_WR_CMD_PORT( CMD_DISK_READY ); /* 獲取USB存儲(chǔ)器的容量 */ 獲取容量是CMD_DISK_READY ? 還有你不用設(shè)置SET_USB_MODE的嗎? 能給個(gè)經(jīng)過(guò)測(cè)試的代碼嗎??? 拜謝?。?!


后面注釋沒(méi)改,參考CH375EVT.ZIP中MISCELL下的例程吧


上面的注釋沒(méi)去掉不好意思,你說(shuō)說(shuō)的模式是在你程序一上來(lái)延時(shí)50MS之后就需要設(shè)置的,然后在檢測(cè)U盤連接,完成之后在去初始化U盤,上面這部分只做了初始化U盤的部分,沒(méi)有把全部程序帖出來(lái),因?yàn)榍懊娴某绦蚝湍愕幕臼穷愃频?,所以就沒(méi)有帖,你應(yīng)該去看下命令代碼,因?yàn)閷懗绦虻臅r(shí)候可能直接就是復(fù)制的,所以后面的注釋沒(méi)有去掉。還有你上面的程序如果僅僅做一個(gè)DISK_INIT的話,可能很多U盤都不會(huì)支持的。上面給你帖的程序是為了提高你U盤的兼容性。并且在這里說(shuō)一下,我們帖出的程序都是經(jīng)過(guò)測(cè)試的,如果有任何問(wèn)題你可以電話或者BBS來(lái)咨詢。


“還有你上面的程序如果僅僅做一個(gè)DISK_INIT的話,可能很多U盤都不會(huì)支持的?!?/p>

-----那應(yīng)該怎么樣才能支持更多的優(yōu)盤阿大哥???


前面已經(jīng)說(shuō)了,用我們的子程序庫(kù)或CH376


還有個(gè)問(wèn)題請(qǐng)教。。。 我想實(shí)現(xiàn)一個(gè)功能,就是在讀取U盤 的過(guò)程中能準(zhǔn)確地得知U盤被拔出這一操作。也就是說(shuō)在U盤操作過(guò)程中如果他被拔出要能馬上知道。請(qǐng)問(wèn)CH375 是如何實(shí)現(xiàn)這一功能的?我試了很久不知道怎么處理 謝謝先?。。?/p>


在操作U盤的任何時(shí)候,只要插拔U盤的話都會(huì)產(chǎn)生中斷。中斷狀態(tài)為0X16。


中斷狀態(tài)要自己讀取是嗎?那我是不是要在中斷中判斷狀態(tài) 才知道是不是這個(gè)事件呢?


中斷狀態(tài)需要自己來(lái)讀取,只有判斷出這個(gè)狀態(tài)才知道U盤拔出事件。


再請(qǐng)教各位大哥個(gè)問(wèn)題:謝謝先?。。? U盤正在被高速讀取中,此時(shí)斷開(kāi)電源再 接通電源 ,程序無(wú)法正常初始化CH375和U盤,也即發(fā)送CMD_SET_USB_MODE命令無(wú)響應(yīng),任何操作無(wú)反應(yīng),請(qǐng)問(wèn)該如何處理???是不是要RESET ch375?? 救命阿~~


只有登錄才能回復(fù),可以選擇微信賬號(hào)登錄

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