USB 字段和包格式(1)
一 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所示。