vjmroubuwfl6403788534.gif
8 ]( U h. ~! ^9 y/ O8 w& r
点击上方名片关注了解更多
* p- \5 c# w9 n& J! z0 x" m4 @) c$ c6 N
+ |) z2 n5 V+ N* w5 w
USB接口随处可见,手机、电脑、电视,以及各种电子产品充电口(虽然是USB-C,但它也是USB)都有USB的身影。( ^6 X2 {# Q: h( k6 M, f8 D
USB应用非常广泛,很多嵌入式设备也具有USB通信能力,这里给大家分享一下USB通信协议主要内容,新手都能看明白(当然,最好还是有一定通信协议基础才行)。
4 N+ V+ K7 S7 V1 w$ C
) o3 X* ]4 h2 S& j/ O1 O b 1、基本概念一个【传输】(控制、批量、中断、等时):由多个【事务】组成;一个【事务】(IN、OUT、SETUP):由一多个【Packet】组成。USB数据在【主机软件】与【USB设备特定的端点】间被传输。【主机软件】与【USB设备特定的端点】间的关联叫做【pipes】。一个USB设备可以有多个管道(pipes)。 2 、包(Packet)包(Packet)是USB系统中信息传输的基本单元,所有数据都是经过打包后在总线上传输的。数据在 USB总线上的传输以包为单位,包只能在帧内传输。高速USB 总线的帧周期为125us,全速以及低速 USB 总线的帧周期为 1ms。帧的起始由一个特定的包(SOF 包)表示,帧尾为 EOF。EOF不是一个包,而是一种电平状态,EOF期间不允许有数据传输。注意:虽然高速USB总线和全速/低速USB总线的帧周期不一样,但是SOF包中帧编号的增加速度是一样的,因为在高速USB系统中,SOF包中帧编号实际上取得是计数器的高11位,最低三位作为微帧编号没有使用,因此其帧编号的增加周期也为 1mSUSB总线上的情形是怎样的?
/ |, E# Z. y1 f: f2 w
2 W' i( F7 A1 @: l( z* J5 i
ocmdn5h1h3m6403788634.png
, d. E- F" M+ D% i包是USB总线上数据传输的最小单位,不能被打断或干扰,否则会引发错误。若干个数据包组成一次事务传输,一次事务传输也不能打断,属于一次事务传输的几个包必须连续,不能跨帧完成。一次传输由一次到多次事务传输构成,可以跨帧完成。
' }5 Q! w$ |. MUSB包由五部分组成,即同步字段(SYNC)、包标识符字段(PID)、数据字段、循环冗余校验字段(CRC)和包结尾字段(EOP),包的基本格式如下图:6 k, Y9 \* f+ E M. W+ G3 }
ouipyih2fij6403788734.png
$ ?. x O1 ?/ T3 `; f
1.1 PID类型(即包类型)! a9 a+ j( q3 D
kxvfugnbrlj6403788834.png
$ \4 Q+ S8 x2 A( D& e# i
6 ?; I$ |' k, x) g* H
adhv025n2zt6403788934.png
; |+ z( |! W" h+ y1.2 Token Packets
! e# E' a( v3 G+ J4 ~, W @2 T
5al5pyz33xl6403789034.png
0 n- M: {# c4 Y5 o3 j6 Y0 D0 ?
此格式适用于IN、OUT、SETUP、PING。
2 _( |3 J! N) _0 ~" \' G6 J7 HPID 数据传输方向IN Device->HostOUT Host->DeviceSETUP Host->DevicePING Device->Host1.3 Start-of-Frame(SOF) PacketsSOF包由Host发送给Device。对于full-speed总线,每隔1.00 ms ±0.0005 ms发送一次;
! m- H7 t5 A( x/ W. j对于high-speed总线,每隔125 μs ±0.0625 μs发送一次;' C7 A4 I) F( d4 S% K6 @( n q8 }
[/ol]SOF包构成如下图所示9 ]4 h# d, S D% S, R
vxpt153z1is6403789134.png
- }" p8 e) S& z/ A! N- f
- H* C! H8 k) ~# d* ~2 q+ L. J, v' c' h
oxeieh53ows6403789234.png
4 s3 ]/ ~& w! Y7 }& k" I) i1.4 Data Packets3 f. e X. _! V4 t) Y
0apyzzm3f0s6403789334.png
; j% }4 `( j$ E7 }有四种类类型的数据包:DATA0, DATA1, DATA2,and MDATA,且由PID来区分。DATA0和DATA1被定义为支持数据切换同步(data toggle synchronization)。
, x; g4 |: q4 R9 |$ K- Y1.5 Handshake Packets7 q5 ]& {! R) @$ }8 f
nckb4nx53zx6403789434.png
: H, b C5 T! KACK: 对于IN事务,它将由host发出;对于OUT、SETUP和PING事务,它将由device发出。
& U1 p* _4 r- J% q3 `NAK: 在数据阶段,对于IN事务,它将由device发出;在握手阶段,对于OUT和PING事务,它也将由device发出;host从不发送NAK包。 2、事务(Transaction)在USB上数据信息的一次接收或发送的处理过程称为事务处理(Transaction)即:The delivery of service to an endpoint。一个事务由一系统packet组成,具体由哪些packet组成,它取决于具体的事务。可能由如下包组成:一个token packet可选的data pcket可选的handshake packet可选的special packet2.1 输入(IN)事务处理输入事务处理:表示USB主机从总线上的某个USB设备接收一个数据包的过程。【正常】的输入事务处理; `7 g4 j7 U# Y" \7 w
! C" y* Q+ S% e% A0 H- x
ac3zwr50duq6403789535.png
3 ]5 ~0 K" ^* Z: }1 b& ?$ E【设备忙】时的输入事务处理
) o/ z. u, B6 I" V% T! \% k( l7 ?: i. M2 S# l$ b& _
qyz3wazk22p6403789635.png
( [6 B" L, S4 ~
【设备出错】时的输入事务处理
$ ~* P& X: g' h7 e4 ^
( h5 Y. A' O `; s! K
l011aypzz2u6403789735.png
: n- [: n) k' f$ `9 ]4 }2.2. 输出(OUT)事务处理输出事务处理:表示USB主机把一个数据包输出到总线上的某个USB设备接收的过程。【正常】的输出事务处理
/ @7 {( k2 k- \. T* K' L( a" W" j/ l" h* A8 e" d' u
0y0xf0gw5nv6403789835.png
& d! r) ]4 a1 [, k. ` |3 G3 o
【设备忙时】的输出事务处理
: I" Q! I6 K( F7 o1 n; S% j
" R9 z, n5 a0 t T% U* W
cypwogh2lrw6403789935.png
3 R/ m1 U9 v% g2 s- L【设备出错】的输出事务处理+ f! n: g- p' ]0 ?! i( B6 ^$ r- E
+ v) J/ r+ T. q0 ^
tsy0nikb3x06403790035.png
R& h: l6 f; J
2.3 设置(SETUP)事务处理【正常】的设置事务处理
# g1 { f9 B `$ j5 D! | Y# L8 I! i+ L) v% U8 F9 C, v& @
xws1qptrn3u6403790135.png
" A$ ?9 {2 B; s8 [, B8 m5 a$ |
【设备忙时】的设置事务处理
; o7 ?! u) e7 x; h9 @6 ~! o$ \( m$ z5 B2 N7 _9 H
ohejy2eovy16403790235.png
3 _5 n, k7 M9 y& @& S* q
【设备出错】的设置事务处理0 t4 R+ M, A" m# k
% }2 I( X7 i4 p0 }4 u
hthvnm3ovj46403790335.png
6 }# b$ m8 V( G$ L; M! j7 x: b0 O 3、USB传输类型 在USB的传输中,定义了4种传输类型:控制传输 (Control Transfer)
9 F' f- L6 T$ B. h' r, p6 c5 X中断传输 (Interrupt Transfer)" a8 s4 N/ P- ?$ Q- Q/ P
批量传输 (Bulk Transfer)
~; J2 O- J4 [/ B6 u5 y同步传输 (Isochronous)+ j; `+ t& f; d6 i# U0 h6 I
3.1 控制传输 (Control Transfer)控制传输由2~3个阶段组成:建立阶段(Setup)- X0 h, q" o4 a1 M" ?$ i
数据阶段(无数据控制没有此阶段)(DATA)9 C; ]. x( e" K: z* @
状态阶段(Status)! s. E6 }1 h+ K5 c* q2 K: ]
[/ol]每个阶段都由一次或多次(数据阶段)事务传输组成(Transaction)。控制数据由USB系统软件用于配置设备(在枚举时),其它的驱动软件可以选择使用control transfer实现具体的功能,数据传输是不可丢失的。3.1.1 建立阶段主机从USB设备获取配置信息,并设置设备的配置值。建立阶段的数据交换包含了SETUP令牌封包、紧随其后的DATA0数据封包以及ACK握手封包。它的作用是执行一个设置(概念含糊)的数据交换,并定义此控制传输的内容(即:在Data Stage中IN或OUT的data包个数,及发送方向,在Setup Stage已经被设定)。 p; ]/ J+ _' w+ H
evnsbq55tn16403790435.png
- d& o3 ], @6 n6 t
3.1.2 数据阶段根据数据阶段的数据传输的方向,控制传输又可分为3种类型:控制读取(读取USB描述符)* q1 P2 c% q( Y' F2 s+ Y
控制写入(配置USB设备)
: a ]5 y8 t- ^' O无数据控制
8 l" y/ s+ K6 ?) R, U[/ol]数据传输阶段:用来传输主机与设备之间的数据。控制读取. n- a2 G, _% M1 l' g/ J
是将数据从设备读到主机上,读取的数据USB设备描述符。该过程如下图的【Control Read】所示。对每一个数据信息包而言,首先,主机会发送一个IN令牌信息包,表示要读数据进来。然后,设备将数据通过DATA1/DATA0数据信息包回传给主机。最后,主机将以下列的方式加以响应:当数据已经正确接收时,主机送出ACK令牌信息包;当主机正在忙碌时,发出NAK握手信息包;当发生了错误时,主机发出STALL握手信息包。控制写入
9 o* v5 Y, L; g% M5 w" o. A是将数据从主机传到设备上,所传的数据即为对USB设备的配置信息,该过程如下的图【Control Wirte】所示。对每一个数据信息包而言,主机将会送出一个OUT令牌信息包,表示数据要送出去。紧接着,主机将数据通过DATA1/DATA0数据信息包传递至设备。最后,设备将以下列方式加以响应:当数据已经正确接收时,设备送出ACK令牌信息包;当设备正在忙碌时,设备发出NAK握手信息包;当发生了错误时,设备发出STALL握手信息包。
4 d7 n( ~: c) q; H+ h6 t( V 8 T' E$ x( Z4 a6 B4 @1 x4 V
3.1.3 状态阶段状态阶段:用来表示整个传输的过程已完全结束。状态阶段传输的方向必须与数据阶段的方向相反,即原来是IN令牌封包,这个阶段应为OUT令牌封包;反之,原来是OUT令牌封包,这个阶段应为IN令牌封包。对于【控制读取】而言,主机会送出OUT令牌封包,其后再跟着0长度的DATA1封包。而此时,设备也会做出相对应的动作,送ACK握手封包、NAK握手封包或STALL握手封包。相对地对于【控制写入】传输,主机会送出IN令牌封包,然后设备送出表示完成状态阶段的0长度的DATA1封包,主机再做出相对应的动作:送ACK握手封包、NAK握手封包或STALL握手封包。3.2 批量传输 (Bulk Transfer)用于传输大量数据,要求传输不能出错,但对时间没有要求,适用于打印机、存储设备等。批量传输是可靠的传输,需要握手包来表明传输的结果。若数据量比较大,将采用多次批量事务传输来完成全部数据的传输,传输过程中数据包的PID 按照 DATA0-DATA1-DATA0-…的方式翻转,以保证发送端和接收端的同步。USB 允许连续 3次以下的传输错误,会重试该传输,若成功则将错误次数计数器清零,否则累加该计数器。超过三次后,HOST 认为该端点功能错误(STALL),放弃该端点的传输任务。一次批量传输(Transfer)由 1 次到多次批量事务传输(Transaction)组成。翻转同步:发送端按照 DATA0-DATA1-DATA0-…的顺序发送数据包,只有成功的事务传输才会导致 PID 翻转,也就是说发送端只有在接收到 ACK 后才会翻转 PID,发送下一个数据包,否则会重试本次事务传输。同样,若在接收端发现接收到到的数据包不是按照此顺序翻转的,比如连续收到两个 DATA0,那么接收端认为第二个 DATA0 是前一个 DATA0 的重传。它通过在硬件级执行“错误检测”和“重传”来确保host与device之间“准确无误”地传输数据,即可靠传输。它由三种包组成(即IN事务或OUT事务):token
, J; q9 ~. V0 Qdata
( a4 `. K% `& K% c+ U* c* I5 e6 ghandshake; f# s2 |' @! ?3 A
[/ol]" q; t% A6 r8 x4 X4 ?% }* U

" ^. K2 z" r4 S4 o' N* JFor IN Token (即:IN Transaction)
1 V( V, }) r- W# y+ F) c[/ol]ACK: 表示host正确无误地接收到数据 c3 y4 o6 l! l! l* X
NAK: 指示设备暂时不能返回或接收数据 (如:设备忙)
5 D1 z% a" M' B& k: ?- N9 J6 `; ^. HSTALL:指示设备永远停止,需要host软件的干预 (如:设备出错)
- B+ r' \5 y' E- p' kFor OUT Token (即:OUT Transaction). \/ \. L5 b( v! l* C# d
[/ol]如果接收到的数据包有误,如:CRC错误,Device不发送任何handshake包ACK: Device已经正确无误地接收到数据包,且通知Host可以按顺序发送下一个数据包# C6 _7 ^/ W% `" ]( n5 N& r2 n
NAK: Device 已经正确无误地接收到数据包,且通知Host重传数据,由于Device临时状况(如buffer满) `6 y/ C6 S$ w' x) @; q
STALL: 指示Device endpoint已经停止,且通知Host不再重传
4 o; @7 o+ G4 S5 C4 qBulk读写序列
; ~3 U. w0 g0 a$ ]. J" w* R[/ol]
1 ]- j1 c1 K# o- M( D. ?' o0 k : t/ F5 Z: z) ]
即由一系统IN事务或OUT事务组成。3.3 中断传输(Interrupt Transfer)中断传输由IN或OUT事务组成。中断传输在流程上除不支持PING 之外,其他的跟批量传输是一样的。他们之间的区别也仅在于事务传输发生的端点不一样、支持的最大包长度不一样、优先级不一样等这样一些对用户来说透明的东西。主机在排定中断传输任务时,会根据对应中断端点描述符中指定的查询间隔发起中断传输。中断传输有较高的优先级,仅次于同步传输。同样中断传输也采用PID翻转的机制来保证收发端数据同步。下图为中断传输的流程图。中断传输方式总是用于对设备的查询,以确定是否有数据需要传输。因此中断传输的方向总是从USB设备到主机。$ ^* s2 o8 s5 C8 J
: l+ Y, u" `% V- l& [0 ?& a! w
DATA0或DATA1中的包含的是中断信息,而不是中断数据。3.4 同步传输(Isochronous Transfer)它由两种包组成:) e. t2 e6 i7 O. p* R
token) z) M, Q; h, T% ]3 d: D; N
data3 l# t% A) \! k8 i
[/ol]同步传输不支持“handshake”和“重传能力”,所以它是不可靠传输。同步传输是不可靠的传输,所以它没有握手包,也不支持PID翻转。主机在排定事务传输时,同步传输有最高的优先级。同步传输适用于必须以固定速率抵达或在指定时刻抵达,可以容忍偶尔错误的数据上。实时传输一般用于麦 克风、喇叭、UVC Camera等设备。实时传输只需令牌与数据两个信息包阶段,没有握手包,故数据传错时不会重传。
- ], v6 E$ x' @/ u
( \0 R8 s7 T9 r6 p0 W. ]- V7 u1 `; k# R2 V1 h
* n- x3 G0 u# L来源地址:https://blog.csdn.net/myarrow/article/details/84841137 L7 r0 `& D& X0 e3 K- |7 a
! p7 {5 V+ e2 u9 z! e/ d

# q8 M$ Y& M) q" z( j8 W" X6 r, C9 ? 0 {3 \( c1 D' a; D& K
声明:
0 k" y5 q- x1 ]6 a% }. E. N声明:文章来源网络,作者:Arrow。本号对所有原创、转载文章的陈述与观点均保持中立,推送文章仅供读者学习和交流。文章、图片等版权归原作者享有,如有侵权,联系删除。投稿/招聘/推广/宣传 请加微信:woniu26a推荐阅读▼: u( @2 j2 ?6 b5 d
电路设计-电路分析
7 e" M1 _- E7 v/ Y0 x# i$ Q! B vemc相关文章4 H: u; l4 Q- p' y0 X6 n
电子元器件
: |/ M n( S' q后台回复“加群”,管理员拉你加入同行技术交流群。 |