USB學習系列之三——USB設備的枚舉
2.在USB設備的枚舉過程中使用了控制傳輸,這種傳輸保證數據傳輸的正確性。控制傳輸分為:建立過程(主機發起)、可選的數據過程和狀態過程。
本文引用地址:http://www.104case.com/article/201612/330045.htm3.控制傳輸解析:
(1)主機發起建立過程,建立過程開始于一個SETUP令牌包,后面緊跟一個DATA0數據包,接著就是數據過程。
(2)如果是控制讀傳輸,那么數據過程就是輸入數據(相對于USB主機來說的);如果是控制寫傳輸,那么數據過程就是輸出數據。如果在建立過程中指定了數據長度為0,那么就沒有數據過程。數據過程之后是狀態過程。
(3)狀態過程剛好與數據過程的數據傳輸方向相反:如果是控制讀傳輸,則狀態過程是一個輸出數據包(相對于USB主機來說的);如果是控制寫傳輸,則狀態過程是一個輸入數據包。狀態過程是用來確認所有的數據是否都已經正確傳輸完成。
4.枚舉過程的解析:
(1)復位并讀取端點0最大包長度:
主機監測到設備插入后,首先對設備進行復位(也就是將差分數據線同時拉低一段時間,因為差分數據線正常狀態是一高一低)。USB設備復位之后地址為0,USB主機往地址為0的設備的端點0發送獲取設備描述符的標準請求(這是一個控制傳輸的建立過程)。設備收到請求后,在數據過程將設備描述符返回給主機。主機在成功獲取到一個數據包的設備描述符并且確認沒有錯誤后,就會返回一個0長度的確認數據包(狀態過程)。然后就會進入到設置地址的階段。
注意:標準的設備描述符有18個字節,但是有些USB設備端點0大小不足18字節,理論上說USB主機只有通過多次讀取才能讀取到18字節的數據,但是在此階段USB主機仍然只讀取一次,這一次讀取的數據大小最小為8字節(USB協議規定端點0至少為8字節),在這8字節的數據中已經包含了USB主機在這個階段需要知道的信息,也就是端點0的最大包長度。端點0的最大包長度存放于設備描述符的第8字節處。
(2)地址設置
USB主機往地址為0的設備的端點0發送一個設置地址的請求(建立過程),新的設備地址包含在建立過程的數據包中。具體的地址由USB主機負責管理,主機會分配一個唯一的地址給剛接入的設備。USB設備在收到這個建立過程之后就直接進入到狀態過程,因為這里數據過程是不需要的。設備等待主機請求狀態返回(一個輸入令牌包),收到輸入令牌包后,設備就返回0長度的狀態數據包。如果主機成功接收到該狀態包,就會發送應答包ACK(確認字符)給設備,設備收到ACK之后,就要啟用新的地址,以后主機就通過這個地址來訪問該設備。
注意:D12USB接口芯片會自動等待ACK之后才啟用新的地址,所以要在返回0長度的狀態包之前,將地址寫到D12芯片的地址寄存器中。
(3)獲取設備描述符
使用新的地址,獲取完整的18字節的設備描述符。如果端點0的最大包長小于18字節,那么就會有多多次請求數據輸入。
(4)主機獲取配置描述符和配置集合
配置描述符總共為9字節。主機在獲取到配置描述符之后就獲取配置集合。
(5)獲取字符串描述符等其他的描述符。
注意:設備返回的數據長度可以小于主機請求的長度。
評論