CH372或CH375的USB通讯问题解答
1、如果是在沒有單片機的情況下,進行簡單的I/O輸入輸出,那么可以參考CH341的資料,CH341不需要單片機就能獨立工作,可以提供串口、并口、兼容IIC或I2C的2線接口、兼容SPI及JTAG的4線接口、5線接口等,可以提供多個GPIO通用I/O,可以用于控制低速模數轉換AD、DA、數字I/O、I/O擴展等。
2、如果是單片機/DSP等與計算機相連接,也就是USB設備方式的應用,那么參考CH372的資料。可以下載CH372+CH451評估板/演示板的資料CH372EVT.ZIP,有PDF文檔和例子程序,例如,評估板說明及USB設備應用參考CH375451,參考電路和PCB,小數據量交互傳輸/應用層中斷演示的例子DEMO,含MCS51單片機C程序和匯編程序,批量數據傳輸的例子BULK測試速度,USB外置固件的C和匯編例子XFIRM,VC/VB/BC/DELPHI的例子等。另外,可以下載CH37X在計算機WINDOWS下的簡單調試工具CH372DBG.ZIP,其中有MCS51單片機上位機與下位機的C源程序,PC機程序可以通過USB對MCS51進行簡單仿真和控制,其中的C程序稍作修改就可以用于其它單片機。調試工具DEBUG372可以用于調試和檢查下位機的程序。
3、如果是單片機/DSP等控制其它USB設備,也就是USB主機方式的應用,那么可以參考CH375的資料。如果是讀寫U盤并且用量較少或者是系統集成,關心快速入門并且簡單易用,那么可以參考半成品U盤文件讀寫模塊的說明CH375HM.ZIP;如果是做原始產品設計,關心成本,那么可以參考CH375評估板資料CH375EVT.ZIP,其中有單片機讀寫U盤的例子和U盤文件級子程序庫的API說明;如果是單片機控制USB打印機等,或者CH375與CH372等其它USB產品通訊,可以參考USB主機方式應用參考CH375HST.ZIP。在設計USB-HOST電路和PCB之前,強烈建議參考CH375的設計注意事項README.PDF。
* 關于電源
優先使用5V電源,CH37X在5V電源時的性能高于3.3V,可以作為工業級使用。
對于USB-HOST應用,建議參考CH375的設計注意事項README.PDF,要考慮USB帶電插拔的實際情況。
樣板中的電阻R1(串在USB電源與本板電源之間)是為了便于雙電源供電,防止兩個電源電壓不同沖突。如果儀器本身有電源,或者不需要計算機雙電源供電,那么可以去掉該電阻。
* 單片機無法與CH372或者CH375進行通訊,例如CMD_CHECK_EXIST不成功或者CMD_SET_USB_MODE返回錯誤
? ?通常是硬件問題,例如:
? ?1、CH375沒有時鐘,可能是晶體不良未振蕩,電容或者晶體漏電,CH375的時鐘必須是12MHz。
? ?2、CH375沒有成功復位,可能是RSTI引腳沒有0.47uF上拉電容,也可以用單片機I/O口或者uP監控電路為其提供復位,注意CH375的RSTI引腳內部有下拉電阻。對于CH372應該確保電源完全放電后再通電。
? ?3、CH375的片選地址譯碼錯誤,例如,與RAM地址范圍沖突
? ?4、數據總線或者讀寫線連接錯誤等
? ?5、用CMD_CHECK_EXIST命令測試硬件問題,該命令必然返回數據,如果返回數據不是0FFH,那么通常是數據總線連接錯誤,這種問題容易處理,可以根據返回的值分析是哪個數據線有誤。
如果返回數據是0FFH,那么可能CH375不正常,例如,無時鐘、未復位、讀寫片選線有誤、工作于串口方式等,如果復位期間CH375的TXD引腳是高電平,那么CH375工作于串口方式,當然并口操作無效
* 測量CH375的晶體振蕩時好象不振蕩
? ?為了降低EMI,CH375的振蕩為接近正弦波,所以振蕩相對較弱,而一般單片機的振蕩接近方波,振蕩較強但是電磁輻射大很多。當測量儀器接入CH375的引腳時,由于引入電容,在3.3V電源電壓時容易導致CH375停振,當去掉測量儀器時通常會恢復。如果是在3.3V電源電壓下,建議使用有源晶振或者外部振蕩,或者將XI引腳的電容換為10pF。振蕩后XO引腳的電壓在一半電源電壓附近。
* 連接到計算機沒有反應
? ?當單片機控制CH37X執行CMD_SET_USB_MODE命令,選擇模式2后,首次連接計算機,計算機就應該提示找到新硬件,否則應該檢查CH37X是否正常工作(看前面的問題)。如果確認單片機端沒問題,那么可以用萬用表測量CH37X的UD+和UD-引腳,也就是USB信號線,應該UD+為3V以上,UD-為0.4V以下,否則說明CH375未工作或者未收到CMD_SET_USB_MODE命令,只有模式1和2會導致UD+上拉到3V電壓以上。
* 連接到計算機,無法安裝驅動,提示未知設備
? ?1、CH375的GND以及單片機的GND必須與USB的GND可靠地連接,USB的VBUS/+5V可以不連接。
? ?2、USB的D+和D-信號線接反,導致通訊失敗,USB線4個,分別是+5V,D-,D+,GND,順序不能錯。
? ?3、USB信號線必須用標準的USB線,不能用普通排線等代替,D+和D-布線要平行,附近鋪地減少干擾。
? ?4、由于CH37X內置了USB電阻,所以外部電路中D+和D-不需要串電阻,如果一定要串也不能大于5歐姆。
? ?5、如果是5V工作電壓,CH37X的V3引腳必須與VCC斷開,如果是3.3V工作電壓,那么V3應該連接VCC。
? ?6、建議調試初期不要設置USB-ID,也就是單片機不要執行CMD_SET_USB_ID命令,等調通后再嘗試修改。
? ? ? 如果單片機執行CMD_SET_USB_ID命令,那么必須在CMD_SET_USB_MODE之前執行。如果單片機執行CMD_SET_USB_ID命令修改了USB-ID,那么必須同步修改驅動程序INF中的ID才能安裝驅動。
* 計算機成功安裝驅動程序,但是無法進行任何USB通訊
? ?通常是單片機未收到或者未處理USB中斷,驅動的安裝與初始化是由CH372和CH375內置USB固件實現的,不需要單片機的任何干預,而USB數據通訊需要由單片機收到USB中斷并由程序實現
* 在與計算機連接時,為什么不能對單片機進行程序單步調試
? ?標準的USB傳輸都是時間限制,單步調試容易導致USB超時,尤其在外置固件模式下,更容易超時。
? ?解決方法是,用CH375作為USB-HOST,代替計算機單步調試您的USB設備,CH375可以不超時。
* 如何用一個CH375實現USB-HOST和USB-DEVICE
? ?CH375的串口連接只支持USB-HOST,所以必須通過8位并口與單片機連接。由于CH375自身沒有主導權,只能在單片機的控制下,切換為主機或者設備模式,所以單片機應該決定是主機還是設備,具體可以參考USB電路及PCB設計注意事項README中的說明,在CH375評估板資料中,EXAM0是主從切換應用的例子。
* 關于應用層USB中斷服務的特點
? ?CH372的動態錠接庫DLL提供了偽中斷服務,實際的中斷服務仍然是在驅動程序庫完成的,只是在完成后向DLL發了個通知,由DLL再調用偽中斷服務子程序。由于涉及到系統層與應用層切換以及線程切換,所以中斷頻率不能太高,如果太高,雖然驅動程序能夠收到中斷,但是等到通知到應用層,再調用客戶的偽中斷服務程序,最慢可能需要10毫秒,從而在應用層丟失中斷。自己寫驅動可以提高響應速度。
* 關于USB傳輸速度
? ?CH372/CH375與計算機通訊時,默認的CH37X驅動程序和DLL提供的API是同步I/O而非異步I/O,所以API返回就說明該API執行完成,由于WINDOWS要提前安排USB幀調度,所以兩次USB傳輸之間的間隔總是會大于1mS,例如傳兩個64字節的包可能需要2mS,而傳一個256字節的包可能只需要1mS。這種情況可以通過修改驅動程序在驅動程序層傳輸數據或者用異步I/O解決,注意異步I/O在API返回時不代表該API完成。
? ?計算機單次收發的數據塊越大平均速度越快(單次最大4KB),CH372/CH375實測傳輸速度最高為400K字節每秒(在10秒內連續測試的平均值),但是實際應用考慮到留些余量,考慮到應用程序在收發數據之外還要分析處理數據,通常應該按200K計算。USB作為串行總線,采用包傳輸的方法,實時性不如PCI總線,PCI能達到微秒級,而USB的響應時間只有幾百微秒到幾毫秒,在驅動程序中實現的性能要好些。
* 如何做WINDOWS驅動程序,WINDOWS DDK如何獲得
? ?我們的驅動程序全部使用WINDOWS 98/2000/XP DDK編譯,同時支持WINDOWS 98/ME/2000/XP。DDK可以從微軟官方網站免費下載(訂購芯片時如果需要我們也可以提供刻錄光盤),除此之外,只需VC 5.0或者VC 6.0編譯器,完全不需要額外軟件支持。這樣做出的驅動程序代碼效率高并且文件短小,通常我們用INF安裝信息文件而不是SETUP可執行程序,可以算是綠色軟件。用戶如果希望有更友好或者更簡單的編譯方法,那么可以使用第三方的驅動程序生成工具,當然,那些軟件通常都不便宜。
? ?對于非WINDOWS驅動程序,可以參考其它USB設備的驅動源碼修改,大多數USB設備的枚舉、初始化過程都是一樣的,區別僅在于端點/管道:CH372/CH375除端點0外有三個端點,地址分別是02H、82H、81H,依次為主輸出BULK-OUT/64字節,主輸入BULK-IN/64字節,輔輸入INTERRUPT-IN/8字節/1mS,通常只用前兩個主端點,一個從計算機輸出到CH375,一個從CH375輸入到計算機。
* 數據采集中,單片機如何設計USB程序
? ?簡單的做法是,單片機開兩個64字節的緩沖區,主程序定時采集數據,累加到第一個64字節緩沖區中,當第一個緩沖區滿時,使用CMD_WR_USB_DATA7命令上傳64字節,然后主程序切換到第二個緩沖區繼續采集數據,當第二個緩沖區滿時,首先檢查上次的上傳是否成功(上傳成功會收到CH37X的中斷),如果成功則繼續上傳64字節,如果不成功,說明計算機應用程序沒有來取走數據(正忙或者未執行采集程序),那么可以忽略或者另行處理(提示計算機未連接)。該方法不使用中斷,但是需要計算機不斷地來讀取數據,實際的計算機程序可以設置USB讀取超時,防止在單片機不上傳數據時計算機一直等待。
* 設計的計算機端應用程序在讀寫USB時有時會死機,而計算機的其它程序一切正常
? ?1、這種死機實際上是計算機端程序以為下位機會收發數據,而實際下位機沒有,導致計算機一直等待。
? ? ? 一般情況下,在計算機與單片機的應用層應該有一定的約定:如何傳數據、傳多少、什么時候傳、雙方如何同步,如果雙方沒有約定好,那么可能出現甲方以為乙方會傳而乙方未傳則會導致甲方一直等待。最佳的解決方法是,設計良好的程序結構和雙方約定,確保不出現上述的“以為”,另外再輔助以超時解決方法,超時解決方法是,甲方收發數據,如果乙方正忙,那么甲方只等待一定時間而非一直等待。新版的驅動程序都支持超時CH375SetTimeout,如果設置超時為200毫秒,那么超過200毫秒收不到數據,甲方也不會一直等待下去,但是主程序應該分析這種情況是什么原因。建議超時值大于正常情況下最大傳輸時間的2倍以上,最小要有數毫秒,因為計算機忙時正常傳輸時間也會增大。
? ?2、類似情況還有,應用程序調用API準備接收80字節,而單片機只打算上傳64字節,那么在計算機收到64字節之后,因為不足所需要的80字節,所以繼續等待后面的數據。原因是,USB傳輸最大包是64字節,所以單片機上傳64字節不能說明后面沒有數據(真正的80字節傳輸是先傳64再傳16)。
解決方法是,單片機在64字節之后再上傳0字節,當計算機收到0到63字節時,認為后面沒有數據(因為USB最后一個包的長度才可以少于最大包長度64),從而不管應用程序需要多少字節而提前退出接收。
? ?3、另外還有一種失誤,單片機程序在收到上傳成功中斷后未解鎖CMD_UNLOCK_USB,導致CH372/CH375拒絕處理后面的USB傳輸,而計算機程序不知道,會一直等待下去,除非超時退出。
? ?4、如果要求的傳輸速度不高(小于20K字節每秒),那么可以參考CH37X調試工具中的調試程序,它使用單個數據包的請求加應答方式,每個回合的USB操作都是計算機發下去一個命令包(含數據),然后單片機返回應答包(含數據),因為雙方約定有序,所以理論上絕對不會出現死機情況。
? ?5、默認情況下的DLL是同步操作I/O,所以打開設備的同一句柄handle同一時候只能用于一個API,如果同時有多個API使用同一個句柄則會導致阻塞。如果應用程序的多個線程都需要調用DLL的API,那么必須使每個調用者分別使用各自的句柄handle,可以在主線程中OpenDevice后,用GetDeviceName獲取設備名稱,然后由各線程調用CreateFile分別打開USB設備獲得各自的句柄,再用于API調用,
* 單片機是否要對USB傳輸的數據進行校驗
? ?USB傳輸本身是帶CRC16校驗的包傳輸,CH375自動檢查CRC16,如果它檢查通過,那么實際出錯概率非常之低,如果CH375檢查CRC16未通過,那么它會和計算機約定重傳幾次直到CRC正確,所以正常情況下單片機不需要考慮數據校驗和數據重傳。
* 關于丟數據、計算機調用API返回出錯、數據錯誤等
? ?1、丟數據通常是這樣,上位機準備讀取5個字節,而下位機上傳8個字節,那么CH372的DLL及驅動程序在收到8個字節后,只將應用程序所需的5個字節返回,而丟棄后面3字節。
? ?2、正常情況下USB傳輸不會出錯,如果返回錯誤通常是USB設備斷開、USB傳輸超時(超時太短)、或者單片機程序有誤,寫入無效的數據長度等(例如向端點2寫入長度65等)。
? ?3、數據錯誤通常是這種情況:應用程序未檢查API返回時USB傳輸的實際長度,以為有足夠數據返回,可能實際上沒有,當然緩沖區中的數據是無效的。例如,應用程序準備讀取512字節,而單片機只上傳200字節,那么API返回時的實際長度只有200,如果應用程序不檢查該長度而以為是500,那么就會認為后面的數據錯誤。類似情況是USB超時太短,計算機接收到一半時因為超時提前返回,長度不足。
* 想自己做U盤、做定制功能的USB鼠標等
? ?使用CH372、CH375的外置固件模式,外置固件模式下與市面上大多數USB接口芯片的使用方法差不多。我們網上可以提供自己動手做U盤的全套低成本方案/源程序/樣品等。做USB鼠標也有源程序供參考。
* 單片機通過CH375能否從其它帶USB端口的儀器中采集數據?能否操作其它USB設備、例如USB打印機等
? ?理論上可以,實際上有個條件,就是必須了解被操作方的USB傳輸的具體細節,例如通過哪些端點收發數據,數據的格式是怎樣的。例如,USB打印機是符合USB類規范的,所以USB傳輸的細節是公開,當然能夠進行USB傳輸操作,但是如何打印出文字還需要了解打印描述語言。對于帶USB端口的儀器,因為通常都不符合類規范,所以需要知道其傳輸數據的端點和數據格式,才能采集數據,否則即使通過某端點接收到數據,也不知道是什么數據,所以關鍵是被操作方必須公開USB傳輸的資料,同一廠家當然沒問題。
* 與計算機USB通訊有時不穩定
? ?有3種原因,一是時鐘不穩定,二是時鐘受干擾,三是USB信號受干擾。這三種情況通常與電路及PCB設計有關,尤其是時鐘電路的GND、USB芯片的GND、電源退耦電容的GND之間盡量縮短連接,具體說明請參考USB芯片的電路及PCB設計的注意事項README.PDF。
?
CH375和CH372常見問題的解決:
1:問:U盤插在板子上,然后上電,工作正常。板子先上電,然后插U盤,板子檢測不到U盤插上和拔除。
? ?答:該問題是由于U盤插上時,電源對U盤供電,電源電壓產生波動,導致CH375復位,不產生中斷引起的。可以在USB口上的電源和地之間接一個大于200UF的電解電容。
2:若要使用3.3V電壓對CH375供電,要求VCC和V3引腳接3.3V,與CH375相連的處理器的電壓也要是3.3V,除USB口的D+、D- 外,任何與CH375相連的引腳都必須是3.3V的。
3:問:當在我沒啟動CH375設備模式時居然插在算計上能找到USB設備,不過不能裝驅動。
答:如果這種情況屬實則是CH375沒有正常復位。
4:問:我用LPC的單片機作模擬IO口時做輸入時不正確。
答:用模擬IO時序要掌握好,IO口作輸入時要往口上寫入1。
5:問:C8051F單片機可不可以用你們的U盤讀寫的庫函數,
答:可以,不過C8051F大部分是單周期指令,所以要考慮速度,應用的時候要注意MOVX指令的時間周期,(61就可以了);或者用我們的第5個庫,讀寫CH375靠用戶自己設定。
6:問:是不是可以用CH375作主機CH372作從機進行通訊,并且不處理描述符?
? ?答:可以。
7:問:直接寫入U盤的數據為何不能格式化掉?
? ? ?答:這牽扯到文件格式,對于現代格式化都是高級格式化(軟盤除外),格式化就是將引導區的文件信息刪除,對于存在存儲器的具體文件可能還在原處。用 一些工具是可以看到文件的存在的。 所以對于直接寫入的數據計算機就有可能不理會。這就是你所說的刪除不掉。這不會對使用U盤有影響。如果想格式化掉可能 需要重新分區。
8:問:我的U盤插上為什麼出現錯誤91?
答:這是因為庫不支持你的U盤格式建議你重新格式化。格成FAT16或者FAT12。
9:問:我的U盤寫入時為什麼在寫入64K是可以,寫入90K時長度變成20多K呢,
答:我們定義的長度是16位的,當自動修改長度時只能識別64K之內,當長度超過64K時要手動修該長度,或者重新定義長度為32位。
10:問:下位機每次通過端點2上傳4字節,為什麼上位機有時候會收到一串其他數據?
答:這要看你寫的具體程序。下位機每次發過一組數據后,沒有查看上位機是否接收就發第2組。假如第一次還沒被上傳就寫入了第二組,數據被覆蓋掉。
11:問:為什麼我在用CH375直接讀取U盤設備描述符時會讀取不成功,而其他向U盤初始化等命令能成功。
答: 第一是否設置模式。第二是否設備插上來延時充分。第三在給U盤操作時要對U盤復位一次,再操作。因為有的USB設備自己沒有復位功能,要依靠外界各其復位 后才能工作。PC機給所有剛插上來的USB設備都是先復位總線再操作的。CH375中的初始化U盤命令也是先復位總線再操作的。
12:問:在用CH375做HOST時,使用內部U盤讀寫固件操作U盤進行扇區操作均正常,但是當用程序進行SETUP過程時出現問題,程序執行過程:
a.初始化CH375芯片:復位芯片,發送測試命令,發送設置工作模式(0x06)命令,等待USB設備連接。
b.USB設備連接產生中斷后,發送獲取設備描述符命令,此時CH375返回中斷狀態字為0x20,無論USB設備是U盤還是攝像頭均出現此錯誤,運行環境:CPU:89S52 ,11.0592Mhz,附源程序。
答:錯誤碼20H說明目標USB設備應答超時,可能原因有:
a、目標設備尚未正常工作,例如未連接,或者已連接但未初始化好
? ?解決方法,確認連接后再延時數百毫秒
b、通訊錯誤,例如,晶振頻率不準(電容不符),非標準USB信號線
? ?解決方法,1、調整硬件,2、用SET-RETRY命令帶參數25H、8FH增加重試次數
c、目標USB設備連接時瞬時電流太大(降低了電源電壓),導致CH375不正常,
? ?解決方法:分開供電,或者為USB設備串入限流電阻或者電感
d、CH375操作時序不佳,導致數據不穩定,例如CMD與DATA之間不足2.5uS等
另外,您若是用I/O引腳模擬并口讀寫的,要考慮在模擬到一半時出現中斷的情況,
如果關中斷,又會影響速度。如果是51單片機,想省點I/O引腳,可以用 MOVX @R0,A 和 MOVX A,@R0,這樣P2口只用兩個:CS和A0,其它隨便用。
順便unsigned char u1_read_data(void)
{
?unsigned char ch;
?U1_A0 = 0?
?U1_CS = 0?
?P0 = 0xff ? // 放在RD=0之前更安全,否則如果之前P0輸出0,CH375輸出1會短路
?RD = 0 ? ? ?// CH375開始輸出數據
?P0 = 0xff ? ?// 原來的這一行就當延時吧,因為RD=0到CH375輸出數據要20納秒
?ch = P0?
?RD = 1?
?U1_CS = 1;
?return ch?
}
13:問:341可以單獨控制外部設備嗎?
答:341的開發就是考慮在沒有處理器使用的,假如要控制劇電器或者發光管,只要用CH341+74HC273就可以了。
總結
以上是生活随笔為你收集整理的CH372或CH375的USB通讯问题解答的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言中__attribute__ ((
- 下一篇: C语言学习书籍推荐《C语言程序设计 现代