1 問(wèn)題現(xiàn)象
有客戶使用STM32F405并參照ST官方USB標(biāo)準(zhǔn)庫(kù)下的HID+CDC的示例代碼做產(chǎn)品,發(fā)現(xiàn)在WIN7上使用得好好的,可放到WIN10上,CDC第一次能夠識(shí)別,再次拔插后就不能再識(shí)別,且此后無(wú)論插拔多少次都無(wú)法再識(shí)別,除非再次上電,又會(huì)重復(fù)上述現(xiàn)象,只有板子上電后第一次才能正確被識(shí)別,后續(xù)均不行。
2 問(wèn)題分析
客戶使用 ST官方示例代碼STM32_USB-Host-Device_Lib_V2.2.0\Project\USB_Device_Examples\Composite_Examples\CDC_HID_Composite當(dāng)我嘗試使用此示例代碼重現(xiàn)客戶所遇到的問(wèn)題時(shí),發(fā)現(xiàn)此代碼在WIN7運(yùn)行OK,但與客戶不同的是,我測(cè)試到的情況是在WIN10下CDC一次都無(wú)法識(shí)別,HID卻一直可以識(shí)別。
下面來(lái)分析下問(wèn)題,既然WIN7下HID和CDC都能正常識(shí)別,放在WIN10上才不正常,那么初步可以判斷,此問(wèn)題可能與WIN10操作系統(tǒng)的USB主機(jī)驅(qū)動(dòng)實(shí)現(xiàn)有關(guān)。
通過(guò)USB分析儀分析客戶代碼在WIN10下USB枚舉異常的數(shù)據(jù)通訊:

Figure 1 第一次USB枚舉過(guò)程
上圖是客戶代碼第一次正常枚舉的通訊數(shù)據(jù),從圖中可以看出,WIN10 USB主機(jī)在正常獲取HID報(bào)告描述符后,緊接著會(huì)獲取虛擬串口狀態(tài)和設(shè)置波特率,這樣就正常枚舉結(jié)束了。我們?cè)賮?lái)看看采集到的異常USB枚舉過(guò)程:

Figure 2 異常枚舉過(guò)程
上圖是WIN10下異常枚舉過(guò)程。從圖中可以看出,WIN10系統(tǒng)上USB主機(jī)在獲取到設(shè)備描述符和配置描述符后直接將設(shè)備掛起了。很明顯,WIN10系統(tǒng)的USB主機(jī)驅(qū)動(dòng)實(shí)現(xiàn)對(duì)設(shè)備描述符或者配置描述符的內(nèi)容并不認(rèn)可,才會(huì)導(dǎo)致無(wú)法識(shí)別HID+CDC復(fù)合設(shè)備。
我們不妨檢查下客戶代碼中的設(shè)備描述符:

Figure 3 獲取的設(shè)備描述符
復(fù)合設(shè)備的class,subclass,protocol
必須為0xef,0x02,0x01,這里
VID=0x0483,PID=0x3256(Cube庫(kù)下為0x5740,但這個(gè)不重要),接下來(lái)看配置描述符:

Figure 4 win10不能識(shí)別的配置描述符
由此可見(jiàn),客戶的描述符是HID interface + IAD + CDC interfaces結(jié)構(gòu)。對(duì)于WIN7,這種結(jié)構(gòu)可以識(shí)別,但對(duì)于WIN10,這種結(jié)構(gòu)WIN10未必能夠兼容,我們嘗試在HID interface外部加上一層IAD結(jié)構(gòu),使其成為IAD1 + HID interface + IAD2 + CDC interfaces結(jié)構(gòu),此時(shí)客戶的問(wèn)題得以解決,在WIN10也可以正確識(shí)別了,修改后的描述符結(jié)構(gòu)如下:

Figure 5 win10能夠正確識(shí)別的配置描述符
結(jié)束本篇實(shí)戰(zhàn)經(jīng)驗(yàn)之前,讓我們?cè)俅位仡橧AD的概念:
IAD(Interface Association Descriptor),為USB設(shè)備定義了一個(gè)標(biāo)準(zhǔn)來(lái)表述捆綁在一個(gè)邏輯功能(比如這里的CDC虛擬串口)上的多個(gè)接口的聚合的方法。USB協(xié)會(huì)分配了一個(gè)設(shè)備級(jí)別的類編碼(即圖3中0xEF),使用IAD的設(shè)備必須使用它(如圖3的設(shè)備描述符);這樣可以很容易在設(shè)備枚舉時(shí)就能識(shí)別出采用了IAD的設(shè)備。IAD描述符通常放在它所要捆綁的多個(gè)接口的接口描述符之前。
3 結(jié)論
在WIN10系統(tǒng)中,建議復(fù)合設(shè)備每個(gè)邏輯功能的接口描述符前都搭載一個(gè)IAD描述符,不論這個(gè)邏輯功能是單個(gè)接口描述符完成(比如這里的HID功能)還是要由多個(gè)接口描述符完成(比如這里的CDC功能)。
-
HID
+關(guān)注
關(guān)注
2文章
137瀏覽量
48607 -
CDC
+關(guān)注
關(guān)注
0文章
58瀏覽量
18503 -
Win10
+關(guān)注
關(guān)注
2文章
710瀏覽量
42100
原文標(biāo)題:HID+CDC復(fù)合設(shè)備在WIN10的識(shí)別問(wèn)題
文章出處:【微信號(hào):STM32_STM8_MCU,微信公眾號(hào):STM32單片機(jī)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
求助,關(guān)于USB復(fù)合設(shè)備HID+CDC串口問(wèn)題求解
蘋(píng)果筆記本WIN10下面USB連接出錯(cuò)的原因?
win7無(wú)法識(shí)別USB設(shè)備怎么解決?
基于win10系統(tǒng)的HID I2C設(shè)備開(kāi)發(fā)
USB HID示例適用于WIN10嗎
基于stm32f107+CubeMx+Keil如何去實(shí)現(xiàn)HID+CDC組合設(shè)備呢
怎么解決Win10系統(tǒng)無(wú)法識(shí)別USB設(shè)備的問(wèn)題?
STM32F4使用USB復(fù)合設(shè)備HID+BULK+MSC無(wú)法啟動(dòng)是什么問(wèn)題
將HID和CDC項(xiàng)目并到復(fù)合USB設(shè)備上時(shí)無(wú)法正常工作咋辦
USB設(shè)備同時(shí)用作CDC和HID時(shí)無(wú)法正常枚舉怎么解決?
win10電腦無(wú)法識(shí)別U盤應(yīng)該如何解決
HID_CDC復(fù)合設(shè)備在WIN10的識(shí)別問(wèn)題
PICKIT3 WIN10無(wú)法識(shí)別問(wèn)題
KT1404A語(yǔ)音芯片USB連電腦,win7正常識(shí)別WIN10無(wú)法識(shí)別USB設(shè)備

HID+CDC復(fù)合設(shè)備在WIN10的識(shí)別問(wèn)題
評(píng)論