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