[一]、USB(Universal Serial Bus):是通用串行总线的缩写,具有方便易用,动态分配带宽,容错性优越和高性价比等特点。
USB接口设备结构分:USB Host(主机)和USB Device(外部设备)。主机与设备间进行通信,主-主或设备-设备间不可通信。
USB主机功能:验证USB设备是否安装好或拔除;控制USB主机与USB设备间数据通信;返回USB主机所显状态。
USB系统软件分为:主机控制器驱动(HCD:Host control Device )、USB驱动(USBD:USB driver)、主机软件(Host Software)
USB四类传输类型:控制传送(control transaction)、同步传送(isochronous transaction)、中断传送(interrupt transaction)、批传送(bulk transaction)。 (usb 传输类型)
HCD (Host Controller Driver):包含主机控制器和根HUB的硬件为程序员提供了由硬件实现定义的接口主机控制器设备 (HCD)。而实际上它在计算机上就是端口和内存映射。
[二]、标准USB用4芯电缆:
5V电源线(Vbus-红)、差分数据线负(D- )、差分数据线正(D+)、地(GND)、USB OTG增加MINI USB接头,多一根ID标识线用来表明它是主还是从设备。
[三]、USB编码格式:USB所有的传输都由主机主动发起设备被动地应答,使用NRZI编码方式:数据为0时电平翻转,为1时不翻转,连续6个1时强制插入一个0。
完整的D+和D-数据
这样的编码方式若重复相同的“1”信号一直进入时,就会造成数据长时间无法转换,逐渐的积累,会导致接收器最终丢失同步信号,使得读取的时序会发生严重的错误。因此位填充要求数据流中如果有连续的六个“1”就要强行转换。这样接收器在反向不归零码数据流中最多每七个位就检测到一次跳转。这样就保证了接收器与输入数据流保持同步。反向不归零码的发送器要把“0”(填充位)插到数据流中。接收器必须被设计成能够在连续的六个“1”之后识别一个自动跳转,并且立即扔掉这六个“1”之后的“0”位。图16-5的第一行是送到接收器的原始数据。注意数据流包括连续的八个“1”。第二行表示对原始数据进行了位填充,在原始的第六个和第七个“1”之间填入了一个“0”。第七个“1”延时一个位时间让填充位插入。接收器知道连续六个“1”之后将是一个填充位,所以该位就要被忽略。注意,如果原始数据的第七个位是“0”,填充位也同样插入,在填充过的数据流中就会有两个连续的“0”。
小知识:TTL电平规定输出高电平>2.4V,输出低电平<0.4V。室温下一般输出高电平是3.5V,低电平是0.2V。最小输入高电平和低电平:高电平>=2.0V,低电平<=0.8V,噪声容限是0.4V。
RS232电平规定输出高电平+3V~+15V,输出低电平-15V~-3V。
[四]、检测设备连接和速度
在USB设备连接时,USB系统能自动检测到这个连接,并识别出其采用的数据传输速率。USB采用在D+或D-线上增加上拉电阻的方法来识别低速和全速设备。USB支持三种类型的传输速率:1.5Mb/s的低速传输、12Mb/s的全速传输和480Mb/s的高速传输。如图16-6和图16-7所示。
当主控制器或集线器的下行端口上没有USB设备连接时,其D+和D-线上的下拉电阻使得这两条数据线的电压都是近地的(0V);当低速/全速设备连接以后,电流流过由集线器的下拉电阻和设备在D+/D-的上拉电阻构成的分压器。由于下拉电阻的阻值是15KΩ,上拉电阻的阻值是1.5KΩ,所以在D+/D-线上会出现大小为(Vcc*15/(15+1.5))的直流高电平电压。当USB主机探测到D+/D-线的电压已经接近高电平,而其它的线保持接地时,它就知道全速/低速设备已经连接了。高速设备在连接起始时需要以全速速率与主机进行通信,以完成其配置操作,这时需要在D+线上连接1.5KΩ的上拉电阻。当高速设备正常工作时,如果采用高速传输的话,D+线不可上拉;但如果仍采用全速传输,则在D+线上必须使用上拉电阻。所以,为识别出高速设备,需要在上拉电阻和D+线之间连接一个由软件控制的开关,它通常被集成在USB设备接口芯片的内部。
[五]、USB的连接拓扑结构
每个USB主机都会有1个或多个USB的主控制器(Host Controller),主控制器下面接根集线器(Root Hub),该Host控制器和一个根Hub作为一个整体。这个根集线器(Root Hub)下可以接多级的Hub,每个子Hub又可以接子Hub。每个USB作为一个节点接在不同级别的Hub上。
小知识:USB各版本区别版本最大传输速率速率称号最大输出电流协议推出时间:
USB1.0:1.5Mbps(192KB/s) 低速(Low-Speed) 1996年01月
USB1.1:12Mbps(1.5MB/s) 全速(Full-Speed) 1998年09月
USB2.0:480Mbps(60MB/s) 高速(High-Speed) 2000年04月
USB3.0:5Gbps(640MB/s) 超速(Super-Speed) 2008年11月
USB3.1:10Gbps(1280MB/s) 超高速(SuperHigh-Speed) 2013年07月
[六]、几个术语:
①设备: 设备代表一个USB设备,一个USB设备只能有一个设备描述符,用于说明设备的总体信息,并指明其所含的配置的个数。
②配置: 一个USB设备可有一个或多个配置,如低功耗和高功耗模式可分别对应一个配置,每一个配置都必须有一个配置描述符。在使用USB设备前,必须为其选择一个合适的配置。配置描述符用于说明USB设备中各个配置的特性,如配置所含接口的个数等。
③接口: 一个配置可以包含一个或多个接口,每个接口都必须有一个接口描述符。 如对一个光驱来说,当用于文件传输时使用其大容量存储接口,而当用于播放CD时,使用其音频接口。接口描述符用于说明USB设备中各个接口的特性,如接口所属的设备类及其子类等。
④端点: 端点是USB设备中的实际物理单元,USB数据传输就是在主机和USB设备各个端点之间进行的。端点一般由USB接口芯片提供。USB设备中的每一个端点都有唯一的端点号,每个端点所支持的数据传输方向一般而言也是确定的:或是输入(IN)或是输出(OUT),也有些芯片提供的端点的数据方向是可以配置的。利用设备地址、端点号和传输方向就可以指定一个端点,并和它进行通信。端点的传输特性还决定了其与主机通信时所采用的传输类型,如控制端点只能使用控制传输。根据端点的不同用途,可将端点分为两类:0号端点和非0号端点。0号端点比较特殊,它有数据输入IN和数据输出OUT两个物理单元,且只能支持控制传输。所有的USB设备都必须含有一个0号端点,用作缺省控制管道。USB系统软件就是使用该管道和USB逻辑设备进行配置通信的。0号端点在USB设备上电以后就可以使用,而非0号端点必须要在配置以后才可以使用。根据具体应用的需要,USB设备还可以含有多个除0号端点以外的其他端点。对于低速设备,其附加的端点数最多为2个;对于全速/高速设备,其附加的端点数最多为15个。一个系统中可有多个USB设备,一个USB设备中有多个端点。系统用设备地址识别设备,设备用端点号区别端点。主机设置设备的地址,端点号是设备固有的不能被设置。
⑤字符串:在USB设备中通常还含有字符串描述符,以说明一些专用信息,如制造商的名称、设备的序列号等。它的内容以UNICODE的形式给出,且可以被客户软件所读取。对USB设备来说,字符串描述符是可选的。
⑥管道:在USB系统结构中,可以认为数据传输是在主机软件(USB系统软件或客户软件)和USB设备的各个端点之间直接进行的,它们之间的连接称为管道。管道是在USB设备的配置过程中建立的。管道是对主机和USB设备间通信流的抽象,它表示主机的数据缓冲区和USB设备的端点之间存在着逻辑数据传输,而实际的数据传输是由USB总线接口层来完成的。管道和USB设备中的端点一一对应。一个USB设备含有多少个端点,其和主机进行通信时就可以使用多少条管道,且端点的类型决定了管道中数据的传输类型,如中断端点对应中断管道,且该管道只能进行中断传输。传输类型在后面会介绍。不论存在着多少条管道,在各个管道中进行的数据传输都是相互独立的。
USB OTG: On-The-Go的缩写,2001年12月18日由USB Implementers Forum公布,比原来的USB多一个ID脚,用于检测插入的设备是否为主机。当OTG设备检测到接地的ID引脚时,表示默认的是A设备(主机),而检测到ID引脚浮空的设备则认为是B设备(外设)。[rouned evenly:差分走线]
[七]、连接过程
1、设备插入:主机检测到D+和D-间有电压差,则认为有设备插入。主机会等待100ms后发出复位请求,设备接到复位请求后会产生一个外部中断信号。
2、枚举过程:刚插入的设备使用默认地址0,发送get_descriptor(获取设备描述符)指令包,设备收到包后解析(实际上就是设备固件程序里的判断处理),然后按固定格式返回自己设备的描述符。
这一步主要是主机知道你的USB设备的基础属性,比如支持的传输数据长度,电流负荷多少,支持那个USB版本,以及以后方便电脑找驱动的PID,VID。
下一步就是分配设备的通信地址,然后发送get_configuretion(获取设备配置符)指令包,设备按固定格式返回9个字节设备配置字节。然后主机再发送一个获取配置符,设备再把所有的配置符上传给主机。
到上面那步一般的设备都可以开始使用了。
有的设备还要上传字符串描述符
如果是鼠标键盘则还要上传报告描述符
3、数据通信:数据包的传输,令牌包,数据包,握手包
[八]、包
包(Packet)是USB系统中信息传输的基本单元,所有数据都是经过打包后在总线上传输的。首先了解一下包的组成。USB包由五部分组成,基本格式如下:
同步字段(SYNC) | PID字段 | 数据字段 | CRC字段 | 包结尾字段(EOP) |
在USB的数据传输中,所有的传输包都起始于SYNC,接着是PID,然后是数据信息,接下来是校验信息,最后以包结尾作为结束标志。
下面我们将一一介绍每个字段。
1.同步(SYNC)字段 :SYNC字段由8位组成,作为每个数据信息包的前导,用作USB设备与总线的包传输率同步,它的数值固定为00000001。
2.包标识符(PID)字段 :PID字段由8位组成(由4位包类型字段(PID0 PID1 PID2 PID3)和4位校验字段构成),紧随SYNC字段,用作表示数据信息包的类型。PID是USB包类型的唯一标志,USB主机和USB设备在接收到包后,必须首先对包标识符解码得到包的类型,并判断其意义从而做出下一个反应。包标识符中的校验字段是通过对类型字段的每个位求反码产生的,用作对包类型字段进行错误检测。表16-2中列出了信息包的类型,包括令牌、数据、握手或特殊四种信息包类型。为简化对USB的认识,有关高速传输的部分没有在表中列出。
3.数据字段 :在USB包中,数据字段是用来携带主机与设备之间要传递的信息,其内容和长度根据包标识符(PID)、传输类型的不同而各不相同。并非所有的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判断数据包的结束。
[九]、信息包格式
可以分为3种:令牌包、数据包和握手包。令牌包定义数据传输的类型,数据包是传输的数据,握手包指明数据接收是否成功。
Sync是同步数据(相当于说话时先打个招呼,告诉对方要跟他说话了),PID是包标示(告诉对方这个包是干什么用的),ADDR是对方的地址(叫对方的名字),ENDP是用端点几通讯,CRC5是校验位(判断这个包是否在传输中出错),EOP是包结束。
1.令牌(token)包
令牌包格式如下:
8位 | 8位 | 7位 | 4位 | 5位 |
SYNC | PID | ADDR | ENDP | CRC5 |
只有主机才能发出令牌包。令牌包定义数据传输类型,是事务处理的第一阶段。较为重要的是SETUP、IN和OUT这三个令牌包。IN包建立从设备到根集线器的数据传送,OUT包建立从根集线器到设备的数据传输。IN包和OUT包可以对任何设备上的任何端点编址。SETUP包是特殊的OUT包,它是“高优先级”的,设备必须接受它,即使正在进行数据传输操作也要进行响应。SETUP包总指向端点0。
2.数据(data)包
数据包格式如下:
8位 | 8位 | 0~1023字节 | 16位 |
SYNC | PID | DATA | CRC16 |
DATA数据域内所放置的位值,需根据USB设备的传输速度(慢速、高速与全速)以及传输类型(中断传输、批量传输、等时传输)而定,且须以8字节为基本单位。若传输的数据不足8字节或传输到最后所剩余的也不足8字节,仍须传输8字节的数据域。
3.握手(Handshake)包
握手包格式如下:
8位 | 8位 |
SYNC | PID |
握手信息包是最简单的信息包类型。在这个握手信息包仅包含SYNC与PID两个数据域。
[十]、事务
在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.主机->设备(令牌信息包) SYNC IN ADDR ENDP CRC5
2.设备->主机(数据信息包) SYNC DATA0 DATA CRC16
3.主机->设备(握手信息包) SYNC ACK
(2) 设备忙时的输入事务处理
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.主机->设备(令牌信息包) 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 DATA 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
[十一]、USB传输类型:在USB的传输中,制定了4种传输类型:控制传输、中断传输、批量传输以及实时传输。这里只详细介绍控制传输,其他传输类型只作简要说明。
1.控制传输
正确的控制传输是其他传输的前提。由于USB设备的速度、包大小等信息不同,因此每个USB设备内部都记录设备描述符。当主机检测到USB设备时必须先读取设备描述符来确定设备类型和操作特性,然后对设备进行相应的配置,这些都是通过控制传输来完成。每个USB设备都必须实现一个缺省的控制端点-0号端点。
控制传输分为2~3个阶段:设置阶段、数据阶段(无数据控制没有此阶段)和 状态阶段。根据数据阶段的传输的方向可分为3类:控制读取(读取USB描述符)、控制写入(配置USB设备)和无数据控制。
<1>、设置阶段:USB设备在正常使用之前必须先配置,一般会从USB设备获取配置信息后再确定此设备有哪些功能再进行设置。设置阶段由设置事务完成,该阶段包含了SETUP令牌信息包、DATA0数据信息包(该信息包里的数据即为设备请求)和 ACK握手信息包。
<2>、数据传输阶段:用来传输主机与设备之间数据。
控制读取是将USB设备描述符等数据读到主机上。该过程如图16-8所示,主机会发送一个IN令牌信息包,表示要读数据进来,然后设备将数据通过DATA1数据信息包回传给主机,最后主机将以下列方式加以响应:正确接收时主机送出ACK令牌信息包;主机忙碌时发出NAK握手信息包;发生错误时主机发出STALL握手信息包。
控制写入是将USB设备配置信息数据传到设备上。该过程如图16-9所示。主机会送出一个OUT令牌信息包,表示数据要送出去,然后主机将数据通过DATA0数据信息包传递至设备,最后设备将以下列方式加以响应:正确接收时设备送出ACK令牌信息包;设备忙碌时发出NAK握手信息包;发生错误时设备发出STALL握手信息包。
<3>、状态阶段:状态阶段表示传输过程已结束,传输的方向与数据阶段的方向相反:原来IN令牌信息包,现应为OUT令牌信息包,原来OUT令牌信息包,现应为IN令牌信息包。
在状态阶段对于控制读取,主机会送出OUT令牌信息包和0长度的DATA1信息包,此时设备会做出相对应的动作:发送ACK、NAK或STALL握手信息包。
在状态阶段对于控制写入,主机会送出IN令牌信息包,此时设备会送出0长度的DATA1信息包,主机再做出相对应的动作:发送ACK、NAK或STALL握手信息包。
2.实时传输:适用于以固定速率或在指定时刻抵达并容忍偶尔错误的数据上。一般用于麦克风、喇叭等设备。只需令牌与数据两个信息包阶段,没有握手包,传错时不会重传。
3.批量传输:用于传输大量数据,要求传输不能出错,但对时间没有要求,适用于打印机、存储设备等。
4.中断传输:中用于对设备的查询,以确定是否有数据需要传输。中断传输的方向总是从USB设备到主机。
[十二]、枚举
1、描述符
USB描述符详细记录外围设备信。设备描述符、配置描述符、接口描述符和端点描述符,这几个是必须有的。其他描述符,如:字符串描述符、数种不
同的群组描述符以及报告描述符则可以根据不同的设备进行选择。
(1) 设备描述符(DeviceDesc)设备描述符是主机向设备请求的第一个描述符,有18字节。
.byte $12 ; bLength域,表示该描述符的字节长度为18个字节
.byte $01 ; bDescriptorType域描述符类型,1代表设备
.byte $10,$01 ; bcdUSB域表示符合USB 1.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) 配置描述符(ConfigDesc)配置描述符有9字节,针对设备给予配置的信息。
.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域,配置值,作为Set Configuration请求的配置值
.byte $00 ; iConfiguration域,配置的字符串描述符的索引(1字节)
.byte $C0 ; bmAttributes域,配置的属性(自供电,不具有远程唤醒的特征)
.byte $00 ; MaxPower域,表示当USB设备操作时,它从总线上获得的最大电源(以2mA为单位)
(3) 接口描述符(InterfaceDesc:)用来描述每一个设备的接口特性,有9字节。
.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)
.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)
.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
标准描述符结构体
// Standard Device Descriptor
typedef struct
{ BYTE bLength;
BYTE bDescriptorType;
WORD bcdUSB;
BYTE bDeviceClass;
BYTE bDeviceSubClass;
BYTE bDeviceProtocol;
BYTE bMaxPacketSize0;
WORD idVendor;
WORD idProduct;
WORD bcdDevice;
BYTE iManufacturer;
BYTE iProduct;
BYTE iSerialNumber;
BYTE bNumConfigurations;
} sDevDesc, *pDevDesc; // Standard Configuration Descriptor
typedef struct
{
BYTE bLength;
BYTE bType;
WORD wLength;
BYTE bNumIntf;
BYTE bCV;
BYTE bIndex;
BYTE bAttr;
BYTE bMaxPower;
} sCfgDesc, *pCfgDesc; // Standard Interface Descriptor
typedef struct
{ BYTE bLength;
BYTE bType;
BYTE iNum;
BYTE iAltString;
BYTE bEndPoints;
BYTE iClass;
BYTE iSub;
BYTE iProto;
BYTE iIndex;
} sIntfDesc, *pIntfDesc; // Standard EndPoint Descriptor
typedef struct
{ BYTE bLength;
BYTE bType;
BYTE bEPAdd;
BYTE bAttr;
WORD wPayLoad;
BYTE bInterval;
} sEPDesc, *pEPDesc; // Standard String Descriptor
typedef struct
{ BYTE bLength;
BYTE bType;
WORD wLang;
} sStrDesc, *pStrDesc;
有关资料网站收集:
http://www.crifan.com/files/doc/docbook/usb_basic/release/htmls/index.html
http://www.zeroplus.com.tw/E-paper/201112/images/201112-USB20ProtocolAnalyzer.pdf