ch375能識(shí)別多少種u盤[原創(chuàng)]

我用ch375a做讀寫u盤的應(yīng)用,但是我遇到了幾個(gè)讀不出來(lái)的u盤,具體的現(xiàn)象是發(fā)出DISK_READ命令后收到中斷為USB_INT_DISK_READ,然后再發(fā)出READ_USB_DATA命令,讀到的數(shù)據(jù)不夠64字節(jié),說(shuō)明在usb傳輸過(guò)程中發(fā)生了錯(cuò)誤...怎么才能糾正這樣的錯(cuò)誤? 本來(lái)我是用sl811做的,為了編程簡(jiǎn)單后來(lái)選擇了375,這些u盤用811讀寫是沒(méi)有這樣的問(wèn)題的。如果這個(gè)問(wèn)題解決不了,那只好再用回811了,希望得到解答


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

還有,我用的不是子程序庫(kù)


如果不用我們的庫(kù)的話,那么,你的U盤的初始化那邊是怎么做的,可以不可以把那部分程序貼出來(lái)看下可以嗎??如果初始化做的不好的話,可能支持的U盤不是很高,如果想支持更多的U盤的話,建議你使用我們子程序庫(kù),我們的子程序庫(kù)U盤的支持率在95%以上


上電后先延時(shí)200ms,然后發(fā)出 RESET_ALL 命令,再延時(shí)100ms,再發(fā)SET_USB_MODE命令,設(shè)置模式為START_DEVICE_AUTO_SOF。延時(shí)100ms,發(fā)DISK_INIT命令。如果有u盤就發(fā)DISK_READY和DISK_SIZE命令。然后就是DISK_READ讀扇區(qū)了,錯(cuò)誤就是在發(fā)出DISK_READ命令后可以收到中斷USB_INT_DISK_READ,再發(fā)出READ_USB_DATA命令,讀到的數(shù)據(jù)不夠64字節(jié)或者是夠了64字節(jié)但再發(fā)DISK_RD_GO再收到中斷USB_INT_DISK_READ后讀數(shù)據(jù)就是0了。以前沒(méi)有碰到過(guò)這樣的問(wèn)題。我們新買了一批u盤大部分都是這個(gè)問(wèn)題,沒(méi)有問(wèn)題的也不是很穩(wěn)定。但pc機(jī)可以很好地讀寫u盤且速度很快,我用以前的sl811做的也不出錯(cuò),希望找到解決方法.


其實(shí),出錯(cuò)并不是什么大問(wèn)題,關(guān)鍵是出錯(cuò)后該做什么處理才能夠再變得正確。好像沒(méi)有什么命令用來(lái)做出錯(cuò)處理阿


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ò)誤 */ mDelaymS( 250 ); if(j==5) return(Status); } CH375_WR_CMD_PORT( CMD_DISK_R_SENSE ); /* 獲取USB存儲(chǔ)器的容量 */ 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ò)誤 */ } } return( 0 ); /* U盤已經(jīng)成功初始化 */ } 這個(gè)是初始化的程序,你可以參考下,實(shí)際的計(jì)算機(jī)對(duì)U盤的初始化要比這個(gè)復(fù)雜很多,要是加出錯(cuò)處理的話,一般情況下在初始化不成功的話,你可以加一點(diǎn)重試在里面.


這段程序執(zhí)行過(guò)去沒(méi)有問(wèn)題,關(guān)鍵是在讀u盤扇區(qū)的時(shí)候出錯(cuò)


我用仿真器跟蹤,是發(fā)出讀扇區(qū)的命令后,第一個(gè)數(shù)據(jù)包有時(shí)不夠64字節(jié),這個(gè)怎么處理?


我覺(jué)得是ch375芯片本身就識(shí)別不了這個(gè)u盤。我有你們的一個(gè)板子,用的是你們的程序,也是識(shí)別不了...怎么辦?


這個(gè)不是芯片的問(wèn)題,那你如果有我們的板子的話,那你可以直接上我們的庫(kù)來(lái)跑下看你那些U盤支持不支持,實(shí)際上作為USB接口芯片,實(shí)際操作U盤的是單片機(jī),而和我們芯片本身沒(méi)有任何的關(guān)系


就是跑你們的庫(kù)不支持,我仔細(xì)研究了一下,是讀u盤扇區(qū)出的問(wèn)題。發(fā)出讀扇區(qū)命令DISK_READ后再寫入lba,扇區(qū)數(shù),然后收到USB_INT_DISK_READ中斷,然后再發(fā)READ_USB_DATA讀到的數(shù)據(jù)長(zhǎng)度是8個(gè)字節(jié),而不是64字節(jié)。讀完這8個(gè)字節(jié)后再發(fā)DISK_RD_GO命令再收到中斷就是 USB_INT_DISK_ERR 了,我就是想問(wèn)一下如果出現(xiàn)了讀到的數(shù)據(jù)不滿64字節(jié)該怎么處理?


讀到的8個(gè)字節(jié)數(shù)據(jù)是: 00, 00, 8E, C0, 8E, D8, 8E, D0. (HEX),能夠知道是怎么回事么?


你用的是我們375直接按扇區(qū)操作U盤的例子吧,操作U盤的讀寫都是以扇區(qū)進(jìn)行的,也就是至少是512字節(jié),你讀U盤的0扇區(qū),看是什么數(shù)據(jù)。一般的U盤0扇區(qū)是DBR表,前幾個(gè)字節(jié)應(yīng)該是EB,3E(58),90----。你也可以直接用其他工具查看U盤該扇區(qū),看和你讀出來(lái)的數(shù)是不是一樣。


...u盤是沒(méi)問(wèn)題的, 不管讀那個(gè)扇區(qū),都是讀不出來(lái)的。根本就讀不到512個(gè)字節(jié),讀了8個(gè)字節(jié)就出錯(cuò)了。我們買了一批u盤,有50%是讀不出來(lái)的..郁悶啊


還有一些是讀了64個(gè)字節(jié)然后就讀不出來(lái)了,前面64個(gè)字節(jié)是正確的。下一個(gè)64字節(jié)就返回 USB_INT_DISK_ERR 的錯(cuò)誤狀態(tài),查看你們的datasheet,是 USB 存儲(chǔ)設(shè)備操作失敗,怎么解決?


你可以不可以把你的程序發(fā)過(guò)來(lái)看下: tech@wch.cn


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

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