USB协议简介
USB是一种协议总线,即主机与设备之间的通信需要遵循一系列约定。协议内容较多,这里仅作一些简单介绍,深入学习,可参看USB规范(WWW.usb.org)。
为了理解协议中的名称,先看图10.32。该图突出了主机上的客户软件和USB逻辑设备(编程涉及的设备)之间的通信流(Communication Flow),该通信流跨越了USB驱动程序USBD、主控制器驱动程序UHCD、主控制器等硬件接口及其连接。端点(Endpoints)是USB设备的惟一可识别的部分,是主机和设备之间通信流的终点。每一个逻辑设备有若干个独立端点,每一个端点在设计时被分配一个惟一的由设备确定的标识符,称之为端点号。
如图10.32所示,将用于通信流流动的通道称为管道(Pipe),这是忽略了许多中间环节的很形象的称呼,对于理解USB系统中的信息传输很有帮助。图中把3个端点看成了一个接口,关于接口的说明安排在后面。
1.包格式
包的概念在前面已经介绍了,包是帧的基本成分。常用的包有令牌包、数据包和握手包。对于高速传输,还定义了事务分割专用令牌包(事务分割开始令牌包和事务分割完成令牌包)。
1)令牌包格式
在USB系统中,所有的通信都是由主机发出相应的令牌所引起的。令牌包格式图
10.33所示。
其中PID为包标识,ADDR为设备地址,ENDP为端点号,CRC5是对ADDR和ENDP域进行校验的5位CRC校验码,校验多项式为:G(X)=X5+X2+1。
2)数据包格式
数据包用于主机与设备之间的数据传输。数据包格式如图10.34所示。
其中PID为包标识,DATA为数据位,最多为8 192个位,DATA应是字节的整数倍。CRCl6是对DATA域进行校验的16位CRC校验码,校验多项式为:G(X)=X16+X15+X2+1.
3)握手包格式
握手包用来指示数据被成功接收、命令被接收或被拒绝等事务状态。握手包格式如图10.35所示。
握手包仅由PII)组成。有四种常用握手包(ACK、NAK、STALL和NYET)和一个专用握手包,握手包的类型是通过PID的编码来体现的。
·ACK包表示接收器已成功接收数据。
·NAK包表示接收设备不能接收数据或发送设备不能发送数据。
·STALL包表示端点已终止或不支持控制管道请求。
·NYET包表示接收器还没有任何响应。
4)帧开始包SOF(Start Of Frame)
在全速或低速时,主机每隔1 ms±0.0005 ms发出一个帧开始包SOF,在高速时,每隔125 μs±0.0625μs发出一个SOF,以表示开始一个新帧。SOF包的格式如图10.36所示。
其中FmmeNumber为帧编号,每发一帧后FrameNumber加l,当11位都为1(即3FFH)时再加1又回到0。在SOF包中对FrameNumber域进行CRC校验。
2.PID域格式
上面的几种包的开始都是PID域。PID域的格式如图10.37所示。
低4位用来标识不同的包,高4位分别为低4位的非。这样安排是为了保证对PID可靠的译码,从而也使得包的其他部分能得到正确解释。表lO.20表示了PID编码和对应的PID类型。其中第3列是PID的低4位,即PID编码。
表中有两种数据包PID,都用于数据的传输,以它们开头的两种数据包除了包PID部分有一位(及与它对应的反向位)不同外,其他部分都相同。设置这两种数据包是为了使发送方和接收方保持同步,这涉及到一些细节,将在10.3.6小节中介绍。在图10.38~10.40中不妨将它们看成一种数据包。
|