《USB的HID通信协议》由会员分享,可在线阅读,更多相关《USB的HID通信协议(9页珍藏版)》请在金锄头文库上搜索。
1、 . .USB事务处理是主机和设备之间数据传输的基本单位,由一系列具有特定格式的信息包组成。因此,要了解完整的USB通信协议,必须从USB的信息传输单元包及其数据域谈起。通过由下而上,从简单至复杂的通信协议单位组成各种复杂的通信协议,进而构建出完整的通信协议。 16.4.1 包 包(Packet)是USB系统中信息传输的基本单元,所有数据都是经过打包后在总线上传输的。首先了解一下包的组成。 USB包由五部分组成,即同步(SYNC)字段、包标识符(PID)字段、数据字段、循环冗余校验(CRC)字段和包结尾(EOP)字段,包的基本格式如下: 同步字段(SYNC) PID字段 数据字段 CRC字段
2、包结尾字段(EOP) 在USB的数据传输中,所有的传输包都起始于SYNC,接着是PID,后面是包中所包含的数据信息,接下来是用来检测包中数据错误的循环冗余校验信息,最后以包结尾作为结束标志。下面我们将一一介绍每个字段。 1同步(SYNC)字段 SYNC字段由8位组成,作为每个数据信息包的前导。顾名思义,它是用来产生同步作用的,目的是使USB设备与总线的包传输率同步,它的数值固定为00000001。 2包标识符(PID)字段 PID字段是紧随在SYNC字段后面,用来表示数据信息包的类型。在USB协议中,根据PID的不同,USB包有着不同的类型,分别表示具有特定的意义。如下所示: PID0 PID
3、1 PID2 PID3 包标识符长度为一个字节(8个数据位),由4个位的包类型字段和4个位的校验字段构成。PID是USB包类型的唯一标志,USB主机和USB设备在接收到包后,必须首先对包标识符解码得到包的类型,并判断其意义从而做出下一个反应。包标识符中的校验字段是通过对类型字段的每个位求反码产生的,它是用来对包类型字段进行错误检测用的,旨在保证对包的标识符译码的可靠性,如果4个检验位不是它们各自的类型位的反码,则说明标识符中的信息有错误。 表16-2中列出了信息包的类型,包括令牌、数据、握手或特殊四种信息包类型。为简化对USB的认识,有关高速传输的部分没有在表中列出。 3数据字段 在USB包中
4、,数据字段是用来携带主机与设备之间要传递的信息,其内容和长度根据包标识符、传输类型的不同而各不相同。并非所有的USB包都必须有数据字段,例如握手包、专用包和SOF令牌包就没有数据字段。在USB包中,数据字段可以包含设备地址、端点号、帧序列号以及数据等内容。在总线传输中,总是首先传输字节的最低位,最后传输字节的最高位。 (1) 设备地址(ADDR)数据域 ADDR数据域由7位组成,可用来寻址多达127个外围设备。 (2) 端点(ENDP)数据域 ENDP数据域由4位组成。通过这4个位最多可寻址出32个端点。这个ENDP数据域仅用在IN、OUT与SETUP令牌信息包中。对于慢速设备可支持端点0以及
5、端点1作为中断传输模式,而全速设备则可以拥有16个输入端点(IN)与16个输出端点(OUT)共32个端点。 (3) 帧序列号 当USB令牌包的PID为SOF时,其数据字段必须为11位的帧序列号。帧序列号由主机产生,且每个数据帧自动加一,最大数值为0x7FF。当帧序列号达到最大数时将自动从0开始循环。 (4) 数据 它仅存于DATA信息包内,根据不同的传输类型,拥有不同的字节大小,从0到1023字节(实时传输)。 4循环冗余校验(CRC)字段 根据不同的信息包类型,CRC数据域由不同数目的位所组成。其中重要的数据信息包采用CRC16的数据域(16个位),而其余的信息包类型则采用CRC5的数据域(
6、5个位)。其中的循环冗余码校验CRC,是一种错误检测技术。由于数据在传输时,有时候会发生错误,因此CRC可根据数据算出一个校验值,然后依此判断数据的正确性。 5包结尾(EOP)字段 包的发送方在包的结尾发出包结尾信号。它表现为差分线路的两根数据线保持2比特低位时间和1比特空闲位时间。USB主机根据EOP判断数据包的结束。 16.4.2 信息包格式 根据信息包所实现的功能,其可以分为3种类型:令牌包、数据包和握手包。其中,令牌包定义了数据传输的类型,数据包中含有需要传输的数据,握手包指明了数据接收是否成功。 1令牌(token)包 在USB系统中,只有主机才能发出令牌包。令牌包定义了数据传输的类
7、型,它是事务处理的第一阶段。令牌包格式如下: 8位 8位 7位 4位 5位 SYNC PID ADDR ENDP CRC5 令牌包中较为重要的是SETUP、IN和OUT这三个令牌包。它们用来在根集线器和设备端点之间建立数据传输。一个IN包用来建立一个从设备到根集线器的数据传送,一个OUT包用来建立从根集线器到设备的数据传输。IN包和OUT包可以对任何设备上的任何端点编址。一个SETUP包是一个OUT包的特殊情形,它是“高优先级的”,也就是说设备必须接受它,即使设备正在进行数据传输操作的过程中也要对其进行响应。SETUP包总是指向端点0的。 2数据(data)包 一个数据信息包包含了4个数据域:
8、SYNC、PID、DATA与CRC16。在这里要注意的是DATA数据域内所放置的位值,需根据USB设备的传输速度(慢速、高速与全速)以及传输类型(中断传输、批量传输、等时传输)而定,且须以8字节为基本单位。也就是,若传输的数据不足8字节,或传输到最后所剩余的也不足8字节,仍须传输8字节的数据域。格式如下: 8位 8位 01023字节 16位 SYNC PID DATA CRC16 3握手(Handshake)包 握手信息包是最简单的信息包类型。在这个握手信息包中仅包含一个PID数据域而已,它的格式如下所列: 8位 8位 SYNC PID 其中仅包含SYNC与PID两个数据域。 16.4.3 事
9、务 在USB上数据信息的一次接收或发送的处理过程称为事务处理(Transaction)。事务处理的类型包括输入(IN)事务处理、输出(OUT)事务处理、设置(SETUP)事务处理和帧开始、帧结尾等类型。在输出(OUT)事务处理和设置(SETUP)事务处理中,紧接着SETUP和OUT包后的是DATA包,DATA0和DATA1包是交替地发送的,在DATA包后面,设备将回应一个握手信号,如果设备可以接收数据,就回应ACK包,如果设备忙,就回应NAK包,如果设备出错,则回应STALL包;在IN事务中,IN包后面是设备发来的DATA包或NAK包或STALL包,若设备忙或出错,就发NAK包或STALL包给
10、主机,若设备数据准备好发送,则发DATA包,DATA0和DATA1包也是交替地发送的,紧接着DATA包后面是主机发给设备的握手包,ACK表示主机可以接收数据,NAK包代表主机忙,STALL包代表主机出错。下面我们再分别介绍这些事务。 1输入(IN)事务处理 输入事务处理表示USB主机从总线上的某个USB设备接收一个数据包的过程,接下来分析输入事务处理的各种典型情况: (1) 正常的输入事务处理 1主机-设备(令牌信息包) SYNC IN ADDR ENDP CRC5 2设备-主机(数据信息包) SYNC DATA0 DATA CRC16 3主机-设备(握手信息包) SYNC ACK (2) 设
11、备忙时的输入事务处理 1主机-设备(令牌信息包) SYNC IN ADDR ENDP CRC5 2设备-主机(握手信息包) SYNC NAK (3) 设备出错时的输入事务处理 1主机-设备(令牌信息包) SYNC IN ADDR ENDP CRC5 2设备-主机(握手信息包) SYNC STALL 2输出(OUT)事务处理 (1) 正常的输出事务处理 1主机-设备(令牌信息包) SYNC OUT ADDR ENDP CRC5 2主机-设备(数据信息包) SYNC DATA0 DATA CRC16 3设备-主机(握手信息包) SYNC ACK (2) 设备忙时的输出事务处理 1主机-设备(令牌信
12、息包) SYNC OUT ADDR ENDP CRC5 2主机-设备(数据信息包) SYNC DATA0 DATA CRC16 3设备-主机(握手信息包) SYNC NAK (3) 设备出错时的输出事务处理 1主机-设备(令牌信息包) SYNC OUT ADDR ENDP CRC5 2主机-设备(数据信息包) SYNC DATA0 DATA CRC16 3设备-主机(握手信息包) SYNC STALL 3设置(SETUP)事务处理 (1) 正常的设置事务处理 1主机-设备(令牌信息包) SYNC SETUP ADDR ENDP CRC5 2主机-设备(数据信息包) SYNC DATA0 DAT
13、A CRC16 3设备-主机(握手信息包) SYNC ACK (2) 设备忙时的设置事务处理 1主机-设备(令牌信息包) SYNC SETUP ADDR ENDP CRC5 2主机-设备(数据信息包) SYNC DATA0 DATA CRC16 3设备-主机(握手信息包) SYNC NAK (3) 设备出错时的设置事务处理 1主机-设备(令牌信息包) SYNC SETUP ADDR ENDP CRC5 2主机-设备(数据信息包) SYNC DATA0 DATA CRC16 3设备-主机(握手信息包) SYNC STALL 16.4.4 USB传输类型 在USB的传输中,制定了4种传输类型:控制
14、传输、中断传输、批量传输以及实时传输。这里只详细介绍控制传输,其他传输类型只作简要说明。 1控制传输 控制传输是USB传输中最重要的传输,唯有正确地执行完控制传输,才能进一步正确地执行其他传输模式。 由于每个USB设备可能速度、传输的包的大小等信息有可能不同,因此每个USB设备内部都记录着该设备的一些信息(也就是接下来将要介绍的设备描述符),当在主机上检测到USB设备时,系统软件必须读取设备描述符,以确定该设备的类型和操作特性,以及对该设备进行相应的配置,这些工作都是通过控制传输来完成。每个USB设备都必须实现一个缺省的控制端点,该端点总是0号端点。 控制传输类型分为23个阶段:设置阶段、数据
15、阶段(无数据控制没有此阶段)以及状态阶段。根据数据阶段的数据传输的方向,控制传输又可分为3种类型:控制读取(读取USB描述符)、控制写入(配置USB设备)以及无数据控制。以下介绍各阶段的工作。 阶段一:设置阶段 USB设备在正常使用之前,必须先配置,本阶段由主机将信息传送给USB设备,定义对USB设备的请求信息(如:读设备描述符)。主机一般会从USB设备获取配置信息后再确定此设备有哪些功能。作为配置的一部分,主机会设置设备的配置值。我们统称这一阶段为设置阶段。 设置阶段由设置事务完成,也就是该阶段包含了SETUP令牌信息包、紧随其后的DATA0数据信息包(该信息包里的数据即为设备请求,本章将后续介绍)以及ACK握手信息包。它的作用是执行一个设置的数据交换,并定义此控制传输的内容。 阶段二:数据传输阶段 数据传输阶段是用来传输主机与设备之间的数据。 控制读取是将数据从设备读到主机上,读取的数据USB设备描述符。该过程如图16-8所示。对每一个数据信息包而言,首先,主机会发送一个IN令牌信息包,表示要读数据进来。然后,设备将数