USB的HID通信协议.docx
- 文档编号:24187475
- 上传时间:2023-05-25
- 格式:DOCX
- 页数:15
- 大小:23.60KB
USB的HID通信协议.docx
《USB的HID通信协议.docx》由会员分享,可在线阅读,更多相关《USB的HID通信协议.docx(15页珍藏版)》请在冰豆网上搜索。
USB的HID通信协议
USB事务处理是主机和设备之间数据传输的基本单位,由一系列具有特定格式的信息包组成。
因此,要了解完整的USB通信协议,必须从USB的信息传输单元包及其数据域谈起。
通过由下而上,从简单至复杂的通信协议单位组成各种复杂的通信协议,进而构建出完整的通信协议。
16.4.1包
包(Packet)是USB系统中信息传输的基本单元,所有数据都是经过打包后在总线上传输的。
首先了解一下包的组成。
USB包由五部分组成,即同步(SYNC)字段、包标识符(PID)字段、数据字段、循环冗余校验(CRC)字段和包结尾(EOP)字段,包的基本格式如下:
同步字段(SYNC)PID字段数据字段CRC字段包结尾字段(EOP)
在USB的数据传输中,所有的传输包都起始于SYNC,接着是PID,后面是包中所包含的数据信息,接下来是用来检测包中数据错误的循环冗余校验信息,最后以包结尾作为结束标志。
下面我们将一一介绍每个字段。
1.同步(SYNC)字段
SYNC字段由8位组成,作为每个数据信息包的前导。
顾名思义,它是用来产生同步作用的,目的是使USB设备与总线的包传输率同步,它的数值固定为00000001。
2.包标识符(PID)字段
PID字段是紧随在SYNC字段后面,用来表示数据信息包的类型。
在USB协议中,根据PID的不同,USB包有着不同的类型,分别表示具有特定的意义。
如下所示:
PID0PID1PID2PID3
包标识符长度为一个字节(8个数据位),由4个位的包类型字段和4个位的校验字段构成。
PID是USB包类型的唯一标志,USB主机和USB设备在接收到包后,必须首先对包标识符解码得到包的类型,并判断其意义从而做出下一个反应。
包标识符中的校验字段是通过对类型字段的每个位求反码产生的,它是用来对包类型字段进行错误检测用的,旨在保证对包的标识符译码的可靠性,如果4个检验位不是它们各自的类型位的反码,则说明标识符中的信息有错误。
表16-2中列出了信息包的类型,包括令牌、数据、握手或特殊四种信息包类型。
为简化对USB的认识,有关高速传输的部分没有在表中列出。
3.数据字段
在USB包中,数据字段是用来携带主机与设备之间要传递的信息,其内容和长度根据包标识符、传输类型的不同而各不相同。
并非所有的USB包都必须有数据字段,例如握手包、专用包和SOF令牌包就没有数据字段。
在USB包中,数据字段可以包含设备地址、端点号、帧序列号以及数据等内容。
在总线传输中,总是首先传输字节的最低位,最后传输字节的最高位。
(1)设备地址(ADDR)数据域
ADDR数据域由7位组成,可用来寻址多达127个外围设备。
(2)端点(ENDP)数据域
ENDP数据域由4位组成。
通过这4个位最多可寻址出32个端点。
这个ENDP数据域仅用在IN、OUT与SETUP令牌信息包中。
对于慢速设备可支持端点0以及端点1作为中断传输模式,而全速设备则可以拥有16个输入端点(IN)与16个输出端点(OUT)共32个端点。
(3)帧序列号
当USB令牌包的PID为SOF时,其数据字段必须为11位的帧序列号。
帧序列号由主机产生,且每个数据帧自动加一,最大数值为0x7FF。
当帧序列号达到最大数时将自动从0开始循环。
(4)数据
它仅存于DATA信息包内,根据不同的传输类型,拥有不同的字节大小,从0到1023字节(实时传输)。
4.循环冗余校验(CRC)字段
根据不同的信息包类型,CRC数据域由不同数目的位所组成。
其中重要的数据信息包采用CRC16的数据域(16个位),而其余的信息包类型则采用CRC5的数据域(5个位)。
其中的循环冗余码校验CRC,是一种错误检测技术。
由于数据在传输时,有时候会发生错误,因此CRC可根据数据算出一个校验值,然后依此判断数据的正确性。
5.包结尾(EOP)字段
包的发送方在包的结尾发出包结尾信号。
它表现为差分线路的两根数据线保持2比特低位时间和1比特空闲位时间。
USB主机根据EOP判断数据包的结束。
16.4.2信息包格式
根据信息包所实现的功能,其可以分为3种类型:
令牌包、数据包和握手包。
其中,令牌包定义了数据传输的类型,数据包中含有需要传输的数据,握手包指明了数据接收是否成功。
1.令牌(token)包
在USB系统中,只有主机才能发出令牌包。
令牌包定义了数据传输的类型,它是事务处理的第一阶段。
令牌包格式如下:
8位8位7位4位5位
SYNCPID
ADDRENDPCRC5
令牌包中较为重要的是SETUP、IN和OUT这三个令牌包。
它们用来在根集线器和设备端点之间建立数据传输。
一个IN包用来建立一个从设备到根集线器的数据传送,一个OUT包用来建立从根集线器到设备的数据传输。
IN包和OUT包可以对任何设备上的任何端点编址。
一个SETUP包是一个OUT包的特殊情形,它是“高优先级的”,也就是说设备必须接受它,即使设备正在进行数据传输操作的过程中也要对其进行响应。
SETUP包总是指向端点0的。
2.数据(data)包
一个数据信息包包含了4个数据域:
SYNC、PID、DATA与CRC16。
在这里要注意的是DATA数据域内所放置的位值,需根据USB设备的传输速度(慢速、高速与全速)以及传输类型(中断传输、批量传输、等时传输)而定,且须以8字节为基本单位。
也就是,若传输的数据不足8字节,或传输到最后所剩余的也不足8字节,仍须传输8字节的数据域。
格式如下:
8位8位0~1023字节16位
SYNCPID
DATACRC16
3.握手(Handshake)包
握手信息包是最简单的信息包类型。
在这个握手信息包中仅包含一个PID数据域而已,它的格式如下所列:
8位8位
SYNCPID
其中仅包含SYNC与PID两个数据域。
16.4.3事务
在USB上数据信息的一次接收或发送的处理过程称为事务处理(Transaction)。
事务处理的类型包括输入(IN)事务处理、输出(OUT)事务处理、设置(SETUP)事务处理和帧开始、帧结尾等类型。
在输出(OUT)事务处理和设置(SETUP)事务处理中,紧接着SETUP和OUT包后的是DATA包,DATA0和DATA1包是交替地发送的,在DATA包后面,设备将回应一个握手信号,如果设备可以接收数据,就回应ACK包,如果设备忙,就回应NAK包,如果设备出错,则回应STALL包;在IN事务中,IN包后面是设备发来的DATA包或NAK包或STALL包,若设备忙或出错,就发NAK包或STALL包给主机,若设备数据准备好发送,则发DATA包,DATA0和DATA1包也是交替地发送的,紧接着DATA包后面是主机发给设备的握手包,ACK表示主机可以接收数据,NAK包代表主机忙,STALL包代表主机出错。
下面我们再分别介绍这些事务。
1.输入(IN)事务处理
输入事务处理表示USB主机从总线上的某个USB设备接收一个数据包的过程,接下来分析输入事务处理的各种典型情况:
(1)正常的输入事务处理
1.主机->设备(令牌信息包)SYNCINADDRENDPCRC5
2.设备->主机(数据信息包)SYNCDATA0DATACRC16
3.主机->设备(握手信息包)SYNCACK
(2)设备忙时的输入事务处理
1.主机->设备(令牌信息包)SYNCINADDRENDPCRC5
2.设备->主机(握手信息包)SYNCNAK
(3)设备出错时的输入事务处理
1.主机->设备(令牌信息包)SYNCINADDRENDPCRC5
2.设备->主机(握手信息包)SYNCSTALL
2.输出(OUT)事务处理
(1)正常的输出事务处理
1.主机->设备(令牌信息包)SYNCOUTADDRENDPCRC5
2.主机->设备(数据信息包)SYNCDATA0DATACRC16
3.设备->主机(握手信息包)SYNCACK
(2)设备忙时的输出事务处理
1.主机->设备(令牌信息包)SYNCOUTADDRENDPCRC5
2.主机->设备(数据信息包)SYNCDATA0DATACRC16
3.设备->主机(握手信息包)SYNCNAK
(3)设备出错时的输出事务处理
1.主机->设备(令牌信息包)SYNCOUTADDRENDPCRC5
2.主机->设备(数据信息包)SYNCDATA0DATACRC16
3.设备->主机(握手信息包)SYNCSTALL
3.设置(SETUP)事务处理
(1)正常的设置事务处理
1.主机->设备(令牌信息包)SYNCSETUPADDRENDPCRC5
2.主机->设备(数据信息包)SYNCDATA0DATACRC16
3.设备->主机(握手信息包)SYNCACK
(2)设备忙时的设置事务处理
1.主机->设备(令牌信息包)SYNCSETUPADDRENDPCRC5
2.主机->设备(数据信息包)SYNCDATA0DATACRC16
3.设备->主机(握手信息包)SYNCNAK
(3)设备出错时的设置事务处理
1.主机->设备(令牌信息包)SYNCSETUPADDRENDPCRC5
2.主机->设备(数据信息包)SYNCDATA0DATACRC16
3.设备->主机(握手信息包)SYNCSTALL
16.4.4USB传输类型
在USB的传输中,制定了4种传输类型:
控制传输、中断传输、批量传输以及实时传输。
这里只详细介绍控制传输,其他传输类型只作简要说明。
1.控制传输
控制传输是USB传输中最重要的传输,唯有正确地执行完控制传输,才能进一步正确地执行其他传输模式。
由于每个USB设备可能速度、传输的包的大小等信息有可能不同,因此每个USB设备内部都记录着该设备的一些信息(也就是接下来将要介绍的设备描述符),当在主机上检测到USB设备时,系统软件必须读取设备描述符,以确定该设备的类型和操作特性,以及对该设备进行相应的配置,这些工作都是通过控制传输来完成。
每个USB设备都必须实现一个缺省的控制端点,该端点总是0号端点。
控制传输类型分为2~3个阶段:
设置阶段、数据阶段(无数据控制没有此阶段)以及状态阶段。
根据数据阶段的数据传输的方向,控制传输又可分为3种类型:
控制读取(读取USB描述符)、控制写入(配置USB设备)以及无数据控制。
以下介绍各阶段的工作。
阶段一:
设置阶段
USB设备在正常使用之前,必须先配置,本阶段由主机将信息传送给USB设备,定义对USB设备的请求信息(如:
读设备描述符)。
主机一般会从USB设备获取配置信息后再确定此设备有哪些功能。
作为配置的一部分,主机会设置设备的配置值。
我们统称这一阶段为设置阶段。
设置阶段由设置事务完成,也就是该阶段包含了SETUP令牌信息包、紧随其后的DATA0数据信息包(该信息包里的数据即为设备请求,本章将后续介绍)以及ACK握手信息包。
它的作用是执行一个设置的数据交换,并定义此控制传输的内容。
阶段二:
数据传输阶段
数据传输阶段是用来传输主机与设备之间的数据。
控制读取是将数据从设备读到主机上,读取的数据USB设备描述符。
该过程如图16-8所示。
对每一个数据信息包而言,首先,主机会发送一个IN令牌信息包,表示要读数据进来。
然后,设备将数据通过DATA1数据信息包回传给主机。
最后,主机将以下列的方式加以响应:
当数据已经正确接收时,主机送出ACK令牌信息包;当主机正在忙碌时,发出NAK握手信息包;当发生了错误时,主机发出STALL握手信息包。
控制写入则是将数据从主机传到设备上,所传的数据即为对USB设备的配置信息,该过程如图16-9所示。
对每一个数据信息包而言,主机将会送出一个OUT令牌信息包,表示数据要送出去。
紧接着,主机将数据通过DATA0数据信息包传递至设备。
最后,设备将以下列方式加以响应:
当数据已经正确接收时,设备送出ACK令牌信息包;当设备正在忙碌时,设备发出NAK握手信息包;当发生了错误时,设备发出STALL握手信息包。
阶段三:
状态阶段
状态阶段用来表示整个传输的过程已经完全结束了。
请注意,状态阶段传输的方向必须与数据阶段的方向相反。
即原来是IN令牌信息包,这个阶段应为OUT令牌信息包;反之,原来是OUT令牌信息包,这个阶段应为IN令牌信息包。
对于控制读取而言,主机会送出OUT令牌信息包,其后再跟着0长度的DATA1信息包。
而此时,设备也会做出相对应的动作,送ACK握手信息包、NAK握手信息包或STALL握手信息包。
相对地对于控制写入传输,主机会送出IN令牌信息包,然后设备送出表示完成状态阶段的0长度的DATA1信息包,主机再做出相对应的动作:
送ACK握手信息包、NAK握手信息包或STALL握手信息包。
2.实时传输
实时传输适用于必须以固定速率抵达或在指定时刻抵达,可以容忍偶尔错误的数据上。
实时传输一般用于麦克风、喇叭等设备。
实时传输只需令牌与数据两个信息包阶段,没有握手包,故数据传错时不会重传。
3.批量传输
用于传输大量数据,要求传输不能出错,但对时间没有要求,适用于打印机、存储设备等。
4.中断传输
中断传输方式总是用于对设备的查询,以确定是否有数据需要传输。
因此中断传输的方向总是从USB设备到主机。
16.4.5设备列举
1.描述符
USB描述符就好像是USB外围设备的“身份证”一样,详细地记录着外围设备相关的一切信息。
为了描述不同的数据,就需以不同类型的USB描述符来加以描述,它共有以下几种类型:
设备描述符、配置描述符、接口描述符和端点描述符,这几个描述符是必须具有的,下面将结合实例详细介绍;其他的描述符,例如,字符串描述符、数种不同的群组描述符以及报告描述符则可以根据不同的设备进行选择。
(1)设备描述符
设备描述符具有18字节的长度,并且是主机向设备请求的第一个描述符。
以下列出设备描述符的范例、数值以及各个字段的意义:
DeviceDesc:
;表示设备描述符
.byte$12;bLength域,表示该描述符的字节长度为18个字节
.byte$01;bDescriptorType域描述符类型,1代表设备
.byte$10,$01;bcdUSB域表示符合USB1.10规范,$210代表2.10规范
.byte$00;bDeviceClass域,群组码,0表示每个接口都有自身的群信息,
;不同的接口操作相互独立
.byte$00;bDeviceSubClass域,设备次群组(如果群组码为0,设备次群组必须为0)
.byte$00;bDeviceProtocol域,设备协议(0表示无群组特定协议)
.byte$08;bMaxPacketSize0域,端点0的最大信息包大小(只能为8、16、32或64)
.byte$70,$0C;idVendor域,制造商ID(2字节)
.byte$00,$00;idProduct域,产品ID(2字节)
.byte$00,$01;bcdDevice域,以BCD表示设备发行序号(2字节)
.byte$01;iManufacturer域,制造商的字符串描述符索引(1字节),本实例中指
;String1Desc处的字符串描述符
.byte$02;iProduct域,产品的字符串描述符索引(1字节),本实例中指
;String2Desc处的字符串描述符
.byte$00;iSerialNumber域,设备序号的字符串描述符索引(1字节),
;本实例中指String0Desc处的字符串描述符
.byte$01;bNumConfigurations域,配置数目为1
(2)配置描述符
配置描述符具有9字节的长度,针对设备给予配置的信息。
以下列出配置描述符的范例、数值以及各个字段的意义:
ConfigDesc:
;表示配置描述符
.byte$09;bLength域,表示该描述符的字节长度为9个字节(1字节)
.byte$02;bDescriptorType域,描述符类型,2代表配置(1字节)
.byte$20,$00;wTotalLength域,描述符的总长度为32个字节,(包括配置描述符
;9字节,接口描述符9字节,两个端点描述符各7字节)
.byte$01;bNumInterfaces域,该配置支持的接口数目(1字节)
.byte$01;bConfigurationValue域,配置值,作为SetConfiguration请求的配置值
.byte$00;iConfiguration域,配置的字符串描述符的索引(1字节)
.byte$C0;bmAttributes域,配置的属性(自供电,不具有远程唤醒的特征)
.byte$00;MaxPower域,表示当USB设备操作时,它从总线上
;获得的最大电源(以2mA为单位)
(3)接口描述符
接口描述符具有9字节的长度,用来描述每一个设备的接口特性。
以下列出接口描述符的范例、数值以及各个字段的意义:
InterfaceDesc:
;表示接口描述符
.byte$09;bLength域,表示该描述符的字节长度为9个字节
.byte$04;bDescriptorType域,描述符类型,4代表接口
.byte$00;bInterfaceNumber域,接口数目以0为基值(表示一个接口)
.byte$00;bAlternateSetting域,交互设置值为0(因为只有一个接口)
.byte$02;bNumEndpoints域,端点数目设置为2
.byte$FF;bInterfaceClass域,接口群组,$FF表示是供应商说明书
.byte$01;bInterfaceSubClass域,接口次群组
.byte$FF;bInterfaceProtocol域,接口协议,$FF表示该接口使用的
;是供应商说明的协议
.byte$00;iInterface域,接口的字符串描述符的索引,本实例没有
(4)端点描述符
端点描述符具有7字节长度,用来描述端点的属性以及各个端点的位置。
该实例中有两个端点,我们首先介绍端点1描述符:
Endpoint1Desc:
;表示端点1描述符
.byte$07;bLength域,表示该描述符的字节长度为7个字节
.byte$05;bDescriptorType域,描述符类型,5代表端点
.byte$81;bEndpointAddress域,端点地址([0x81=IN,0x02=OUT]),
;本实例端点编号为1且为IN端点
.byte$03;bmAttributes域,传输类型的属性设置为中断传输
;(0=控制,1=实时,2=批量,3=中断)
.byte$08,$00;wMaxPacketSize域,最大信息包的大小设置为8个字节
.byte$0A;bInterval域,轮询间隔,以ms为单位,在此设置为10ms
接下来介绍端点2描述符:
Endpoint2Desc:
;表示端点2描述符
.byte$07;bLength域,表示该描述符的字节长度为7个字节
.byte$05;bDescriptorType域,描述符类型,5代表端点
.byte$02;bEndpointAddress域,端点地址([0x81=IN,0x02=OUT]),
;本实例端点编号为2且为OUT端点
.byte$03;bmAttributes域,传输类型的属性设置为中断传输
;(0=控制,1=实时,2=批量,3=中断)
.byte$08,$00;wMaxPacketSize域,最大信息包的大小设置为8个字节
.byte$0A;bInterval域,轮询间隔,以ms为单位,在此设置为10ms
2.USB设备请求
在USB接口的通信协议中,由于主机是取得绝对的主控权,因此,主机与设备之间就必须遵循某种已沟通的特定命令格式,以达到通信的目的。
而这个命令格式就是USB规范书中所制定的“设备请求”。
这个设备请求的设置、清除与取得都须通过控制传输的数据交换来完成。
表16-3中列出了标准设备请求的数据格式内容。
表16-3各字段含义解释如下。
bmRequestType域决定了特定请求的特征,该域的D7表示在控制传输的数据阶段,数据传输的方向。
如果wLength的值为0,表示没有数据阶段,该位可以忽略;D[6:
5]表示了该请求所属的类型,USB标准中定义了所有的USB设备必须支持的一系列的标准请求,此外,群组和供应商也可以定义一些其他的请求;D[4:
0]表示接收端,请求可以针对设备、接口或设备的一个端点,当针对一个接口或端点时,wIndex域决定了是哪个接口或端点。
bRequest域表示特定请求,如果bmRequestType域的类型字段为0,可以根据USB指定的一系列的标准请求,结合该域的值,知道这是什么请求。
将在下面介绍这些请求。
wValue域的值根据请求的不同而不同,用来传递一个参数给设备。
wIndex域的值根据请求的不同而不同,用来指定一个接口或端点。
wLength域表示控制传输的数据阶段中传输数据的字节大小,数据传输的方向由bmRequestType域中的D7位决定,如果该域的值为0,表示没有数据阶段。
下面结合实例分别介绍几个主要的设备请求。
(1)清除特性(ClearFeature)
该请求是用来取消一个特性,其格式如下:
bmRequestTypebRequestwValuewIndexwLengthData
00000000B(设备)
00000001B(接口)
00000010B(端点)CLEAR_FEATURE(01H)特性选择0
接口
端点0无
该请求中的wValue表示特性选择器,它对应的值为:
0=端点,1=设备。
当某个特性不允许取消,或该特性根本不存在,或者是指向一个根本不存在的接口或端点时,该请求将会导致设备请求失败。
如果端点被固件设为停止状态,主机软件(总线驱动程序)也可以发送一个值为0的CLEAR_FEATURE命令清除该端点的停止状态,本实例中就是这样使用该请求的。
(2)取得描述符(GetDescriptor)
该请求可以取得USB设备中存在的特定的描述符,其格式如下:
bmRequestTypebRequestwValuewIndexwLengthData
10000000BGET_DESCRIPTOR
(06H)描述符类型与描述符指针0或语言ID描述符的长度各个描述符
该请求中的wValue的高字节表示要取得描述符类型,低字节表示描述符的索引值,描述的类型有:
1表示设备描述符,2表示配置描述符,3表示字符串描述符,4表示接口描述符,5表示端点描述符。
wIndex的值为0或语言ID;当要取得描述符是字符串描述符时,该域的值
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- USB HID 通信协议
![提示](https://static.bdocx.com/images/bang_tan.gif)