USB协议简介
) A8 i; w/ a$ b7 o" D USB是一种协议总线,即主机与设备之间的通信需要遵循一系列约定。协议内容较多,这里仅作一些简单介绍,深入学习,可参看USB规范(WWW.usb.org)。
# J" @8 c0 y( q5 o, P 为了理解协议中的名称,先看图10.32。该图突出了主机上的客户软件和USB逻辑设备(编程涉及的设备)之间的通信流(Communication Flow),该通信流跨越了USB驱动程序USBD、主控制器驱动程序UHCD、主控制器等硬件接口及其连接。端点(Endpoints)是USB设备的惟一可识别的部分,是主机和设备之间通信流的终点。每一个逻辑设备有若干个独立端点,每一个端点在设计时被分配一个惟一的由设备确定的标识符,称之为端点号。
4 b- _7 a, k U/ } 如图10.32所示,将用于通信流流动的通道称为管道(Pipe),这是忽略了许多中间环节的很形象的称呼,对于理解USB系统中的信息传输很有帮助。图中把3个端点看成了一个接口,关于接口的说明安排在后面。
8 V5 i8 L1 R1 [, _" I7 d7 h. ^
- y, ~, L: o/ P& R9 [* N% G3 w
9 u$ I5 Z" E& j- ~& J+ o9 }
1.包格式
, L: I" l' j; d4 C6 F1 u7 P
包的概念在前面已经介绍了,包是帧的基本成分。常用的包有令牌包、数据包和握手包。对于高速传输,还定义了事务分割专用令牌包(事务分割开始令牌包和事务分割完成令牌包)。
: R0 S$ Y' P' {2 t" Y- Y( z' @
1)令牌包格式
8 t+ Y! i2 S4 n/ G3 m! z/ ] 在USB系统中,所有的通信都是由主机发出相应的令牌所引起的。令牌包格式图
2 X/ @; z/ \8 \1 [6 o5 j) Q10.33所示。
; L" @' r8 e& w* h) a7 z 其中PID为包标识,ADDR为设备地址,ENDP为端点号,CRC5是对ADDR和ENDP域进行校验的5位CRC校验码,校验多项式为:G(X)=X5 X2 1。
) p& o' |1 T/ @* n! {- p3 i
2)数据包格式
/ \4 D. L* Z) i# \- l5 G4 F' D 数据包用于主机与设备之间的数据传输。数据包格式如图10.34所示。
3 c. Y# K2 @6 F K/ P, ~& L
其中PID为包标识,DATA为数据位,最多为8 192个位,DATA应是字节的整数倍。CRCl6是对DATA域进行校验的16位CRC校验码,校验多项式为:G(X)=X16 X15 X2 1.
* g2 C7 z* i4 d2 h1 q
) x, m) H, u' l% K
8 W0 E' U7 p9 _( p3 \
) `# l; g: V' l$ E8 _' q0 C/ o
( `9 m Y9 M& U; E; w9 A @- U
9 U. T$ _1 n. u- C0 H1 [. I8 _
3)握手包格式
: y) r" g$ E( A9 F
握手包用来指示数据被成功接收、命令被接收或被拒绝等事务状态。握手包格式如图10.35所示。
6 d6 K1 u+ r7 ]7 P+ t. \1 K
握手包仅由PII)组成。有四种常用握手包(ACK、NAK、STALL和NYET)和一个专用握手包,握手包的类型是通过PID的编码来体现的。
# l+ Q+ i! H& Y7 M( ^' J& @$ R·ACK包表示接收器已成功接收数据。
5 k& P0 K" I3 l& t) j2 S4 h
·NAK包表示接收设备不能接收数据或发送设备不能发送数据。
( s& O. i; q, r5 D8 X/ k2 \
·STALL包表示端点已终止或不支持控制管道请求。
- E. O. I% ?1 z9 `( S·NYET包表示接收器还没有任何响应。
5 |8 G. R0 l5 c( K- D
4)帧开始包SOF(Start Of Frame)
/ C1 W n" A9 ^7 B/ m2 K6 H6 n