|
以下是一個(gè)程序枚舉數(shù)據(jù)傳輸?shù)娜^(guò)程: (1) 當(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ī)使用默認(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) 分配好了設(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ī)讀取完設(shè)備描述符后就讀取設(shè)備的配置描述符 (6) 主機(jī)除了讀取設(shè)備描述符和配置描述符外,還要讀取接口描述符和端口描述符。在這里主機(jī)使用再次讀取配置的方法來(lái)讀取配置描述符、接口描述符和端點(diǎn)描述符的集合。 (7) 主機(jī)讀取完描述符后,就需要對(duì)設(shè)備進(jìn)行配置,使得設(shè)備從地址狀態(tài)進(jìn)入配置狀態(tài)。 (8) 主機(jī)設(shè)置完配置以后,設(shè)備即可使用。主機(jī)有時(shí)會(huì)對(duì)設(shè)備的配置狀態(tài)進(jìn)行讀取。 (9) 一個(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 當(dāng)主機(jī)接收到這16個(gè)字節(jié)的字符后,就認(rèn)為真正有設(shè)備連接了。 地址分配。 主機(jī)向D12發(fā)送第二個(gè)Setup包,這是一個(gè)含有指定地址的數(shù)據(jù)包,其內(nèi)容一般為:00 主機(jī)從新的地址獲取設(shè)備描述符。 主機(jī)收到設(shè)備發(fā)來(lái)的空的應(yīng)答數(shù)據(jù)包后,確認(rèn)地址分配成功。然后主機(jī)向D12發(fā)送第三個(gè)Setup包,再次要求獲取設(shè)備描述符。這個(gè)Setup包的內(nèi)容一般是:80 主機(jī)讀取配置描述符。 成功得到18字節(jié)的設(shè)備描述符后,主機(jī)向D12發(fā)送第四個(gè)Setup包,要求得到設(shè)備的配置描述符。這個(gè)Setup包的數(shù)據(jù)為:80 讀取描述符集合。 成功得到9字節(jié)的配置描述符后,主機(jī)向D12發(fā)送第五個(gè)Setup包,要求得到設(shè)備的配置描述符、接口描述符、端點(diǎn)描述符的集合。這次Setup包的內(nèi)容是:80 到這一步,主機(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 至此,USB枚舉過(guò)程結(jié)束,設(shè)備可以正常使用了。在這個(gè)過(guò)程中D12指示燈根據(jù)通信的狀況間歇閃爍。 |
|
|
來(lái)自: lchjczw > 《USB驅(qū)動(dòng)》