USB系列之第四章:端點(diǎn)類型
通用串行總線規(guī)范定義了四種傳輸/端點(diǎn)類型,
控制權(quán)轉(zhuǎn)讓
中斷傳輸
同步傳輸
批量傳輸
控制傳輸通常用于命令和狀態(tài)操作。它們對(duì)于設(shè)置一個(gè)使用控制傳輸執(zhí)行所有枚舉功能的USB設(shè)備來說是必不可少的。它們通常是突發(fā)性的隨機(jī)數(shù)據(jù)包,由主機(jī)發(fā)起并盡最大努力傳遞。低速設(shè)備中控制傳輸?shù)臄?shù)據(jù)包長(zhǎng)度必須為8字節(jié),高速設(shè)備允許的數(shù)據(jù)包大小為8、16、32或64字節(jié),全速設(shè)備的數(shù)據(jù)包大小必須為64字節(jié)。一個(gè)控制傳輸可以有三個(gè)階段。
這個(gè)設(shè)置階段是發(fā)送請(qǐng)求的位置。這包括三個(gè)包。首先發(fā)送包含地址和終結(jié)點(diǎn)編號(hào)的設(shè)置令牌。接下來發(fā)送數(shù)據(jù)包,并且始終具有data0的PID類型,并包含安裝程序包詳細(xì)說明了請(qǐng)求的類型。稍后我們將詳細(xì)介紹設(shè)置包。最后一個(gè)數(shù)據(jù)包是用于確認(rèn)成功接收或指示錯(cuò)誤的握手。如果函數(shù)成功地接收到設(shè)置數(shù)據(jù)(CRC和PID等OK),它將以ACK響應(yīng),否則它將忽略數(shù)據(jù)并不發(fā)送握手?jǐn)?shù)據(jù)包。函數(shù)不能發(fā)出暫停或NAK數(shù)據(jù)包以響應(yīng)設(shè)置數(shù)據(jù)包。
可選的數(shù)據(jù)階段由一個(gè)或多個(gè)輸入或輸出傳輸組成。設(shè)置請(qǐng)求指示此階段要傳輸?shù)臄?shù)據(jù)量。如果超過最大數(shù)據(jù)包大小,數(shù)據(jù)將以多個(gè)傳輸方式發(fā)送,每個(gè)傳輸都是除最后一個(gè)數(shù)據(jù)包之外的最大數(shù)據(jù)包長(zhǎng)度。根據(jù)數(shù)據(jù)傳輸?shù)姆较颍瑪?shù)據(jù)階段有兩種不同的場(chǎng)景。在:當(dāng)主機(jī)準(zhǔn)備好接收控制數(shù)據(jù)時(shí),它會(huì)發(fā)出一個(gè)IN令牌。如果函數(shù)接收到帶錯(cuò)誤的IN令牌,例如PID與反向的PID位不匹配,那么它將忽略數(shù)據(jù)包。如果令牌被正確地接收到,設(shè)備可以用包含要發(fā)送的控制數(shù)據(jù)的數(shù)據(jù)包、指示端點(diǎn)發(fā)生錯(cuò)誤的暫停包或向主機(jī)指示端點(diǎn)正在工作但暫時(shí)沒有要發(fā)送的數(shù)據(jù)的NAK包進(jìn)行應(yīng)答。輸出:當(dāng)主機(jī)需要向設(shè)備發(fā)送一個(gè)控制數(shù)據(jù)包時(shí),它發(fā)出一個(gè)OUT令牌,后跟一個(gè)包含控制數(shù)據(jù)作為有效載荷的數(shù)據(jù)包。如果OUT令牌或數(shù)據(jù)包的任何部分損壞,則函數(shù)將忽略該包。如果函數(shù)的端點(diǎn)緩沖區(qū)為空,并且它已將數(shù)據(jù)記錄到端點(diǎn)緩沖區(qū)中,它將發(fā)出一個(gè)ACK,通知主機(jī)它已成功接收到數(shù)據(jù)。如果端點(diǎn)緩沖區(qū)由于前一個(gè)包的處理而不是空的,那么函數(shù)將返回一個(gè)NAK。但是,如果端點(diǎn)出現(xiàn)錯(cuò)誤,并且其停止位已設(shè)置,則返回暫停。
狀態(tài)階段報(bào)告整個(gè)請(qǐng)求的狀態(tài),此狀態(tài)再次因傳輸方向而變化。狀態(tài)報(bào)告始終由函數(shù)執(zhí)行。
在:如果主機(jī)在數(shù)據(jù)階段發(fā)送令牌以接收數(shù)據(jù),則主機(jī)必須確認(rèn)成功接收此數(shù)據(jù)。這是通過主機(jī)發(fā)送一個(gè)輸出令牌和一個(gè)零長(zhǎng)度的數(shù)據(jù)包來完成的。該函數(shù)現(xiàn)在可以在握手階段報(bào)告其狀態(tài)。ACK表示函數(shù)已完成命令現(xiàn)在可以接受另一個(gè)命令。如果在處理此命令期間發(fā)生錯(cuò)誤,則函數(shù)將發(fā)出暫停。但是,如果函數(shù)仍在處理中,它將返回NAK,指示主機(jī)稍后重復(fù)狀態(tài)階段。
輸出:如果主機(jī)在數(shù)據(jù)階段發(fā)送令牌來傳輸數(shù)據(jù),則該函數(shù)將響應(yīng)于in令牌發(fā)送一個(gè)零長(zhǎng)度包來確認(rèn)數(shù)據(jù)的成功接收。但是,如果發(fā)生錯(cuò)誤,它應(yīng)該發(fā)出暫停,或者如果它仍然忙于處理數(shù)據(jù),它應(yīng)該發(fā)出NAK,要求主機(jī)稍后重試狀態(tài)階段。
現(xiàn)在這些是怎么組合起來的呢?例如,主機(jī)希望在枚舉期間請(qǐng)求設(shè)備描述符。發(fā)送的數(shù)據(jù)包如下所示。主機(jī)將發(fā)送設(shè)置令牌,告訴函數(shù)以下數(shù)據(jù)包是設(shè)置數(shù)據(jù)包。地址字段將保存主機(jī)請(qǐng)求描述符的設(shè)備的地址。端點(diǎn)編號(hào)應(yīng)為零,指定默認(rèn)管道。然后主機(jī)將發(fā)送一個(gè)DATA0包。這將有一個(gè)8字節(jié)的有效負(fù)載設(shè)備描述符請(qǐng)求如USB規(guī)范第9章所述。USB功能然后確認(rèn)安裝包已正確讀取,沒有錯(cuò)誤。如果收到的數(shù)據(jù)包已損壞,設(shè)備將忽略此數(shù)據(jù)包。主機(jī)將在短時(shí)間延遲后重新發(fā)送數(shù)據(jù)包。1安裝令牌同步PID地址終點(diǎn)CRC5EOP公司地址和終結(jié)點(diǎn)編號(hào)2數(shù)據(jù)0包同步PID數(shù)據(jù)0CRC16型EOP公司設(shè)備描述符請(qǐng)求三。 Ack握手同步PIDEOP公司設(shè)備確認(rèn)。安裝程序包以上三個(gè)數(shù)據(jù)包代表第一個(gè)USB事務(wù)。USB設(shè)備現(xiàn)在將解碼接收到的8個(gè)字節(jié),并確定它是否是設(shè)備描述符請(qǐng)求。然后,設(shè)備將嘗試發(fā)送裝置描述元,這將是下一個(gè)USB事務(wù)。1象征性地同步PID地址終點(diǎn)CRC5EOP公司地址和終結(jié)點(diǎn)編號(hào)2數(shù)據(jù)1包同步PID數(shù)據(jù)1CRC16型EOP公司設(shè)備描述符的前8個(gè)字節(jié)三。 Ack握手同步PIDEOP公司主機(jī)確認(rèn)數(shù)據(jù)包1象征性地同步PID地址終點(diǎn)CRC5EOP公司地址和終結(jié)點(diǎn)編號(hào)2數(shù)據(jù)0包同步PID數(shù)據(jù)0CRC16型EOP公司最后4個(gè)字節(jié)填充三。 Ack握手同步PIDEOP公司主機(jī)確認(rèn)數(shù)據(jù)包在本例中,我們假設(shè)最大有效負(fù)載大小為8字節(jié)。主機(jī)現(xiàn)在可以向主機(jī)發(fā)送此令牌的數(shù)據(jù)。由于最大數(shù)據(jù)包大小為8字節(jié),因此必須將12字節(jié)的設(shè)備描述符拆分成塊來發(fā)送。除最后一個(gè)事務(wù)外,每個(gè)塊必須是8字節(jié)。主機(jī)確認(rèn)我們發(fā)送的每個(gè)數(shù)據(jù)包。一旦發(fā)送了設(shè)備描述符,狀態(tài)事務(wù)就會(huì)隨之發(fā)生。如果事務(wù)成功,主機(jī)將發(fā)送一個(gè)零長(zhǎng)度的數(shù)據(jù)包,指示整個(gè)事務(wù)成功。然后,函數(shù)對(duì)這個(gè)零長(zhǎng)度數(shù)據(jù)包進(jìn)行響應(yīng),指示其狀態(tài)。1輸出令牌同步PID地址終點(diǎn)CRC5EOP公司地址和終結(jié)點(diǎn)編號(hào)2數(shù)據(jù)1包同步PID數(shù)據(jù)1CRC16型EOP公司零長(zhǎng)度數(shù)據(jù)包三。 Ack握手同步PIDEOP公司設(shè)備確認(rèn)。整個(gè)交易
任何有過微控制器中斷請(qǐng)求經(jīng)驗(yàn)的人都知道中斷是設(shè)備產(chǎn)生的。但是在USB下,如果一個(gè)設(shè)備需要主機(jī)的注意,它必須等到主機(jī)輪詢它之后才能報(bào)告它需要緊急關(guān)注!
中斷傳輸
保證延遲
流管-單向
錯(cuò)誤檢測(cè)和下一周期重試。
中斷傳輸通常是非周期性的、小設(shè)備“啟動(dòng)”的通信,需要有限的延遲。中斷請(qǐng)求由設(shè)備排隊(duì),直到主機(jī)輪詢USB設(shè)備請(qǐng)求數(shù)據(jù)。
低速設(shè)備的最大數(shù)據(jù)負(fù)載大小為8字節(jié)。
全速設(shè)備的最大數(shù)據(jù)負(fù)載大小為64字節(jié)。
高速設(shè)備的最大數(shù)據(jù)負(fù)載大小為1024字節(jié)。
上圖顯示了中斷輸入和中斷輸出事務(wù)的格式。
在:主機(jī)將定期輪詢中斷端點(diǎn)。此輪詢速率在中指定端點(diǎn)描述符稍后會(huì)介紹。每次投****都需要主機(jī)發(fā)送一個(gè)IN令牌。如果IN令牌已損壞,則函數(shù)將忽略數(shù)據(jù)包并繼續(xù)監(jiān)視總線以查找新令牌。如果某個(gè)中斷已被設(shè)備排隊(duì),則函數(shù)將在接收到IN令牌時(shí)發(fā)送一個(gè)包含與中斷相關(guān)的數(shù)據(jù)的數(shù)據(jù)包。在主機(jī)上成功接收后,主機(jī)將返回ACK。但是,如果數(shù)據(jù)損壞,主機(jī)將不返回任何狀態(tài)。另一方面,如果主機(jī)用IN令牌輪詢中斷端點(diǎn)時(shí)不存在中斷條件,則函數(shù)通過發(fā)送NAK來通知此狀態(tài)。如果此終結(jié)點(diǎn)上發(fā)生錯(cuò)誤,則將發(fā)送一個(gè)暫停以答復(fù)in令牌。
輸出:當(dāng)主機(jī)想要發(fā)送設(shè)備中斷數(shù)據(jù)時(shí),它發(fā)出一個(gè)OUT令牌,后跟一個(gè)包含中斷數(shù)據(jù)的數(shù)據(jù)包。如果OUT令牌或數(shù)據(jù)包的任何部分損壞,則函數(shù)將忽略該包。如果函數(shù)的端點(diǎn)緩沖區(qū)為空,并且它已將數(shù)據(jù)記錄到端點(diǎn)緩沖區(qū)中,它將發(fā)出一個(gè)ACK,通知主機(jī)它已成功接收到數(shù)據(jù)。如果端點(diǎn)緩沖區(qū)由于前一個(gè)包的處理而不是空的,那么函數(shù)將返回一個(gè)NAK。但是,如果端點(diǎn)因此發(fā)生錯(cuò)誤,并且其停止位已設(shè)置,則返回暫停。
等時(shí)轉(zhuǎn)移是連續(xù)和周期性的。它們通常包含對(duì)時(shí)間敏感的信息,例如音頻或視頻流。如果音頻流中的數(shù)據(jù)存在延遲或重試,則可能會(huì)出現(xiàn)一些包含故障的不穩(wěn)定音頻。節(jié)拍可能不再同步。然而,如果一個(gè)包或幀時(shí)不時(shí)地被丟棄,它就不太可能被偵聽器注意到。
同步傳輸提供
保證訪問USB帶寬
有限延遲
流管-單向
通過CRC進(jìn)行錯(cuò)誤檢測(cè),但不進(jìn)行重試或保證傳輸。
僅限全速和高速模式
沒有數(shù)據(jù)切換
中指定了最大大小的數(shù)據(jù)負(fù)載端點(diǎn)描述符等時(shí)端點(diǎn)。對(duì)于全速設(shè)備,最大可達(dá)1023字節(jié),對(duì)于高速設(shè)備,最大可達(dá)1024字節(jié)。由于最大數(shù)據(jù)有效負(fù)載大小將影響總線的帶寬要求,因此最好指定一個(gè)保守的有效負(fù)載大小。如果您使用的是大型有效負(fù)載,那么指定一系列 替代接口具有不同的等時(shí)有效載荷大小。如果在枚舉過程中,由于帶寬限制,主機(jī)無法啟用首選的同步終結(jié)點(diǎn),則它需要依靠某些東西,而不僅僅是完全失敗。在等時(shí)端點(diǎn)上發(fā)送的數(shù)據(jù)可能小于預(yù)先協(xié)商的大小,并且可能在每個(gè)事務(wù)的長(zhǎng)度上有所不同。上圖顯示了一個(gè)同步進(jìn)出事務(wù)的格式。等時(shí)事務(wù)沒有握手階段,無法報(bào)告錯(cuò)誤或暫停/暫停條件。
批量傳輸可用于大批量突發(fā)數(shù)據(jù)。此類示例可以包括發(fā)送到打印機(jī)的打印作業(yè)或從掃描儀生成的圖像。批量傳輸在數(shù)據(jù)有效載荷上以CRC16字段的形式提供糾錯(cuò)功能,并提供錯(cuò)誤檢測(cè)/重新傳輸機(jī)制,以確保無誤地傳輸和接收數(shù)據(jù)。批量傳輸將在所有其他事務(wù)被分配后使用總線上未分配的空閑帶寬。如果總線忙著同步和/或中斷,那么大量數(shù)據(jù)可能會(huì)慢慢地通過總線。因此,批量傳輸只能用于不受時(shí)間影響的通信,因?yàn)椴荒鼙WC延遲。
批量傳輸
用于傳輸大量突發(fā)數(shù)據(jù)。
通過CRC進(jìn)行錯(cuò)誤檢測(cè),保證交貨。
不能保證帶寬或最小延遲。
流管-單向
僅限全速和高速模式
批量傳輸僅由全速和高速設(shè)備支持。對(duì)于全速端點(diǎn),最大批量數(shù)據(jù)包大小為8、16、32或64字節(jié)長(zhǎng)。對(duì)于高速端點(diǎn),最大數(shù)據(jù)包大小可以達(dá)到512字節(jié)長(zhǎng)。如果數(shù)據(jù)負(fù)載低于最大數(shù)據(jù)包大小,則不需要用零填充。當(dāng)批量傳輸傳輸了所請(qǐng)求的確切數(shù)據(jù)量、傳輸了小于最大端點(diǎn)大小的數(shù)據(jù)包或傳輸了零長(zhǎng)度的數(shù)據(jù)包時(shí),就認(rèn)為完成了批量傳輸。上圖顯示了批量輸入和輸出事務(wù)的格式。
在:當(dāng)主機(jī)準(zhǔn)備好接收大容量數(shù)據(jù)時(shí),它會(huì)發(fā)出一個(gè)IN令牌。如果函數(shù)接收到帶錯(cuò)誤的IN令牌,則忽略該包。如果令牌被正確地接收到,函數(shù)可以用包含要發(fā)送的大容量數(shù)據(jù)的數(shù)據(jù)包進(jìn)行應(yīng)答,或者用一個(gè)指示端點(diǎn)發(fā)生錯(cuò)誤的暫停包或一個(gè)NAK包來向主機(jī)指示該端點(diǎn)正在工作,但臨時(shí)沒有要發(fā)送的數(shù)據(jù)。
輸出:當(dāng)主機(jī)想向函數(shù)發(fā)送一個(gè)大容量數(shù)據(jù)包時(shí),它會(huì)發(fā)出一個(gè)OUT令牌,后跟一個(gè)包含該大容量數(shù)據(jù)的數(shù)據(jù)包。如果OUT令牌或數(shù)據(jù)包的任何部分損壞,則函數(shù)將忽略該包。如果函數(shù)的端點(diǎn)緩沖區(qū)為空,并且它已將數(shù)據(jù)記錄到端點(diǎn)緩沖區(qū)中,它將發(fā)出一個(gè)ACK,通知主機(jī)它已成功接收到數(shù)據(jù)。如果端點(diǎn)緩沖區(qū)由于處理前一個(gè)數(shù)據(jù)包而不是空的,那么函數(shù)將返回一個(gè)NAK。但是,如果它的端點(diǎn)設(shè)置為暫停,則返回一個(gè)位。
主機(jī)負(fù)責(zé)管理總線的帶寬。在配置同步和中斷端點(diǎn)時(shí)以及在總線的整個(gè)運(yùn)行過程中,這是在枚舉時(shí)完成的。規(guī)范對(duì)總線進(jìn)行了限制,允許在全速總線上為周期性傳輸(中斷和等時(shí))分配不超過90%的任何幀。在高速總線上,這一限制被降低到不超過80%的微幀可用于周期性傳輸。因此,您可以很快看到,如果您有一個(gè)高度飽和的總線周期性傳輸,剩下的10%用于控制傳輸,一旦這些被分配,批量傳輸將獲得剩余的部分。
*博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。