什么是uart
通用異步收發(fā)傳輸器(Universal Asynchronous Receiver/Transmitter),通常稱作UART,是一種異步收發(fā)傳輸器,是電腦硬件的一部分。它將要傳輸?shù)?a href="http://www.wenjunhu.com/soft/special/" target="_blank">資料在串行通信與并行通信之間加以轉(zhuǎn)換。作為把并行輸入信號(hào)轉(zhuǎn)成串行輸出信號(hào)的芯片,UART通常被集成于其他通訊接口的連結(jié)上。
具體實(shí)物表現(xiàn)為獨(dú)立的模塊化芯片,或作為集成于微處理器中的周邊設(shè)備。一般是RS-232C規(guī)格的,與類似Maxim的MAX232之類的標(biāo)準(zhǔn)信號(hào)幅度變換芯片進(jìn)行搭配,作為連接外部設(shè)備的接口。在UART上追加同步方式的序列信號(hào)變換電路的產(chǎn)品,被稱為USART(Universal Synchronous Asynchronous Receiver Transmitter)。
UART是一種通用串行數(shù)據(jù)總線,用于異步通信。該總線雙向通信,可以實(shí)現(xiàn)全雙工傳輸和接收。在嵌入式設(shè)計(jì)中,UART用于主機(jī)與輔助設(shè)備通信,如汽車音響與外接AP之間的通信,與PC機(jī)通信包括與監(jiān)控調(diào)試器和其它器件,如EEPROM通信。
什么是usb
USB,是英文Universal Serial Bus(通用串行總線)的縮寫(xiě),是一個(gè)外部總線標(biāo)準(zhǔn),用于規(guī)范電腦與外部設(shè)備的連接和通訊。是應(yīng)用在PC領(lǐng)域的接口技術(shù)。USB接口支持設(shè)備的即插即用和熱插拔功能。USB是在1994年底由英特爾、康柏、IBM、Microsoft等多家公司聯(lián)合提出的。
下一代USB接口將會(huì)有改動(dòng)方向,下一代的Type-C USB接口,可支持正反兩面插,并且傳輸數(shù)據(jù)信號(hào)強(qiáng),但目前(2014年)生產(chǎn)商有限。
理論上USB接口可用于連接多達(dá)127個(gè)外設(shè),如鼠標(biāo)、調(diào)制解調(diào)器和鍵盤等。USB自從1996年推出后,已成功替代串口和并口,并成為二十一世紀(jì)個(gè)人電腦和大量智能設(shè)備的必配的接口之一。
usb作為一種串行接口,應(yīng)用日益廣泛。如同每個(gè)工程設(shè)計(jì)人員必須掌握I2C,RS232這些接口一樣,我們也必須掌握usb.
但是usb的接口協(xié)議實(shí)在有點(diǎn)費(fèi)解,linux uhci驅(qū)動(dòng)作者之一Alan Stern曾經(jīng)就說(shuō)過(guò)“The USB documentation is downright evil. Most of it is just crap, written by a committee. You‘re better off ignoring most of it ”。
本文將從整體上介紹usb協(xié)議,包括usb host ,usb hub,usb function。希望能給讀者一個(gè)總體上的了解。也因此,文章將分成相應(yīng)的三部分講解 。
一、usb function
1。初識(shí)usb.usb是一種串行接口協(xié)議,它靠d+,d-兩條數(shù)據(jù)線構(gòu)成的差分線來(lái)進(jìn)行數(shù)據(jù)傳輸,這讓我們非常感興趣它到底和我們通常熟悉兩線 rs232/485有何區(qū)別。了解這種區(qū)別有助于我們對(duì)usb作一個(gè)深入的了解。那么讓我們回想一下到底一個(gè)兩線rs232的數(shù)據(jù)是如何傳送的,
在這里我們的重點(diǎn)在于,我們發(fā)現(xiàn)要在串行口傳送數(shù)據(jù)一個(gè)最體碼的要求恐怕就是:要知道數(shù)據(jù)傳輸何時(shí)開(kāi)始,何時(shí)結(jié)束。即如何delimit.那么 rs232怎么做的。顯然,在idle(空閑)時(shí),即無(wú)數(shù)據(jù)傳送時(shí),數(shù)據(jù)線處于高電平,等到有數(shù)據(jù)開(kāi)始傳送,發(fā)送方首先拉低數(shù)據(jù)線(start),表示數(shù) 據(jù)傳輸開(kāi)始,接受端也因?yàn)檫@個(gè)“start”信號(hào)開(kāi)始準(zhǔn)備接受即將到來(lái)的數(shù)據(jù),類似一次握手,隨后,在兩者之間的數(shù)據(jù)傳送開(kāi)始,結(jié)束后主方再次拉高數(shù)據(jù) 線,表示結(jié)束傳輸,自此兩者重新進(jìn)入Idle狀態(tài)。等待下一輪傳送開(kāi)始。
了解了rs232,那么我們自然想到usb如何做到這個(gè)呢,既然是串行位流傳輸,也理所當(dāng)然的解決這個(gè)問(wèn)題。沒(méi)錯(cuò),Usb協(xié)議必然要解決這個(gè)問(wèn)題,讓我們作一個(gè)類似rs232的比較吧!類似于rs232,usb的傳輸楨如圖二:
?。ㄟ@里我們暫時(shí)忽略這個(gè)傳輸所代表的意義)為了說(shuō)明問(wèn)題,我們對(duì)一些問(wèn)題簡(jiǎn)化,我們定義這樣幾個(gè)狀態(tài):
假設(shè)D+,D-分別表示usb信號(hào)線的電平信號(hào)。那么對(duì)于usb full speed function(high speed ,low speed是不同的),我們定義差分?jǐn)?shù)據(jù)線上可能出現(xiàn)的四個(gè)狀態(tài):
Data J state:D+=1,D-=0;
Data K state:D+=0,D-=1;
SE0:D+=D-=0;
SE1:D+=D-=1
這個(gè)對(duì)usb full speed function來(lái)說(shuō),idle狀態(tài)將處于Data J state,se0表示一楨結(jié)束。看這個(gè)圖是不是很像我們熟悉的rs232。沒(méi)錯(cuò)?。。∷麄兇_實(shí)很相似。在無(wú)數(shù)據(jù)傳輸時(shí),它們都處于Idle狀態(tài),當(dāng)要開(kāi) 始傳輸數(shù)據(jù)時(shí),先發(fā)一個(gè)sync(同步信號(hào),rs232為start,usb為一sync字節(jié),見(jiàn)協(xié)議說(shuō)明)信號(hào)進(jìn)行“握手”,而后開(kāi)始傳輸,當(dāng)傳輸要結(jié) 束時(shí),發(fā)一stop信號(hào)(usb為一個(gè)se0狀態(tài)表示要結(jié)束傳輸),最后又進(jìn)入idle態(tài)等待新的傳輸。不過(guò),你可能更加注意到,他們還是不同的。不同在 于usb是按“packet” 進(jìn)行傳輸?shù)?,就是說(shuō)它傳輸?shù)淖钚挝皇莗acket,而rs232是按字節(jié)傳送的,也即它的最小傳送單位是字節(jié)。既然是按pakcet傳送,想想我們相較 于rs232的按字節(jié)單位傳輸,我們可以得到哪些“好處”。想想看,pakcet的好處不就在于我們可以靈活的定義數(shù)據(jù)的傳送格式,傳送方式,從而可以適 應(yīng)各種各樣的串行設(shè)備,這不就是所謂的“通用串行總線”嗎?
簡(jiǎn)介:從本節(jié)開(kāi)始,我們將介紹usb的傳輸機(jī)制。這節(jié)先介紹usb現(xiàn)有傳輸方式的背景知識(shí),做為對(duì)下節(jié)將要展開(kāi)的四種傳輸類型,描述符,等相關(guān)知識(shí)的一個(gè)導(dǎo)引。
2。usb傳輸。
我們?cè)谏弦还?jié)中了解到了usb的“packet”的感念,了解到了usb傳送一個(gè)packet總是以sync開(kāi)始,以 eop結(jié)束,這個(gè)稱為delimiter,即標(biāo)記packet的始末。有了packet,我們就可以在usb總線上傳輸數(shù)據(jù)了。但是這還不夠,比如數(shù)據(jù)傳 送方向,即傳回usb主機(jī)還是傳下usb從機(jī),數(shù)據(jù)傳送的地址,數(shù)據(jù)傳送的類型(這些后面我們將會(huì)知道)這些信息在傳輸之前是必須搞清楚的,那么這個(gè)信息 如何得知呢,看來(lái)這就需要我們定一套基于packet的“協(xié)議”了。主機(jī)與從機(jī)在傳輸中均遵循這套“協(xié)議”,那么這些問(wèn)題就可以迎刃而解。事實(shí)上,usb 的一次數(shù)據(jù)傳輸總是遵循這樣的“協(xié)議”的:
首先,主機(jī)發(fā)第1個(gè)packet給從機(jī),聲明數(shù)據(jù)傳送方向,數(shù)據(jù)傳輸?shù)刂?,?shù)據(jù)傳輸類型。
其次,主機(jī)發(fā)第2個(gè)至第n個(gè)packet載有實(shí)際數(shù)據(jù)
最后,從機(jī)返回一個(gè)packet是一個(gè)ACK包,報(bào)告數(shù)據(jù)傳輸?shù)慕Y(jié)果,比如接受出錯(cuò)或成功等信息,這樣主機(jī)就可以借此了解到這次傳輸情況,從而有可能來(lái)作出相應(yīng)措施如決定是否重發(fā)。
這里我們考慮的是主機(jī)發(fā)數(shù)據(jù)給從機(jī)的情況,那么從機(jī)發(fā)數(shù)據(jù)給主機(jī)時(shí),是不是也可以這樣呢?當(dāng)然可以,比如從機(jī)要發(fā)數(shù)據(jù)給主機(jī)時(shí),也可以采取同主機(jī)類似的方式:
首先,從機(jī)發(fā)第1個(gè)packet給主機(jī),聲明數(shù)據(jù)傳送方向,數(shù)據(jù)傳輸?shù)刂?,?shù)據(jù)傳輸類型。
其次,從機(jī)發(fā)第2個(gè)至第n個(gè)packet載有實(shí)際數(shù)據(jù)
最后,主機(jī)返回一個(gè)packet是一個(gè)ACK包,報(bào)告數(shù)據(jù)傳輸?shù)慕Y(jié)果,比如接受出錯(cuò)或成功等信息,這樣從機(jī)就可以借此了解到這次傳輸情況,從而有可能來(lái)作出相應(yīng)措施如決定是否重發(fā)。
基本上可以歸結(jié)為一個(gè)“三段式”傳輸
這里有人可能注意到了,對(duì)這樣一個(gè)傳輸機(jī)制,從機(jī)和主機(jī)的功能將是一樣的,因?yàn)檫@樣的實(shí)現(xiàn)機(jī)制,從機(jī)可能在某一時(shí)刻是主機(jī),某一時(shí)刻又可能是從機(jī),因?yàn)樗麄円獙?shí)現(xiàn)同樣的功能。這樣實(shí)現(xiàn)起來(lái)的復(fù)雜性也將是一樣的。
注:這里概念或許容易混淆,其實(shí),我們這里的主機(jī)(master)和從機(jī)(slaver)是一個(gè)transceiver,即可收可發(fā)。相應(yīng)的,在某一時(shí)刻,master在發(fā)數(shù)據(jù),我們稱其為transmitter,在接受時(shí)我們稱為receiver.對(duì)slaver同樣。
我們可能還注意到了,usb這種按pakcet傳輸?shù)姆绞皆趯?shí)現(xiàn)時(shí)已經(jīng)很復(fù)雜了(至少比rs232要復(fù)雜多吧),至少我們目前看來(lái)主從機(jī)功能一樣這 樣的實(shí)現(xiàn)方式似乎還是可行,但是后面我們談到usb host時(shí)將會(huì)了解到host的功能是如何的復(fù)雜,以至于讓一個(gè)usb function 也帶上如此的功能成本和實(shí)現(xiàn)復(fù)雜性將陡然上升。作為面向廣范應(yīng)用的usb,這是我們不允許的。我們期望的是一個(gè)使用usb 的udisk,使用usb的光驅(qū),使用usb的耳麥等等這些東西不要因?yàn)閡sb而變得昂貴,復(fù)雜。
正是因?yàn)檫@個(gè)原因,usb從機(jī)的傳輸發(fā)式便由上面的方式改成了下面的方式進(jìn)行:
首先,主機(jī)發(fā)第1個(gè)packet給從機(jī),聲明數(shù)據(jù)傳送方向,數(shù)據(jù)傳輸?shù)刂?,?shù)據(jù)傳輸類型。
其次,從機(jī)收到主機(jī)送來(lái)的第一個(gè)packet后,再發(fā)第2個(gè)至第n個(gè)packet載有實(shí)際數(shù)據(jù)
最后,主機(jī)返回一個(gè)packet是一個(gè)ACK包,報(bào)告數(shù)據(jù)傳輸?shù)慕Y(jié)果,比如接受出錯(cuò)或成功等信息,這樣從機(jī)就可以借此了解到這次傳輸情況,從而有可能來(lái)作出相應(yīng)措施如決定是否重發(fā)。
而對(duì)于usb 主機(jī)傳輸方式保持不變。
對(duì)于這樣的改變,我們馬上就有疑問(wèn)了:這個(gè)改變的傳輸方式是和未改變之前的等價(jià)嗎。當(dāng)然,不全等價(jià)。問(wèn)題在哪里?仔細(xì)觀察一下便知,兩者區(qū) 別在于第一個(gè)packet是由誰(shuí)發(fā)起的。未改變之前,第一個(gè)packet總是由要傳送數(shù)據(jù)的一方發(fā)起,而改變之后的第一個(gè)Packet總是由主機(jī)發(fā)起。這 樣,就變成如果從機(jī)要發(fā)送數(shù)據(jù)給主機(jī)時(shí),總是由主機(jī)發(fā)起(第一個(gè)packet),然后從機(jī)開(kāi)始傳送。
可能初次接觸我們會(huì)感覺(jué)怪怪的,怎么從機(jī)要給主機(jī)發(fā)送數(shù)據(jù)前反而要主機(jī)先發(fā)packet給從機(jī)。 這樣行嗎,我們要說(shuō)這樣是可以的,因?yàn)橥ǔR淮蝹鬏斀换サ漠a(chǎn)生,并非無(wú)來(lái)由的產(chǎn)生,這些都是由程序員控制的,控制usb何時(shí)收,何時(shí)發(fā),及發(fā)給誰(shuí)?。?!
這里我們就注意到了,usb function(總是作為從機(jī))的功能一下從原來(lái)與主機(jī)具有相同功能的tranceiver變成了現(xiàn)在僅具發(fā)送(或接收)功能的transmitter(或Receiver)實(shí)現(xiàn)的復(fù)雜性及成本可想而知也就相應(yīng)得減小了。
簡(jiǎn)介:本節(jié)介紹usb full speed function的四種傳輸類型。
上節(jié)中我們了解到了usb host 與usb function 之間采用的是一種“非對(duì)稱”的傳輸,也就是說(shuō),無(wú)論usb接受數(shù)據(jù)還是發(fā)送數(shù)據(jù),都是由usb host首先發(fā)起。即傳輸?shù)牡谝粋€(gè)packet總是由usb host發(fā)出的。這個(gè)packet將聲明本次即將進(jìn)行的數(shù)據(jù)傳輸方向,數(shù)據(jù)傳輸?shù)刂泛蛿?shù)據(jù)傳輸類型。
Control Transfers)
?。?或許你已經(jīng)注意到了,一個(gè)usb host端口并不是僅僅支持一個(gè)Usb function
通過(guò)usb hub,一個(gè)usb host端口可以連接usb鼠標(biāo),usb鍵盤,Usb寫(xiě)字板。。.。。.。要連接這么多東西在同一個(gè)usb host上,我們通常會(huì)有一個(gè)基本問(wèn)題,即usb host如何識(shí)別這些被連接在它的端口上的設(shè)備呢。正如通常的主從式通訊系統(tǒng)一樣,如rs485多機(jī)通訊,我們通常是用一個(gè)特定的地址標(biāo)志每一個(gè)從設(shè)備。 對(duì)這里的usb,我們采用同樣的方法,將為每個(gè)掛接在該usb host上的usb function指定一個(gè)特定地址,通過(guò)這個(gè)特定地址來(lái)識(shí)別每個(gè)usb function.看來(lái)這將是一個(gè)usb function在數(shù)據(jù)傳輸之前必須解決的問(wèn)題--得到它的地址分配。
這個(gè)“地址指定”的過(guò)程需要usb host通知usb function才能完成,這個(gè)交互過(guò)程就是一個(gè)控制式傳輸。通過(guò)這個(gè)“控制式傳輸”,usb host將指定地址給usb function ,以為即將進(jìn)行的正式通訊做好準(zhǔn)備工作。這里細(xì)心的讀者可能已經(jīng)注意到了,既然usb host總要分配地址給usb function才能進(jìn)行正式的數(shù)據(jù)傳輸工作,那么usb host將如何與一個(gè)初始時(shí)未分配地址的usb function進(jìn)行交互來(lái)分配地址呢。這里,是這樣解決的:usb協(xié)議保留了一個(gè)“通用地址”0,usb host 通過(guò)這個(gè)地址0來(lái)和初始未分配地址的usb function進(jìn)行通訊,進(jìn)行一些初始的準(zhǔn)備工作,諸如這里的為它非配一個(gè)特定地址。后面我們就會(huì)了解到,usb除了配置地址外,還有一些其它參數(shù)需要 事先主從雙方達(dá)成共識(shí)。這些參數(shù)也都是通過(guò)控制式傳輸完成的。
一個(gè)Usb的控制式傳輸總是分為兩個(gè)或三個(gè)階段進(jìn)行傳輸:setup stage,data stage(視情況而定),status stage。
首先是setup stage,聯(lián)系上節(jié)所說(shuō)的Usb傳輸模式,usb Host總是先發(fā)起第一個(gè)packet--這里它
首先發(fā)起setup,
之后發(fā)起以data0為起始的setup data,
最后usb function回應(yīng)ack結(jié)束一次交互。
其次如果有data stage,類似的,還是按照上節(jié)說(shuō)的usb傳輸模式,
usb host總是先發(fā)起第一個(gè)Packet--Out(或in),
之后usb host(或usb function)發(fā)起以data1為起始的payload data,
最后Usb fuction(或usb host)回應(yīng)ack結(jié)束一次交互。
如果數(shù)據(jù)未傳完,繼續(xù)data stage,同上繼續(xù)。
最后是status stage,類似的,
usb host首先發(fā)起第一個(gè)Packet--in(或out),
之后usb function(或usb host)發(fā)起以data1為起始的Null data(0長(zhǎng)度),
最后Usb host(或usb function)回應(yīng)ack結(jié)束一次交互。
如此,整個(gè)控制式傳輸結(jié)束。 你或許有疑問(wèn),data stage為什么進(jìn)行了多次而非一次完成?實(shí)際上,usb總是將一批大量的數(shù)據(jù)分成了許多小段來(lái)進(jìn)行傳輸,稱為一個(gè)pay load。這樣傳輸?shù)哪康氖侨菀讓?duì)傳輸進(jìn)行控制。既然一次大量的數(shù)據(jù)總是被分成一段一段來(lái)分次傳輸,那么這里就出現(xiàn)了一個(gè)需要事先確定的參數(shù) (wMaxPacketSize):即每次這個(gè)小段有多大。這個(gè)參數(shù)如地址指派一樣,正式傳輸之前需要事先達(dá)成共識(shí)。通過(guò)控制式傳輸,現(xiàn)在我們已經(jīng)完成了 usb function的地址指定等參數(shù)的設(shè)置工作,下一步可以進(jìn)行正式的數(shù)據(jù)傳輸了。
bulk Transactions)
我們終于等到usb function 配置完成,現(xiàn)在我們的任務(wù)是要傳送一批數(shù)據(jù),這里可以使用批量數(shù)據(jù)傳輸(bulk Transactions)。?
首先,usb host發(fā)起第一個(gè)Packet--in(或out),表示要開(kāi)始數(shù)據(jù)傳輸了。
其次,usb function(或usb host)發(fā)起以data1(或data0)為起頭的payload data,開(kāi)始一次交互。
再其次,usb host(或Usb function)發(fā)起ack回應(yīng)這次交互。 如果數(shù)據(jù)還為傳完,繼續(xù)上述過(guò)程,即:
首先,usb host再次發(fā)起一個(gè)Packet--in(或out),表示又要開(kāi)始數(shù)據(jù)傳輸了。
其次,usb function(或usb host)發(fā)起以data0(或data1)為起頭的payload data,開(kāi)始又一次交互。
再次,usb host(或Usb function)發(fā)起ack回應(yīng)這次交互。
如此繼續(xù)直至傳輸完成。
這里的疑問(wèn)依然是為什么一次可能傳完的數(shù)據(jù)為什么分成多次進(jìn)行傳輸,原因在上次介紹控制式傳輸式已經(jīng)說(shuō)明。后面我們就會(huì)明白,為什么這樣可以方便控制傳輸過(guò)程。 仔細(xì)看看控制式的data stage采用的傳輸方式,是否就是批量傳輸方式呢?!注意,每次payload data的“牽頭人”(preamble)在輪番掉換,最先是data1,接著data0,再是data1,。。.。。.如此接替,只要有一次交互出現(xiàn)問(wèn)題,這個(gè)接替規(guī)則就會(huì)被打破進(jìn)而被Usb host識(shí)別而發(fā)現(xiàn)傳輸異常。所以這個(gè)交替的“牽頭人”規(guī)則是可靠數(shù)據(jù)傳輸?shù)乃扇〉拇胧┲弧?/p>
Isochronous Transactions)和中斷式傳輸(Interrupt Transactions)
在批量數(shù)據(jù)傳輸中,觸發(fā)一次批量數(shù)據(jù)傳輸總是“被動(dòng)”的,就是說(shuō)需要數(shù)據(jù)傳輸時(shí)Usb host并不會(huì)主動(dòng)發(fā)起傳輸,而是需要得到你的指令。當(dāng)你告訴它:“一切ok,讓我們開(kāi)始吧!” 這時(shí)它才開(kāi)始數(shù)據(jù)傳輸。這種方式顯然在某些情況下并不適合。比如音視頻流,你無(wú)法要求它聽(tīng)從你的“指揮”,讓它等你發(fā)指令給usb host,然后開(kāi)始一次傳輸。我們需要的是一種“及時(shí)”傳輸。一個(gè)好的方案就是設(shè)置一個(gè)timer,按照tick發(fā)起usb傳輸。這個(gè)tick通常以 1ms(usb full speed)為最小單位。這時(shí),可以設(shè)置為每次1ms tick出現(xiàn),usb host“自動(dòng)”發(fā)起一次數(shù)據(jù)傳輸。那么這種方案具體如何來(lái)實(shí)現(xiàn)呢?看來(lái)最基本的要素便是一個(gè)發(fā)出tick的timer,而這個(gè)“timer”需要usb host和usb function(事實(shí)上還要包括usb hub)雙方均能“看到”,從而協(xié)調(diào)工作,否則單方面的timer又有何意義?這個(gè)“timer”(或tick)在usb中使用一個(gè)特殊的packet實(shí) 現(xiàn),即是SOF。這個(gè)SOF由USB HOST 相當(dāng)精確的以每1.00 ms ±0.0005 ms的時(shí)間周期發(fā)送給usb device,來(lái)在二者之間定時(shí)。從而usb function能夠“及時(shí)”的了解到“現(xiàn)在時(shí)刻”。 現(xiàn)在我們?cè)趗sb host和usb function之間建立起了“對(duì)時(shí)”機(jī)制。那么接下來(lái)看看剛才設(shè)想的“自動(dòng)”傳輸如何實(shí)現(xiàn)。事實(shí)上,一旦usb host及usb function雙方建立了一種時(shí)間機(jī)制,那么這種“自動(dòng)”傳輸是很容易實(shí)現(xiàn)的。usb 實(shí)現(xiàn)同步式傳輸或中斷式傳輸總是以一種類似于批量數(shù)據(jù)傳輸?shù)姆绞竭M(jìn)行的,唯一不同的是傳輸?shù)挠|發(fā)不再是“被動(dòng)”的,而是由SOF所建立的tick觸發(fā)。
首先,時(shí)間到達(dá),usb host發(fā)起第一個(gè)Packet--in(或out),表示要開(kāi)始數(shù)據(jù)傳輸了。
其次,usb function(或usb host)發(fā)起以data1(或data0)為起頭的payload data,開(kāi)始一次交互。
再其次,如果是中斷式傳輸,usb host(或Usb function)發(fā)起ack回應(yīng)這次交互,如果是同步式傳輸,該步跳過(guò)。
如此重復(fù)上述步驟,即usb host等待下一個(gè)tick到達(dá),并開(kāi)始新一輪的交互。
這里我們注意到了,同步式傳輸和中斷式傳輸二者雖然都是時(shí)間觸發(fā),但是中斷式傳輸需要ack應(yīng)答,而相反,同步式傳輸不需要。這個(gè)最大的區(qū)別決定了 同步式傳輸是一種非可靠傳輸,但是因此換來(lái)了更多的usb傳輸時(shí)間。也因此,同步式傳輸?shù)?payload data(對(duì)應(yīng)wMaxPacketSize )通常相較于其他傳輸方式比較大,因?yàn)樗袅薬ck所占有數(shù)據(jù)傳輸時(shí)間。這里還有一個(gè)地方值得注意的是tick的設(shè)定,這個(gè)tick也是需要事先usb host 和usb function達(dá)成共識(shí)的參數(shù)之一。
評(píng)論
查看更多