對USB這塊,真是小白一個,腦子里一片空白,一點頭緒都沒,就是拿到人家調好的現成代碼都無從下手,
不知道從哪里開始看起,走的是一個什么樣的流程,一查USB相關協議,什么令牌包、數據包、
握手包,比如SOP-SYNC-Packet Content-EOP, Packet Content又分幾大類等,看了還是一頭霧水,
見到代碼還是頭大。每次都對自己說,這次要好好調試USB開發代碼的,幾乎每次都是無功而返。
這兩天在網上搜了一些相關資料,發現“手把手教你玩開發”,淘寶上搜這個店鋪也能找到相關視頻,真是萬分感謝
這段視頻的幫助,讓我找到了調試USB的切入點。該視頻有十五課,目前還沒看完,只看到了第十一課。視頻中用的是
STM32+PDIUSBD12 的USB功能,主要是學習usb device 和 host 相關的操作過程,當usb device 接到主機上,
主機和usb device需要哪些相關的操作,主機才能識別這個usb device,也就是枚舉過程。
大致步驟:
1、usb device接到主機上,如何告訴主機當前usb device是高速/全速還是低速設備,主機是通過什么樣的方式來判斷
>> 主機USB上的D+/D- 默認都有接下拉15K的電阻,所以初始狀態都為低電平:
(1)、usb device 的D+有上拉電阻1.5K至3.3V,接到主機host上,D+上的電平就從低變為高電平,電壓V = 15/(15+1.5) * 3.3 =3V,主機就會認這usb device是高速/全速設備
(2)、usb device 的D-有上拉電阻1.5K至3.3V,接到主機host上,D-上的電平就從低變為高電平,電壓V = 15/(15+1.5) * 3.3 =3V,主機就會認這usb device是低速設備
== 所以調試代碼時,先確認這件事,有的是需外部接電阻,有的是通過MCU內部開關打開這個這電阻。
2、主機檢測到有usb device,主機會先對usb device產生一個復位請求,讓usb device復位到一個狀態。
>>找到USB中斷函數中的復位判斷語句,在那打個斷點,或是加個打印信息,看主機是不是產生了一個復位請求。
3、復位產生后,主機會發送一組數據給usb device:0x80 0x06 0x00 0x01 0x00 0x00 0x40 0x00 這組數據是干嘛用呢,所以MCU必須解析這段數據
解析之前,MCU肯定是要將這組數據接收到才能解析,問題來了:
(1)、因為USB 有多個端點 endpoint 0/1/2,主機和下位機收發數據斷點必須一致,那、用哪個斷點來接收呢?不同端點用來收發什么樣的類型數據呢?
>> 這組數據是主機通過端點0給下位機發的,也就是endpoint -out (out是相對主機,是主機輸出),那么下位機得用端點0來收,所以會有先打開端點0 操作
(2)、數據收到后會存到一個buf中,然后對每個數據進行解析,解析時就要對照 USB2.0 spec資料了,官方下載資料
https://www.usb.org/developers ->Document Library 點擊Access 在搜索條件里輸入關鍵字查找要找的資料下載下來。
是一個壓縮包,里面有多個文檔,找到usb_20.pdf
直接翻到第九章的 -- 9.3 USB Device Requests,剛才收到的那組數據就是通過表中來進行解析