我手頭上有三個U盤,一個是金士頓8G,一個是2G(外殼寫的是金士頓,用電腦測出又是HISUN,這個應(yīng)該是水貨,但在電腦能正常讀寫,已經(jīng)用四年整了),另一個是256M的SD卡+讀卡器,這是我前天為了研究CH375A特意去買的。 現(xiàn)在程序和電路都做好了,同樣的電路和程序,8G和2G的U盤都無法讀寫!256M的U盤可以正常讀(每次讀操作都正常,總算有點成就感了,這應(yīng)該可以說明我的程序和電路都沒問題了吧?),但有時候能寫有時候?qū)懙揭话胗植荒軐?,比如寫一個512B的扇區(qū)只收到2個USB_INT_DISK_WRITE中斷,之后就一直收不到中斷,程序就一直等。這幾個U盤我都嘗試格式化為FAT16、FAT32也一樣的結(jié)果。 我想問的是CH375A是不是對U盤有兼容性的問題?到底哪些U盤兼容那些不兼容?
是不是直接使用CH375A讀寫U盤底層的物理扇區(qū)中的數(shù)據(jù),如果是,那么和文件系統(tǒng)就沒有關(guān)系。 CH375A只能5V供電,并且V3引腳 一定要對地接一個103電容,并且USB總線上面最好不要串接電阻之類的元器件。
是的,現(xiàn)在只是研究怎么讀寫扇區(qū),還沒有涉及文件系統(tǒng),只要能穩(wěn)定地讀寫扇區(qū),文件系統(tǒng)這一塊就好辦了,我這邊不缺這方面的人才的。電路我是參照CH375DS1.pdf文檔中并口方式,只是不用U3鎖存。我想,既然曾經(jīng)能成功地讀寫過扇區(qū),程序和電路應(yīng)該都沒問題了吧!只是為什么有時候能成功寫扇區(qū),有時候?qū)懙揭话刖筒荒軐懥??還有,為什么有的U盤能讀寫有的又不能?能否推薦下用什么牌子的U盤比較穩(wěn)定或兼容?
另外,剛才我仔細(xì)檢查下,發(fā)現(xiàn)寫到一半就不能寫時,連接在ACT腳上的LED燈滅了,然后我拔出U盤再插上去,燈也不亮,也沒有檢測到有中斷信號。好像CH375停止工作了,或者是自動復(fù)位而工作在默認(rèn)模式了。
其實U盤兼容性主要是在初始化。你看一下你的程序是不是在獲取DISK_SIZE的時候是返回成功的?并且磁盤容量獲取是正確的? 1樓說的電路,并不是邏輯部分的電路,這部分應(yīng)該問題不大,主要是USB信號部分,包含供電部分。不穩(wěn)定會導(dǎo)致兼容性不好。
獲取DISK_SIZE的時候已正確返回,和用WinHex的結(jié)果只相差一個扇區(qū),初始化CH375和U盤的每一步我都跟蹤調(diào)試過了,每一步都很正常。關(guān)于供電部分,單片機、CH375和U盤都是通過共用一條USB線由電腦的USB口供電。由于電路已經(jīng)焊好了,得空的時候我再試試U盤獨立供電。
這樣,先測試一下2G的盤,你跟蹤一下每一步過程,在哪里出錯,錯誤代碼是多少。詳細(xì)的描述一下
我跟蹤過了,在讀扇區(qū)前我先用CMD_DISK_READY查詢U盤是否就緒,返回1F,說明U盤還沒就緒,但是跟蹤初始化U盤的過程也沒有發(fā)現(xiàn)錯誤啊??!我這三個U盤中就只有256M+讀卡器的那個U盤可以正常讀扇區(qū),但寫扇區(qū)時卻不正常,偶爾能寫,但有時候只收到1個USB_INT_DISK_WRITE中斷,只收到2-7個USB_INT_DISK_WRITE中斷也有可能,程序就一直在那里等齊8+1個中斷,這時ACT上的LED燈是滅的。
這樣,先討論2G的問題??赡芙鉀Q了2G的問題其他的問題也就解決了。 你能否把你的代碼發(fā)給我?郵箱在簽名中可以看到。主要查看流程是否有問題
好的,我整理一下注釋先。
已經(jīng)發(fā)Email給您了,感謝查收。
在讀寫扇區(qū)的時候,請不要再去初始化U盤了。對有些U盤來說是不允許這樣做的。
我沒有在讀寫扇時初始化U盤啊,我只有在檢測到USB_INT_CONNECT中斷后才調(diào)用mInitDisk()函數(shù)初始化U盤。整個主程序只調(diào)用了兩次mInitDisk( )函數(shù),一次是在剛開始運行時,另一次在后面的死循環(huán)里,是為了允許多次熱插拔,我已經(jīng)用if語言判斷是不是USB_INT_CONNECT中斷了,如果是才調(diào)用mInitDisk()函數(shù)初始化U盤。
比如剛開始等中斷,這個地方可能根本就沒有中斷何必在這等呢?可能永遠(yuǎn)等不到中斷啊。在第一次 c = mInitDisk( ); // 初始化U盤,實際是識別U盤的類型,不影響U盤中的數(shù)據(jù),在所有讀寫操作之前必須進行此步驟 就直接 while ( 1 ) { c = mReadSector( 0x00000000, 1 ); } 增加一些調(diào)試信息即可。你那樣的做法是不對的
因為剛開始時U盤可能還沒有插入,那肯定要先等待USB_INT_CONNECT中斷先了,然后再調(diào)用c = mInitDisk( )初始化U盤,最后才能調(diào)用c = mReadSector( 0x00000000, 1 )讀U盤啊。我這個步驟應(yīng)該沒錯吧?上面我所說的等不到中斷,是在寫扇區(qū)時等不到USB_INT_DISK_WRITE中斷(寫一個扇區(qū)共需要8+1個中斷),而不是指等不到USB_INT_CONNECT中斷。
你的程序會死機的。在沒有中斷的時候等了中斷。 你仔細(xì)研究一下CH375EVT的CH375EV0.C,這樣主函數(shù)不要做修改,直接用我們提供的來試驗。USB_INT_DISK_WRITE這個中斷在寫函數(shù)里面已經(jīng)處理了啊。你到外面還在等,這樣顯然不對啊。你仔細(xì)想象這個過程?;蛘邔ξ覀兊拇a不修改(只修改和硬件相關(guān)的)。然后在來試驗。
USB_INT_DISK_WRITE中斷我只在寫函數(shù)mWriteSector()里面等,沒有在外面等?。?/p>