电竞比分网-中国电竞赛事及体育赛事平台

分享

USB?設(shè)備枚舉的數(shù)據(jù)傳輸過(guò)程

 lchjczw 2012-03-15

以下是一個(gè)程序枚舉數(shù)據(jù)傳輸?shù)娜^(guò)程: 

(1) 主機(jī)檢測(cè)到有設(shè)備插上,總線復(fù)位 

當(dāng)設(shè)備與主機(jī)連接時(shí),主機(jī)就會(huì)檢測(cè)到一個(gè)連接條件,并且D+的數(shù)據(jù)線被拉至Vse以上2.5微秒(30個(gè)全速數(shù)據(jù)比特周期),主機(jī)就開始進(jìn)行總線復(fù)位。 

(2) 主機(jī)讀取設(shè)備描述符 

主機(jī)使用默認(rèn)地址(地址0)讀取設(shè)備描述符,在這里主機(jī)使用地址0對(duì)設(shè)備的設(shè)備描述符進(jìn)行讀取。由于PDIUSBD12的端點(diǎn)0的緩沖區(qū)只有16個(gè)字節(jié),所以單片機(jī)就先發(fā)送16個(gè)字節(jié)的設(shè)備描述符。當(dāng)主機(jī)接收到這16個(gè)字節(jié)的字符后,就認(rèn)為真正有設(shè)備連接了,即發(fā)送1個(gè)0字節(jié)的數(shù)據(jù)包到設(shè)備作為狀態(tài)應(yīng)答。 

(3) 地址分配 

在地址分配階段里,主機(jī)分配給設(shè)備一個(gè)地址。在以后的通信里設(shè)備就只對(duì)這個(gè)地址的信息作出應(yīng)答。 

(4) 主機(jī)從新的地址獲取設(shè)備描述符 

分配好了設(shè)備地址后,主機(jī)就從新的地址獲取設(shè)備描述符。由于受PDIUSBD12芯片的限制,設(shè)備分2次把設(shè)備描述符經(jīng)過(guò)端點(diǎn)0發(fā)送出去,第一次發(fā)送16個(gè)字節(jié),第2次發(fā)送2個(gè)字節(jié)。最后主機(jī)發(fā)送0字節(jié)的數(shù)據(jù)包作為狀態(tài)應(yīng)答。 

(5) 主機(jī)讀取配置描述符 

主機(jī)讀取完設(shè)備描述符后就讀取設(shè)備的配置描述符 

(6) 讀取描述符集合 

主機(jī)除了讀取設(shè)備描述符和配置描述符外,還要讀取接口描述符和端口描述符。在這里主機(jī)使用再次讀取配置的方法來(lái)讀取配置描述符、接口描述符和端點(diǎn)描述符的集合。 

(7) 設(shè)置配置 

主機(jī)讀取完描述符后,就需要對(duì)設(shè)備進(jìn)行配置,使得設(shè)備從地址狀態(tài)進(jìn)入配置狀態(tài)。 

(8) 讀取配置狀態(tài) 

主機(jī)設(shè)置完配置以后,設(shè)備即可使用。主機(jī)有時(shí)會(huì)對(duì)設(shè)備的配置狀態(tài)進(jìn)行讀取。 

(9) 讀取接口狀態(tài) 

在配置完成后,主機(jī)會(huì)對(duì)接口的狀態(tài)進(jìn)行讀取,這和讀取配置一樣也是可選的。 
一個(gè)網(wǎng)友的例程:
本系統(tǒng)中所謂USB設(shè)備即是指溫度測(cè)量和控制的設(shè)備,設(shè)備采用USB總線供電,采用D12芯片內(nèi)置的SoftConnect技術(shù)與USB總線連接。所謂SoftConnect意思是在程序中通過(guò)向D12發(fā)送命令實(shí)現(xiàn)USB設(shè)備的連接或者斷開連接,這里的連接并不是指USB電纜的插上或拔出,相反USB連接可以重新初始化而不需要拔出電纜。

主機(jī)是通過(guò)檢測(cè)Vcc上拉電阻的變化來(lái)確定是否有設(shè)備連接的。在D12內(nèi)部集成了1.5kΩ的上拉電阻,默認(rèn)狀態(tài)下不與Vcc相連,程序運(yùn)行時(shí)可以向D12發(fā)送連接命令使1.5kΩ電阻連接到Vcc,這樣主機(jī)便檢測(cè)到有設(shè)備連接。

它的枚舉過(guò)程分析如下。

設(shè)備連接到總線后,設(shè)備從總線獲得5V電源,程序首先初始化,端口,然后向D12發(fā)出USB連接命令。主機(jī)檢測(cè)到設(shè)備連接。主機(jī)向設(shè)備發(fā)出第一個(gè)信號(hào):總線復(fù)位??偩€復(fù)位產(chǎn)生一個(gè)中斷,并且D12器件在默認(rèn)地址0處使能,以便在接下來(lái)的枚舉過(guò)程中使用地址0傳輸命令和數(shù)據(jù),同時(shí)中斷寄存器的總線復(fù)位位被置為1。在程序中的表現(xiàn)是,D12向主循環(huán)請(qǐng)求中斷,進(jìn)入中斷處理程序USB_int_handler(),讀取中斷寄存器,確定中斷的類型,進(jìn)行相應(yīng)的處理。

主機(jī)使用默認(rèn)地址0讀取設(shè)備描述符。

具體過(guò)程是:主機(jī)向D12發(fā)送第一個(gè)Setup包,每個(gè)Setup包都是8個(gè)字節(jié),第一個(gè)包Get Descriptor的內(nèi)容為:80 06 00 01 00 00 40 00 ,數(shù)據(jù)為16進(jìn)制表示。其中的40表示返回的數(shù)據(jù)最大長(zhǎng)度為40H字節(jié)。此Setup包存儲(chǔ)在D12的端點(diǎn)0緩沖區(qū)中,并產(chǎn)生一個(gè)外部中斷。(這時(shí)在D12的中斷寄存器中保存了中斷的類型:端點(diǎn)0的OUT中斷,即中斷寄存器字節(jié)1的值應(yīng)為0x01)進(jìn)入中斷服務(wù)程序后,由于D12端點(diǎn)0的緩沖區(qū)只有16個(gè)字節(jié),所以單片機(jī)就先發(fā)送16個(gè)字節(jié)的設(shè)備描述符。

當(dāng)主機(jī)接收到這16個(gè)字節(jié)的字符后,就認(rèn)為真正有設(shè)備連接了。

地址分配。

主機(jī)向D12發(fā)送第二個(gè)Setup包,這是一個(gè)含有指定地址的數(shù)據(jù)包,其內(nèi)容一般為:00 05 02 00 00 00 00 00 ,其中的02就表示主機(jī)為設(shè)備分配的地址為0x02,在以后的通信里設(shè)備就只對(duì)0x02地址的信息作出應(yīng)答。D12收到這個(gè)Setup包后同樣產(chǎn)生一個(gè)中斷(端點(diǎn)0的OUT中斷),需要注意的是單片機(jī)處理這個(gè)中斷時(shí)需要向主機(jī)返回一個(gè)長(zhǎng)度為0的空數(shù)據(jù)包。

主機(jī)從新的地址獲取設(shè)備描述符。

主機(jī)收到設(shè)備發(fā)來(lái)的空的應(yīng)答數(shù)據(jù)包后,確認(rèn)地址分配成功。然后主機(jī)向D12發(fā)送第三個(gè)Setup包,再次要求獲取設(shè)備描述符。這個(gè)Setup包的內(nèi)容一般是:80 06 00 01 00 00 12 00 。與上次不同的是,這次要求實(shí)際的描述符長(zhǎng)度,其中的12(十六進(jìn)制數(shù))表示要求得到全部18字節(jié)的設(shè)備描述符。因?yàn)槊看沃荒馨l(fā)送16字節(jié),因此程序中要分兩次完成此要求。第一次16字節(jié),第二次2字節(jié)。

主機(jī)讀取配置描述符。

成功得到18字節(jié)的設(shè)備描述符后,主機(jī)向D12發(fā)送第四個(gè)Setup包,要求得到設(shè)備的配置描述符。這個(gè)Setup包的數(shù)據(jù)為:80 06 00 02 00 00 09 00 。其中的09指定設(shè)備返回9字節(jié)數(shù)據(jù),這正是配置描述符的長(zhǎng)度。

讀取描述符集合。

成功得到9字節(jié)的配置描述符后,主機(jī)向D12發(fā)送第五個(gè)Setup包,要求得到設(shè)備的配置描述符、接口描述符、端點(diǎn)描述符的集合。這次Setup包的內(nèi)容是:80 06 00 02 00 00 FF 00 。由于不知道描述符集合的真實(shí)長(zhǎng)度,因此它要求得到256字節(jié)。

到這一步,主機(jī)現(xiàn)在應(yīng)該已經(jīng)發(fā)現(xiàn)新硬件并為新設(shè)備安裝好驅(qū)動(dòng)程序。對(duì)于以上過(guò)程,主機(jī)是在總線驅(qū)動(dòng)層處理,下面的一步,也是典型枚舉過(guò)程的最后一步,就需要設(shè)備驅(qū)動(dòng)程序來(lái)做了。

數(shù)值配置。主機(jī)得到各種描述符之后,認(rèn)為設(shè)備的信息已經(jīng)齊全,便對(duì)設(shè)備進(jìn)行配置,使設(shè)備從地址狀態(tài)進(jìn)入配置狀態(tài)。

主機(jī)向D12發(fā)送第六個(gè)Setup包,其數(shù)據(jù)為:00 09 01 00 00 00 00 00 。程序中需要調(diào)用Set Configuration()函數(shù)處理此事件,允許所有端點(diǎn)進(jìn)入工作狀態(tài)。

至此,USB枚舉過(guò)程結(jié)束,設(shè)備可以正常使用了。在這個(gè)過(guò)程中D12指示燈根據(jù)通信的狀況間歇閃爍。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多