USB PROTOCOL.docx

上传人:小飞机 文档编号:1938246 上传时间:2022-12-27 格式:DOCX 页数:97 大小:2.75MB
返回 下载 相关 举报
USB PROTOCOL.docx_第1页
第1页 / 共97页
USB PROTOCOL.docx_第2页
第2页 / 共97页
USB PROTOCOL.docx_第3页
第3页 / 共97页
USB PROTOCOL.docx_第4页
第4页 / 共97页
USB PROTOCOL.docx_第5页
第5页 / 共97页
点击查看更多>>
资源描述

《USB PROTOCOL.docx》由会员分享,可在线阅读,更多相关《USB PROTOCOL.docx(97页珍藏版)》请在三一办公上搜索。

1、USB的一些基本概念1. 管道(Pipe) 是主机和设备端点之间数据传输的模型,共有两种类型的管道:无格式的流管道(Stream Pipe)和有格式的信息管道(Message Pipe)。任何USB 设备一旦上电就存在一个信息管道,即默认的控制管道,USB 主机通过该管道来获取设备的描述、配置、状态,并对设备进行配置。2. 端点(Endpoint)是USB 设备中的可以进行数据收发的最小单元,支持单向或者双向的数据传输。设备支持端点的数量是有限制的,除默认端点外低速设备最多支持2 组端点(2 个输入,2 个输出),高速和全速设备最多支持15 组端点。3. 接口(Interface) 。应用软件

2、通过和设备之间的数据交换来完成设备的控制和数据传输。通常需要多个管道来完成数据交换,因为同一管道只支持一种类型的数据传输。用在一起来对设备进行控制的若干管道称为设备的接口.4. 设备和端点之间关系: 一个USB 设备可以包括若干个端点,不同的端点以端点编号和方向区分。不同端点可以支持不同的传输类型、访问间隔以及最大数据包大小。除端点0 外,所有的端点只支持一个方向的数据传输。端点0 是一个特殊的端点,它支持双向的控制传输。管道和端点关联,和关联的端点有相同的属性,如支持的传输类型、最大包长度、传输方向等。5. 描述符(Descriptor) 描述设备的属性(Attributes). 它本身是一

3、个数据结构, 第一个字节表示描述符的大小(字节数), 第二个字节表示描述符的类型(Type). 描述符的种类有:1) 设备描述符(Device), 描述一个设备的一般信息.2) 设备修饰描述符(Device_Qualifier), 描述一个高速设备在其它速度下该如何变化的信息.3) 配置描述符(Configuration), 描述一个特定的设备配置, 如接口的数目等. 一个USB设备有一个或多个配置描述符. 每个配置有一个或多个接口并且每个接口有0个或多个端点.4) 其它速度配置描述符(Other_speed_configuration), 描述高速设备在其它可能的速度下的一个配置.5) 接口

4、描述符(Interface), 描述一种配置中的一个特定的接口. 6) 端点描述符(Endpoint), 描述主机需要的去决定端点所需带宽的信息. 这个描述符只能附加在GetDescriptor()或GetDescriptor()请求中传送, 不能单独传送. 端点0没有此描述符.7) 字符串描述符(String), 第0个字符串描述符指定设备支持的语言, 其它的描述符则各包含一个UNICODE字符串. 设备描述符, 配置描述符 和 接口描述符可能会包含字符串描述符.6. USB设备请求(USB Device Request) 请求是从主机通过控制管道发送到设备. 标准的设备请求有:1) Cle

5、ar Feature2) Get Configuration3) Get Descriptor4) Get Interface5) Get Status6) Set Address7) Set Configuration8) Set Descriptor9) Set Feature10) Set Interface11) Synch FrameUSB3.0系统拓扑结构系统是最多只能有7层的树状结构最多只能支持127个设备和HubHost+RootHub永远是在第一层复合(Compound)设备一般占两层功能设备不能作为非叶节点, 只有Hub才可以USB3.0 Hub其实包含了一个USB2的Hu

6、b和一个SuperSpeed HubUSB3.0的重要特性: 1. 增加了一个重要的数据传输速率2. 点对点方式传输包, 使活动链路数目达到最少3. 异步方式的通知功能, 去除了轮询方式的必要4. 基于链路级的电源管理, 这是总线结构的基础设计5. 向后兼容USB2.0, 驱动级和物理层级别上都达到了兼容的目的USB3.0与USB2.0的区别1. 数据传输速率, 3.0是SuperSpeed 5.0Gbps, 2.0是 1.5Mbps, 12Mbps或480Mbps2. 数据接口, 3.0是全双工,独立于USB 2.0信号的四路差分信号,支持同时双向数据传输2.0是半双工,双路差分信号, 单向

7、数据传输, 需要事先协商好总路线的传输方向3. 信号线数目, 3.0是4路SuperSpeed数据线, 2路HighSpeed数据线和2路电源及地线2.0是2路LS/FS/HS数据线, 2路电源及地线4. 总线事务协议, 3.0是主机主导的异步方式的传输流量控制, 包传输是能显式地进行路由2.0是主机主导的轮询方式的传输流量控制, 包传输是通过广播方式到所有设备5. 电源管理, 3.0是多级别的链路电源管理, 支持Idle, sleep和suspend状态2.0是在端口级进行管理, 可以在entry/exit上有两种级别的挂机状态6. 总线电源, 3.0是和USB 2.0差不多, 只是未配置的

8、电源有50%的增幅, 已配置的电源有80%的增幅7. 主机控制器,3.0用的是xHCI,2.0则是EHCI。xHCI中提供了虚拟化技术支持。USB3.0电源状态1. U0, Link active2. U1, Link idle - fast exit. 退出延时us级3. U2, Link idle - slow exit. 退出延时us-ms级4. U3, Link suspend. 无时钟信号, 退出延时us-ms级USB3.0数据包类型1. Link Management Packets, 链路管理包, 仅发生在两个相连的端口之间,主要是用来进行链路管理2. Transaction P

9、ackets, 事务包, 发生在设备和主机之间, 用来控制数据包的流量, 配置设备和Hubs. 它没有数据3. Data Packets, 数据包, 发生在设备和主机之间. 它包括两部分:包头和实际数据. 其中数据部分还包括一个32位的CRC校验码来保证数据的完整性.4. Isochronous Timestamp Packets, 同步时间戳包, 它是唯一的多播方式发送的. 发送方向是从主机到所有U0状态的设备.USB传输类型1. 控制传输(Control Transfers)控制传输是一种可靠的双向传输,一次控制传输可分为三个阶段。第一阶段为从HOST 到Device 的SETUP 事务传

10、输,这个阶段指定了此次控制传输的请求类型;第二阶段为数据阶段,也有些请求没有数据阶段;第三阶段为状态阶段,通过一次IN/OUT 传输表明请求是否成功完成。控制传输通过控制管道在应用软件和Device 的控制端点之间进行,控制传输过程中传输的数据是有格式定义的,USB 设备或主机可根据格式定义解析获得的数据含义。其他三种传输类型都没有格式定义。控制传输对于最大包长度有固定的要求。对于高速设备该值为64Byte;对于低速设备该值为8;全速设备可以是8 或16 或32 或64。2. 批量传输(Bulk Transfers)批量传输是一种可靠的单向传输,但延迟没有保证,它尽量利用可以利用的带宽来完成传

11、输,适合数据量比较大的传输。低速USB 设备不支持批量传输,高速批量端点的最大包长度为512,全速批量端点的最大包长度可以为8、16、32、64。批量传输在访问USB 总线时,相对其他传输类型具有最低的优先级,USB HOST 总是优先安排其他类型的传输,当总线带宽有富余时才安排批量传输。高速的批量端点必须支持PING 操作,向主机报告端点的状态,NYET 表示否定应答,没有准备好接收下一个数据包,ACK 表示肯定应答,已经准备好接收下一个数据包。3. 中断传输(Interrupt Transfers)中断传输是一种轮询的传输方式,是一种单向的传输,HOST 通过固定的间隔对中断端点进行查询,

12、若有数据传输或可以接收数据则返回数据或发送数据,否则返回NAK,表示尚未准备好。中断传输的延迟有保证,但并非实时传输,它是一种延迟有限的可靠传输,支持错误重传。对于高速/全速/低速端点,最大包长度分别可以达到1024/64/8 Bytes。高速中断传输不得占用超过80%的微帧时间,全速和低速不得超过90%。中断端点的轮询间隔由在端点描述符中定义,全速端点的轮询间隔可以是1255mS,低速端点为10255mS,高速端点为(2interval-1)*125uS,其中interval 取1到16 之间的值。除高速高带宽中断端点外,一个微帧内仅允许一次中断事务传输,高速高带宽端点最多可以在一个微帧内进

13、行三次中断事务传输,传输高达3072 字节的数据。4. 同步传输(Isochronous Transfers)同步传输是一种实时的、不可靠的传输,不支持错误重发机制。只有高速和全速端点支持同步传输,高速同步端点的最大包长度为1024,低速的为1023。除高速高带宽同步端点外,一个微帧内仅允许一次同步事务传输,高速高带宽端点最多可以在一个微帧内进行三次同步事务传输,传输高达3072 字节的数据。全速同步传输不得占用超过80%的帧时间,高速同步传输不得占用超过90%的微帧时间。同步端点的访问也和中断端点一样,有固定的时间间隔限制。在主机控制器和USB HUB 之间还有另外一种传输分离传输(Spli

14、t Transaction),它仅在主机控制器和HUB 之间执行,通过分离传输,可以允许全速/低速设备连接到高速主机。分离传输对于USB 设备来说是透明的、不可见的。USB协议中的基本概念2010年08月15日 星期日 23:051、端点,位于USB设备或主机上的一个数据缓冲区,用来存放和发送USB的各种数据,每一个端点都有惟一的确定地址,有不同的传输特性(如输入端点、输出端点、配置端点、批量传输端点)。2、帧,时间概念,在USB中,一帧就是1mS,它是一个独立的单元,包含了一系列总线动作,USB将1帧分为好几份,每一份中是一个USB的传输动作。3、上行、下行:设备到主机为上行,主机到设备为下

15、行。 一条USB的传输线分别由地线、电源线、D+、D-四条线构成,D+和D-是差分输入线,它使用的是3.3V的电压(注意哦,与CMOS的5V电平不同),而电源线和地线可向设备提供5V电压,最大电流为500mA(可以在编程中设置的,至于硬件的实现机制,就不要管它了)。 数据在USB线里传送是由低位到高位发送的。 USB数据是由二进制数字串构成的,首先数字串构成域(有七种),域再构成包,包再构成事务(IN、OUT、SETUP),事务最后构成传输(中断传输、并行传输、批量传输和控制传输)。下面简单介绍一下域、包、事务、传输,请注意他们之间的关系。一、 域是USB数据最小的单位,由若干位组成(至于是多

16、少位由具体的域决定),域可分为七个类型:1、同步域(SYNC):八位,值固定为0000 0001,用于本地时钟与输入同步;2、标识域(PID):由四位标识符+四位标识符反码构成,表明包的类型和格式;3、地址域(ADDR):七位地址,代表了设备在主机上的地址,地址000 0000被命名为零地址,是任何一个设备第一次连接到主机时,在被主机配置、枚举前的默认地址;4、端点域(ENDP):四位,由此可知一个USB设备有的端点数量最大为16个;5、帧号域(FRAM):11位,每一个帧都有一个特定的帧号,帧号域最大容量0x800;6、数据域(DATA):长度为01023字节,在不同的传输类型中,数据域的长

17、度各不相同,但必须为整数个字节的长度;7、校验域(CRC),对令牌包和数据包中非PID域进行校验的一种方法。二、包由域构成,有四种类型,分别是令牌包、数据包、握手包和特殊包,前面三种是重要的包,不同的包的域结构不同,介绍如下:包可分为输入包、输出包、设置包和帧起始包(注意这里的输入包是用于设置输入命令的,输出包是用来设置输出命令的,而不是放据数的),其中输入包、输出包和设置包的格式都是一样的:SYNC+PID+ADDR+ENDP+CRC5(五位的校验码)。1、帧起始包的格式:SYNC+PID+11位FRAM+CRC5(五位的校验码)。2、数据包:分为DATA0包和DATA1包,当USB发送数据

18、的时候,当一次发送的数据长度大于相应端点的容量时,就需要把数据包分为好几个包,分批发送,DATA0包和DATA1包交替发送,即如果第一个数据包是DATA0,那第二个数据包就是DATA1。但也有例外情况,在同步传输中(四类传输类型中之一),所有的数据包都是为DATA0,格式如为:SYNC+PID+01023字节+CRC16 。3、握手包:结构最为简单的包,格式如为:SYNC+PID 。三、事务分为IN事务、OUT事务和SETUP事务三大事务,每一种事务都由令牌包、数据包、握手包构成,每个包的发送有一定的时间先后顺序,因此事务分为三个阶段:1、令牌包阶段:启动一个输入、输出或设置的事务;2、数据包

19、阶段:按输入、输出发送相应的数据;3、握手包阶段:返回数据接收情况,在同步传输的IN和OUT事务中没有这个阶段,这是比较特殊的。 IN事务令牌包阶段:主机发送一个PID为IN的输入包给设备,通知设备要往主机发送数据;数据包阶段:设备根据情况会作出三种应答:(要注意:数据包阶段也不总是传送数据的,根据传输情况还会提前进入握手包阶段) A、设备端点正常,设备往主机里面发出数据包(DATA0与DATA1交替); B、设备正在忙,无法往主机发出数据包就发送NAK无效包,IN事务提前结束; C、相应设备端点被禁止,发送错误包STALL包,事务也就提前结束了,总线进入空闲状态。握手包阶段:主机正确接收到数

20、据之后就会向设备发送ACK包。 OUT事务令牌包阶段:主机发送一个PID为OUT的输出包给设备,通知设备要接收数据;数据包阶段:比较简单,就是主机会设备送数据,DATA0与DATA1交替;握手包阶段:设备根据情况会作出三种反应: A、设备端点接收正确,设备往主机返回ACK,通知主机可以发送新的数据,如果数据包发生了CRC校验错误,将不返回任何握手信息; B、设备正在忙,无法往主机发出数据包就发送NAK无效包,通知主机再次发送数据; C、相应设备端点被禁止,发送错误包STALL包,事务提前结束,总线直接进入空闲状态。 SETUT事务 A、令牌包阶段:主机发送一个PID为SETUP的输出包给设备,

21、通知设备要接收数据; B、数据包阶段:比较简单,就是主机会设备送数据,注意,这里只有一个固定为8个字节的DATA0包,这8个字节的内容就是标准的USB设备请求命令,共有11条; C、握手包阶段:设备接收到主机的命令信息后,返回ACK,此后总线进入空闲状态,并准备下一个传输(在SETUP事务后通常是一个IN或OUT事务构成的传输)。四、传输:传输由OUT、IN、SETUP事务其中的事务构成,传输有四种类型:中断传输、批量传输、同步传输、控制传输,中断传输和批量转输的结构一样,同步传输有最简单的结构,而控制传输是最重要的也是最复杂的传输。1、中断传输:由OUT事务和IN事务构成,用于键盘、鼠标等H

22、ID设备的数据传输中。2、批量传输:由OUT事务和IN事务构成,用于大容量数据传输,没有固定的传输速率,也不占用带宽,当总线忙时,USB会优先进行其他类型的数据传输,而暂时停止批量转输。3、同步传输:由OUT事务和IN事务构成,有两个特殊地方,第一,在同步传输的IN和OUT事务中是没有返回包阶段的;第二,在数据包阶段所有的数据包都为DATA0 。4、控制传输:最重要的也是最复杂的传输,控制传输由三个阶段构成(初始设置阶段、可选数据阶段、状态信息步骤),每一个阶段可以看成一个的传输,控制传输其实是由三个传输构成的,用来于USB设备初次加接到主机之后,主机通过控制传输来交换信息,设备地址和读取设备

23、的描述符,使得主机识别设备,并安装相应的驱动程序,这是每一个USB开发者都要关心的问题。 初始设置:就是一个由SET事务构成的传输。 可选数据:就是一个由IN或OUT事务构成的传输,这个步骤是可选的,要看初始设置步骤有没有要求读/写数据(由SET事务的数据包阶段发送的标准请求命令决定)。 状态信息:获取状态信息,由IN或OUT事务构成的传输,但是要注意这里的IN和OUT事务和之前的INT和OUT事务有两点不同: A、传输方向相反,通常IN表示设备往主机送数据,OUT表示主机往设备送数据;在这里,IN表示主机往设备送数据,而OUT表示设备往主机送数据。 B、在这个里,数据包阶段的数据包都是0长度

24、的,即SYNC+PID+CRC16 总结:USB的最小单元是“域”,由“域”构成了“包”,在由“包”构成了“事务”,最后由“事务”构成了“传输”,在应用层面,我们看到的只是传输,所以USB协议栈就需要完成传输以下的所有事情。这对标准的USB协议栈提出了最基本的要求。USB协议2010-05-04 20:04一 枚举过程: 用户将一个USB设备插入USB端口,主机为端口供电,设备此时处于上电状态。主机检测设备。集线器使用中断通道将事件报告给主机。主机发送Get_Port_Status(读端口状态)请求,以获取更多的设备信息。集线器检测设备是低速运行还是高速运行,并将此信息送给主机,这是对Get_

25、Port_Status请求的响应。主机发送Set_Port_Feature(写端口状态)请求给集线器,要求它复位端口。集线器对设备复位。主机使用Chirp K信号来了解全速设备是否支持高速运行。主机发送另一个Get_Port_Status请求,确定设备是否已经从复位状态退出。设备此时处于缺省状态,且已准备好在零端点通过缺省通道响应主机控制传输。缺省地址为00h,设备能从总线获取高达100mA的电流。主机发送Get_Deor(读设备描述符)报文,以便确定最大数据包大小。设备描述符的八个字节是bMaxPacketSize。通过发送Set_Address(写地址)请求,主机分配地址,设备此时处于地址

26、状态。主机发送Get_Deor报文,以获取更多的设备信息。主机通过发送描述符响应设备请求,随后发送全部的次级描述符。主机分配并加载设备驱动程序。通过发送Set_Configuration(写配置)请求,主机的设备驱动程序选择一个有效配置,设备此时处于配置状态。主机为复合设备接口分配驱动程序。如果集线器检测到有过流现象,或者主机要求集线器关闭电源,则USB总线切断设备供电电源。在这种情况下,设备与主机无法通信,但设备处于连接状态。如果在3毫秒内设备在总线上未见任何动作,则它将进入挂起状态,在挂起状态设备消耗的总线电能最少。还有一个差不多,如下:1)集线器检测新设备主机集线器监视着每个端口的信号电

27、压,当有新设备接入时便可觉察。(集线器端口的两根信号线的每一根都有15k的下拉电阻,而每一个设备在D+都有一个1.5k的上拉电阻。当用USB线将PC和设备接通后,设备的上拉电阻使信号线的电位升高,因此被主机集线器检测到。)(2)主机知道了新设备连接后每个集线器用中断传输来报告在集线器上的事件。当主机知道了这个事件,它给集线器发送一个Get_Status请求来了解更多的消息。返回的消息告诉主机一个设备是什么时候连接的。(3)集线器重新设置这个新设备当主机知道有一个新的设备时,主机给集线器发送一个Set_Feature请求,请求集线器来重新设置端口。集线器使得设备的USB数据线处于重启(RESET

28、)状态至少10ms。(4)集线器在设备和主机之间建立一个信号通路主机发送一个Get_Status请求来验证设备是否激起重启状态。返回的数据有一位表示设备仍然处于重启状态。当集线器释放了重启状态,设备就处于默认状态了,即设备已经准备好通过Endpoint 0 的默认流程响应控制传输。即设备现在使用默认地址0x0与主机通信。(5)集线器检测设备速度 集线器通过测定那根信号线(D+或D-)在空闲时有更高的电压来检测设备是低速设备还是全速设备。(全速和高速设备D+有上拉电阻,低速设备D-有上拉电阻)。以下,需要USB的firmware进行干预(6)获取最大数据包长度 PC向address 0发送USB

29、协议规定的Get_Device_Deor命令,以取得却缺省控制管道所支持的最大数据包长度,并在有限的时间内等待USB设备的响应,该长度包含在设备描述符的bMaxPacketSize0字段中,其地址偏移量为7,所以这时主机只需读取该描述符的前8个字节。注意,主机一次只能列举一个USB设备,所以同一时刻只能有一个USB设备使用缺省地址0。以下操作雷同,不同操作系统设定时延是不一样的,比如说win2k大概是几毫秒,如果没有反应就再发送一次命令,重复三次。 (7)主机分配一个新的地址给设备主机通过发送一个Set_Address请求来分配一个唯一的地址给设备。设备读取这个请求,返回一个确认,并保存新的地

30、址。从此开始所有通信都使用这个新地址。(8)主机向新地址重新发送Get_Device_Deor命令,此次读取其设备描述符的全部字段,以了解该设备的总体信息,如VID,PID。(9)主机向设备循环发送Get_Device_Configuration命令,要求USB设备回答,以读取全部配置信息。(10)主机发送Get_Device_String命令,获得字符集描述(unicode),比如产商、产品描述、型号等等。(11)此时主机将会弹出窗口,展示发现新设备的信息,产商、产品描述、型号等。(12)根据Device_Deor和Device_Configuration应答,PC判断是否能够提供USB的D

31、river,一般win2k能提供几大类的设备,如游戏操作杆、存储、打印机、扫描仪等,操作就在后台运行。但是Win98却不可以,所以在此时将会弹出对话框,索要USB的Driver。(13)加载了USB设备驱动以后,主机发送Set_Configuration(x)命令请求为该设备选择一个合适的配置(x代表非0的配置值)。如果配置成功,USB设备进入“配置”状态,并可以和客户软件进行数据传输。此时,常规的USB完成了其必须进行的配置和连接工作。查看注册表,能够发现相应的项目已经添加完毕,至此设备应当可以开始使用。不过,USB协议还提供了一些用户可选的协议,设备如果不应答,也不会出错,但是会影响到系统

32、的功能。 1.当主机用轮询的方式检测到USB端口有新的设备插入时,主机就会给HUB发送总线复位命令,要求HUB进行总线复位。 设备连接到主机并初始化完成(Softconnect 位被设置为 1),主机检测到D+与D-之间有电压差,就认为有新的设置接入。主机等待100ms后发出复位请求。设备接到复位请求后将产生一个外部中断信号。 2.主机使用默认地址0,来读取设备的描述符。 发送 Get_descriptor标准请求。主机向D12发送一个八字节请求:80 06 00 01 00 00 40 00 D12接收到请求后产生一个中断,我们可以通过读中断寄存器知道中断源,并且可以加读最后状态寄存器来确定

33、第一个接到的包是否为一个Setup包。当控制器处理程序判断出它是一个Get_descriptor请求是,把设备描述符的前16个字节发送到端点0缓冲区中。剩下的2个字节描述符第一次请求时不再发送。 3.主机给设备分配一个地址 当主机收到正确的前16字节描述符后,会给设备分配一个地址,我的PC分配的地址为:0x03(这个要看你的机子当时的USB接口设备数目而定) Set_Address 请求所发送的数据为:00 05 03 00 00 00 00 00 ,其中的03就表示主机为设备分配的地址为0x03,在以后的通信里设备就只对0x03地址作出应答。当D12产生一个接收中断后,跟据所分配的地址设置D

34、12的地址寄存器相应位 4.主机以地址0x03 ,重新请求设备描述符 主机发送设备描述符标准请求Get_descriptor :80 06 00 01 00 00 12 00 此次将要求把18个字节全部发送完。所以主机要分两次来读取。第一次发送16个字节,第三次发送两个字节,最后主机发送0表示发送完毕的应答。 5.主机发送Get_configuration请求 由于事先没有知道描述符的长度,所以先以0xff的长度进行请求。其数据为:80 06 00 02 00 00 FF 00 我用的是周立功公司卖的D12开发板光盘资料中提供的驱动程序,发送的应答是一个描述集合其结构如下:typedef st

35、ruct USB_DESCRIPTOR USB_CONFIGURATION_DESCRIPTOR ConfigDescr; /配置描述符 USB_INTERFACE_DESCRIPTOR InterfaceDescr; /接口描述符 USB_ENDPOINT_DESCRIPTOR EP1_TXDescr; /端点1输入描述符 USB_ENDPOINT_DESCRIPTOR EP1_RXDescr; /端点1输出描述符 USB_ENDPOINT_DESCRIPTOR EP2_TXDescr; /端点2输入描述符 USB_ENDPOINT_DESCRIPTOR EP2_RXDescr; /端点2输

36、出描述符 USB_DESCRIPTOR, *PUSB_DESCRIPTOR; 6.Set_Conficuration 当读取完成描述符之后,需要对设备进行配置,使得设备从地址状态进入配置状态。这个在写固件的时候可以提高运行效率。 7.读取配置状态。 8.当主机能正确地收到这些数据之后,就可以加载D12的驱动程序。这时就可能作应用中的数据传输了。 使用USB View 采集到的数据:Device Descriptor:bcdUSB: 0x0100bDeviceClass: 0xDCbDeviceSubClass: 0x00bDeviceProtocol: 0x00bMaxPacketSize0:

37、 0x10 (16)idVendor: 0x0471idProduct: 0x0666bcdDevice: 0x0100iManufacturer: 0x00iProduct: 0x00iSerialNumber: 0x00bNumConfigurations: 0x01ConnectionStatus: DeviceConnectedCurrent Config Value: 0x01Device Bus Speed: FullDevice Address: 0x02Open Pipes: 4Endpoint Descriptor:bEndpointAddress: 0x81Transfer

38、 Type: InterruptwMaxPacketSize: 0x0010 (16)bInterval: 0x0AEndpoint Descriptor:bEndpointAddress: 0x01Transfer Type: InterruptwMaxPacketSize: 0x0010 (16)bInterval: 0x0AEndpoint Descriptor:bEndpointAddress: 0x82Transfer Type: BulkwMaxPacketSize: 0x0040 (64)bInterval: 0x0AEndpoint Descriptor:bEndpointAd

39、dress: 0x02Transfer Type: BulkwMaxPacketSize: 0x0040 (64)bInterval: 0x0A 参考资料:PDIUSBD12 USB固件编程和驱动开发 驱动开发网USB 基本知识USB的重要关键字:1、端点:位于USB设备或主机上的一个数据缓冲区,用来存放和发送USB的各种数据,每一个端点都有惟一的确定地址,有不同的传输特性(如输入端点、输出端点、配置端点、批量传输端点)2、帧:时间概念,在USB中,一帧就是1MS,它是一个独立的单元,包含了一系列总线动作,USB将1帧分为好几份,每一份中是一个USB的传输动作。3、上行、下行:设备到主机为上行

40、,主机到设备为下行下面以一问一答的形式开始学习吧。问题一:USB的传输线结构是如何的呢?答案一:一条USB的传输线分别由地线、电源线、D+、D-四条线构成,D+和D-是差分输入线,它使用的是3.3V的电压(注意哦,与CMOS的5V电平不同),而电源线和地线可向设备提供5V电压,最大电流为500MA(可以在编程中设置的,至于硬件的实现机制,就不要管它了)。问题二:数据是如何在USB传输线里面传送的答案二:数据在USB线里传送是由低位到高位发送的。问题三:USB的编码方案?答案三:USB采用不归零取反来传输数据,当传输线上的差分数据输入0时就取反,输入1时就保持原值,为了确保信号发送的准确性,当在

41、USB总线上发送一个包时,传输设备就要进行位插入操作(即在数据流中每连续6个1后就插入一个0),从而强迫NRZI码发生变化。这个了解就行了,这些是由专门硬件处理的。问题四:USB的数据格式是怎么样的呢?答案四:和其他的一样,USB数据是由二进制数字串构成的,首先数字串构成域(有七种),域再构成包,包再构成事务(IN、OUT、SETUP),事务最后构成传输(中断传输、并行传输、批量传输和控制传输)。下面简单介绍一下域、包、事务、传输,请注意他们之间的关系。(一)域:是USB数据最小的单位,由若干位组成(至于是多少位由具体的域决定),域可分为七个类型:1、同步域(SYNC),八位,值固定为0000

42、 0001,用于本地时钟与输入同步2、标识域(PID),由四位标识符+四位标识符反码构成,表明包的类型和格式,这是一个很重要的部分,这里可以计算出,USB的标识码有16种,具体分类请看问题五。3、地址域(ADDR):七位地址,代表了设备在主机上的地址,地址000 0000被命名为零地址,是任何一个设备第一次连接到主机时,在被主机配置、枚举前的默认地址,由此可以知道为什么一个USB主机只能接127个设备的原因。4、端点域(ENDP),四位,由此可知一个USB设备有的端点数量最大为16个。5、帧号域(FRAM),11位,每一个帧都有一个特定的帧号,帧号域最大容量0x800,对于同步传输有重要意义(

43、同步传输为四种传输类型之一,请看下面)。6、数据域(DATA):长度为01023字节,在不同的传输类型中,数据域的长度各不相同,但必须为整数个字节的长度7、校验域(CRC):对令牌包和数据包(对于包的分类请看下面)中非PID域进行校验的一种方法,CRC校验在通讯中应用很泛,是一种很好的校验方法,至于具体的校验方法这里就不多说,请查阅相关资料,只须注意CRC码的除法是模2运算,不同于10进制中的除法。(二)包:由域构成的包有四种类型,分别是令牌包、数据包、握手包和特殊包,前面三种是重要的包,不同的包的域结构不同,介绍如下1、令牌包:可分为输入包、输出包、设置包和帧起始包(注意这里的输入包是用于设

44、置输入命令的,输出包是用来设置输出命令的,而不是放据数的)其中输入包、输出包和设置包的格式都是一样的:SYNC+PID+ADDR+ENDP+CRC5(五位的校验码)(上面的缩写解释请看上面域的介绍,PID码的具体定义请看问题五)帧起始包的格式:SYNC+PID+11位FRAM+CRC5(五位的校验码)2、数据包:分为DATA0包和DATA1包,当USB发送数据的时候,当一次发送的数据长度大于相应端点的容量时,就需要把数据包分为好几个包,分批发送,DATA0包和DATA1包交替发送,即如果第一个数据包是DATA0,那第二个数据包就是DATA1。但也有例外情况,在同步传输中(四类传输类型中之一),所有的数据包都是为DATA0,格式如下:SYNC+PID+01023字节+CRC163、握手包:结构最为简单的包,格式如下SYNC+PID(注上面每种包都有不同类型的,USB1.1共定义了十种包,具体请见问题五)(三)事务:分别有IN事务、OUT事务和SETUP事务三大事务,每一种事务都由令牌包、数据包、握手包三个阶段构成,这里用阶段的意思是因为这些包的发送是有一定的时间先后顺序的,事务的三个阶段如下:1、令牌包阶段:启动一个输入、输出或设置的事务2、数据包阶段:按输入、输出发送相应的数据

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号