USB 字段和包格式(1)

本文由小南瓜饼从http://www.cnblogs.com/zsb517/archive/2012/06/03/2532402.html转载

一  USB是一种协议总线,即主机与设备之间的通信需要遵循一系列约定。协议内容较多,这里仅作一些简单介绍,深入学习,可参看USB规范(WWW.usb.org)。 
为 了理解协议中的名称,先看图10.32。该图突出了主机上的客户软件和USB逻辑设备(编程涉及的设备)之间的通信流 (Communication Flow),该通信流跨越了USB驱动程序USBD、主控制器驱动程序UHCD、主控制器等硬件接口及其连接。端点 (Endpoints)是USB设备的惟一可识别的部分,是主机和设备之间通信流的终点。每一个逻辑设备有若干个独立端点,每一个端点在设计时被分配一个 惟一的由设备确定的标识符,称之为端点号。 如图10.32所示,将用于通信流流动的通道称为管道(Pipe),这是忽略了许多中间环节的很形象的称呼,对于理解USB系统中的信息传输很有帮助。图 中把3个端点看成了一个接口,关于接口的说明安排在后面。

1 包标示PID字段

命令面的几种包的开始都是PID域。PID域的格式如图10.37所示。

低 4位用来标识不同的包,高4位分别为低4位的检验字段,这样安排是为了保证对PID可靠的译码,从而也使得包的其他部分能得到正确解释。表10.20表示 了PID编码和对应的PID类型。其中第3列是PID的低4位,即PID编码。 表中有两种数据包PID,都用于数据的传输,以它们开头的两种数据包除了包PID部分有一位(及与它对应的反向位)不同外,其他部分都相同。设置这两种数 据 包是为了使发送方和接收方保持同步,这涉及到一些细节,将在10.3.6小节中介绍。在图10.38~10.40中不妨将它们看成一种数据包。 

2、地址字段(ADDR)

地 址字段用于指定USB系统中的一个USB设备,包含6个数据位,最多可以指定128个地址,地址0用作缺省地址,不分配给USB设备,USB设备 是发送方还是接收方,则取决于PID字段的值。在IN、OUT、SETUP、SPLIT和PING令牌包中都必须使用该地址字段,以指明与其通信的USB 设备。如果指定的设备地址不存在,该数据包被丢弃。USB设备上电和复位时,使用缺省地址0来与主机通信。在设备配置过程中,主机会为其分配一个唯一的设 备地址。

3、 端点字段(ENDP)

端点字段用于指定USB设备中的一个端点,包含4 个数据位;全速/高速设备最多可以含有16个端点,低速设备最多含有3个端点。所有USB设备都必 须含有一个0号端点,以完成与主机间的配置通信,除0号端点外,其余的端点都是具体USB设备所特有的。在IN、OUT、SETUP、SPLIT和 PING令牌包中都必须使用该端点字段,以指明与其进行数据传输的USB设备端点。如果指定的端点号不存在,则该数据包被忽略,如果在端点初始化之前就访 问该端点,则数据包也将被忽略。

4、帧号字段

帧号字段用于指出当前帧的帧号,它仅在每帧/小帧开始的SOF令牌包中被发送,其数据位长度为11位,每传输一帧,主机就将其内容加1,当达到最大值7FFH时归零。

5、 数据字段

数据字段包含主机和USB设备间需要传输的数据,以字节为单位,最大长度为1024,而实际长度取决于传输的具体情况。

6、CRC字段

USB 令牌包和数据包中都使用了CRC。但是,CRC是发送方在进行位填充之前产生的,这样要求接收方在去除位填充之后,再对CRC字段进行译码。 信息包中的PID字段本身含有校验,所以CRC不含有PID部分。令牌包的CRC采用的是5位的CRC校验,数据包中的数据字段使用的是16位CRC。

三 信息包

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所示。
    


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章