1、測試命令不能正常取反(CHECK_EXIST)。
需要從硬件和軟件兩個方面排查問題。
硬件方面:分析上電默認接口選擇是否正確。例如,使用CH376S的SPI接口,硬件電路必須保證WR#,RD#引腳接地,PCS#,A0,RXD,TXD引腳懸空或接高電平,其他具體配置方法見CH37xDS1手冊通訊接口章節(jié);測量晶振起振情況,不起振嘗試調節(jié)電容大小或換晶振;確保V3引腳在電源電壓為5V時通過103電容接地,在3.3V供電時,直接連接到3.3V電源上;RSTI引腳是否符合該芯片上電復位的狀態(tài),例如CH376為高電平復位,所以RSTI一般需接103電容到VCC,該引腳也可以選擇懸空。
軟件方面:上電后芯片有復位時間,所以一般需要延時50~100ms后操作CH37x。對于串口模式操作,波特率是否正確,可用串口調試助手發(fā)命令測試(CH375較為特殊,9位數據位,只能用單片機等控制器發(fā)送測試命令,實際編程時也應注意該問題);對于SPI通訊接口,CH37x僅支持SPI模式0和模式3,命令與數據之間需要保留2us延時,數據與數據之間需要保留1us延時。命令開始前拉低CS,命令相關的數據發(fā)/收結束后拉高CS,即CS拉低后的第一個數據代表的是命令碼;對于并口通訊方式,檢查軟件時序、總線地址是否有誤,軟件模擬的并口,注意IO方向切換。
?
2、關于U盤插入檢測不到連接的解決辦法
檢測失敗返回值,如果主機模式已設置,插入U盤會產生中斷狀態(tài)0X15,拔出會產生中斷狀態(tài)0X16。如果CH376/CH378執(zhí)行0x30命令,如果U盤已連接產生0x14中斷狀態(tài),如果U盤未連接產生0x82中斷狀態(tài);如果測試命令、模式設置都已通過,檢查設置的模式能否自動檢測連接?(一般設置成已啟用的主機方式,自動產生SOF包模式);測試D+、D-信號線,對于全速、高速設備,總線空閑時D+是高電平,D-是低電平,低速設備D+ D-電平與之相反;另外,還可以U口加電容或外供電方式以防止某些U盤功耗比較大導致CH37x供電不穩(wěn)甚至芯片復位的情況。
?
3、執(zhí)行DiskReady()或者DiskMount()? (0x31)不通過的解決辦法
USB設備接入后,需至少延時100ms,等待設備供電穩(wěn)定后,才可執(zhí)行磁盤初始化命令;當前模式是否正確,是否在操作U盤或SD卡模式,對于U盤,設置為主機產生SOF包模式;讀出失敗返回值,此命令是芯片首次和U盤之間進行數據傳輸,此問題一般是硬件原因,U盤的供電上可嘗試采用5V外部供電或者USB口并接大電容;檢測USB信號線是否接反(線序是VCC D- D+ GND);建議可參考給我司提供的README.pdf文檔(官網搜索“README”下載 http://www.findthetime.net/download/README_PDF.html),里面提供了USB口設計要求;循環(huán)執(zhí)行“DiskMount()”,抓一下D+,D-信號波形,觀察是否規(guī)整,可以先去掉USB口的ESD保護器件;更換U盤測試。對于SD卡,如果返回0x82錯誤,檢查SD_SDI(輸入),SD_SDO(輸出)是否接反。
?
4、SPI通訊模式下,收發(fā)數據一致,常見的有返回0x22等數據
SPI通訊模式下,命令的開始需要拉低CS,命令的結束需要拉高CS,如果不清楚命令什么時候結束,命令是否產生中斷,請詳細看CH37XDS1手冊的“命令”章節(jié)。命令碼與數據之間的時間間隔需要保證2微秒,數據與數據之間的時間間隔需要保證1微秒。執(zhí)行像0x30,0x31等這一類有中斷產生的命令,必須要等中斷產生后,才可執(zhí)行磁盤狀態(tài)檢測命令(0x22)。
5、創(chuàng)建文件成功(0x14),但是在電腦上不可見。
首先確認文件名格式保證是正常的短文件名(長文件名方法必須參考例程):文件名<=8字符,必須全部大寫,擴展名<=3字符,也必須全部大寫。
使用CH376能否讀取自己創(chuàng)建的文件內容或者電腦創(chuàng)建的短文件CH376能否打開?發(fā)0x01命令讀取芯片版本是否是低版本(小于0X43),如果是低版本,設置文件名之前是否設置一些內部變量?(詳見FILESYS.C文件的CH376SetFileName函數)。(對于某些參考編程指南寫的用戶往往會忽略這一點,所以建議用戶都直接使用已提供的應用層函數FILESYS.C,免去大量開發(fā)時間,并且這個文件也很成熟,不需要任何修改就可以添加到工程直接使用)。
?
6、創(chuàng)建文件成功(0x14),但是在電腦上看到亂碼或者打不開文件。
重點檢查文件名,是否符合短文件名規(guī)范。短文件名的文件名長度不超過8字節(jié),后綴不超過3字節(jié),并且由英文大寫字母、數字、下劃線等組合。
?
7、寫文件之后,文件長度只有一個字節(jié)。
是否執(zhí)行文件長度刷新操作,常用的文件長度刷新有兩種,可以執(zhí)行關閉文件,同時指定參數為1,或者調用CH376ByteWrite(buf, 0, 0 )或CH376SecWrite(buf,0, 0)? (使用前者還是后者取決于使用字節(jié)寫還是扇區(qū)寫,不可混用);如果已經執(zhí)行了文件長度的刷新,但是文件長度仍是1,那么可能是部分盤的寫入緩存導致的文件刷新操作沒有執(zhí)行到,所以可以另外執(zhí)行額外的操作,例如創(chuàng)建文件再刪除或者打開文件等操作。
?
8、關于CH376串口操作方式的注意事項。(部分用戶會混淆中斷檢測的方式)
CH376串口操作時,INT引腳也是可選的。第一種情況是使用INT引腳作為中斷檢測引腳,也就是中斷是通過INT引腳變?yōu)榈碗娖絹磉M入的,使INT引腳重新恢復高電平的唯一方式是執(zhí)行GET_STATUS(0x22)命令讀取“中斷狀態(tài)”。但是,在INT引腳變成低電平的同時,單片機串口也會接收到一個字節(jié)數據(中斷狀態(tài)),這個數據一般丟掉(清中斷一般可以丟棄),使用0x22命令重新獲取中斷狀態(tài),同時恢復INT引腳電平。
第二種情況是不使用INT引腳作為中斷判別標志的,而是使用上文提到的和INT引腳變低的同時串口收到的數據作為中斷判別標志,即只要收到數據就說明中斷到來(376的中斷只會在確定的一些命令發(fā)下去之后產生或者拔插操作也會產生,所以中斷產生的時刻是確定的,在那些時刻等待這個串口數據就可以了)。讀到的這個數據可以作為中斷狀態(tài)直接返回,也可以丟棄,只作為一個中斷到來的標志,使用0x22再次讀取中斷狀態(tài)值。關于串口方式的這兩種檢測使用的詳細代碼參考CH376EVT資料包(UART_HW.C)。
特別說明:例程中xWriteCH376Cmd函數中RI=0就是丟棄串口數據的一種方式。
?
9、枚舉USB設備過程返回0x20,0x24,0x28,0x2C錯誤
以上錯誤統(tǒng)稱為“設備響應超時,設備沒有返回”。檢查USB通訊速度是否匹配,檢測方法參考375/6主機代碼。對于獲取描述符還可以使用GET_DESCR(0x46)命令嘗試。其他解決方法參考第三點“執(zhí)行DiskReady()或者DiskMount()? (0x31)不通過的解決辦法”。
?
10、模擬USB設備時枚舉出現(xiàn)問題
代碼中不可以有過多的打印信息,防止未能及時響應PC而導致PC將其掛起,當然也不可使用硬件單步調試;看BUSHOUND軟件能否抓到一些數據包輔助調試(可能會抓不到,但是可以把要模擬的設備放到電腦上抓一些包,仿照收發(fā)包流程并模擬設備的響應);進入中斷后都需要緩沖區(qū)解鎖(參考提供的示例代碼)。
?
11、測試命令抓包數據(20MHz時鐘,發(fā)送0x65,返回0x9A)
CS信號需要在發(fā)送0x06命令碼之前拉低,讀取到數據0x9A數據之后拉高。發(fā)送命令碼0x06之后一般需要延時2us發(fā)送數據0x65,之后延時1us讀數據0x9A。
?
12、把CH376EVT代碼從C51驅動移植到其他MCU。
主要需要修改4個函數的實現(xiàn)形式,分別是xWriteCH376Cmd、xWriteCH376Data、xReadCH376Data、Query376Interrupt,可以使用串口、并口、SPI接口,其他的如延時函數、打印函數等也需要修改。推薦直接使用FILE_SYS.H提供的文件操作函數,不建議修改FILE_SYS.C文件。
????? 13、關于并口操作CH375、CH376、U盤模塊、CH4XX等芯片,讀寫數據出錯的可能原因。
? 首先,如果有邏輯分析儀或示波器最好抓取數據線、AO、CS、WR、RD信號線,然后對照手冊時序圖參數調整時序。其次,可能因為MCU與芯片供電電平不匹配,同時共地不可靠導致數據不穩(wěn)定(時好時壞)??梢栽黾庸驳鼐€、匹配信號線電平(可以調整單片機IO輸出模式,如開漏輸出+外部上拉方式;切換CH37X供電電壓)、讀信號拉高后立刻采數據、讀信號對地加pF級電容嘗試。
注:CH37X 參考示例代碼 http://www.findthetime.net/bbs/thread-65122-1.html