USB包类型和传输过程 

USB是一种串行总线,因此数据都是一位一位传输的,如同串口那样,但是USB在真实物理电路上却不是TTL电平,而是一种差分信号采用NRZI编码,就是用变化表示0,不变表示1,同时在USB中数据时低字节先发送的即LSB。USB中的数据交互最小单位是包一个包由许多域组成,但是统一的是每个包都有同步域开始,然后紧接着PID,这里的PID不是指PID,而是指类似包命令码这么一个意思。PID只用到了低四位,高四位是低四位的取反用于校验PID字段,常见的PID由USB标准中查到如下,其中*号标识的是USB1.1中没有的:

有表中可以看到USB包分为16种四类,现在先以令牌包的格式介绍包格式。记住一个概念,USB中主机占主导地位,因此输入输出都是在主机角度来说的。

令牌包:

输出(OUT),输入(IN),建立令牌包(SETUP)包结构:

同步域 8位包标识PID 7位地址 4位端点号 5位CRC5校验 EOP

SOF同步包,这个包是主机和所有从设备之间同步的特殊包,因此它是广播的,结构也就比较特殊。

同步域 8位标识PID 11位帧号 5位CRC5校验 EOP

数据包:

数据包都具有同样的结构,一个同步域后面直接跟PID加上数据,最后是CRC校验,同样所有的CRC校验都是从PID字节之后的部分,最后是包结束符EOP。

同步域 8位包标识PID 字节0 字节1 ...... 16位CRC16校验 EOP

主机和设备之间会维护一个数据包类型切换机制用于错误恢复。假如主机发送数据给设备,但是设备的ACK包在传输中被破坏了,所以主机就不知道对方是否收到了数据,主机就会保持自己的数据包类型不变,但是如果下一次设备使用数据包类型和自己不同给自己发数据了,主机就知道上一次丢失ACK那次的传输实际上是成功的。反之就是失败了。

握手包:

ACK :用来确认数据接收正确,这一部分常常有USB物理层自动完成;

NCK:表示没有数据返回,常常是主机查询设备有无数据返回时由设备返回,主机不允许使用NCK应答(猜猜为什么);

STALL:设备无法执行一个请求,或者是端点已经挂起了时,设备会返回STALL;这种情况下需要主机干预才能解除STALL状态。

NYET:只在USB2.0高速事物中使用,表示本次数据接收成功,但是没有足够的空间来接收下一数据,下一次数据传输前主机需要先发送PING探查设备状态,确认可以接收数据。

特殊包:

特殊包是在一些特殊场合使用的包,主要有三个:ERR,SPLIT、PING。

PING:用在高速设备中,主机询问设备是否可以接收数据,设备如果有足够的空间接收数据则会用ACK握手包回应主机。

PRE:只用在高速模式中,作为前导包通知集线器打开,低速端口,因为集线器在平常情况下,防止高速信号导致低速设备误动作,集线器是没有将高速信号传递给速速设备的。

ERR:用在高速事物中的SPLIT令牌包分裂错误指示。

USB定义了这么多的数据包,但是还是不能直接用这些包就开始数据传输了,这里是USB的一个概念,USB的数据交换都是主机首先发起的,所以的引入了USB事物的概念USB事物通常都是有两个或者三个数据包组成的。令牌包有主机发送启动一个事物,然后主机发送数据包,最后由设备ACK应答。由此USB定义了四种传输类型,每种类型里包含多种USB事务。

批量传输类型

批量输出事务:首先主机发送OUT包告诉设备,我将要输出数据到你,同时在OUT包中指示了设备地址和端口号,然后接着在总线上发送数据包,设备的对应端点会接收下数据包,如果校验完CRC没有问题,则设备会用握手包ACK回应主机,如果数据出错设备什么都不会发送,主机就会自动超时。这里出错主要有两种情况,一种是令牌包出错,另一种情况时数据包出错。

批量输入事务:主机发送IN输入数据包到设备,如果设备有数据要发送就会将数据放到总线上,主机接收数据检验无错误就回应ACK给设备;如果设备无数据或挂起就会用NCK或者STALL回应主机。

PING:是在高速模式里才有的,没有数据过程,主机发送,从机可以接收数据就用ACK回应,否则回应对应的拒绝代码或不回应(令牌包错)。

中断传输类型

中断传输类型,除了数据输入的查询策略,和没有PING事物以外其他的全部同批量事物。常用在数据量不大,但是对时间要求严格的设备中。如人机接口设备的键盘鼠标。

等时传输类型

适用于数据量大,对实时性要求高,但是对数据的正确性要求不是也别严格的场合。因此常用于音频等类似设备中。事物流程图如下:

控制传输类型

控制传输类型是所有里面最复杂额,因为他为了保证数据的传输正确性,同时还是一个综合的过程。控制传输主要有三个过程组成建立过程,数据过程,状态过程。

建立过程:使用建立事物,主机发送SETUP令牌包,然后发送主机数据(DATA0)到设备,设备接收到数据并且回应ACK(必须的)后开始处理。(实际上是一个批量输出的过程)

数据过程(可选):如果上面的建立过程有数据要设备返回设备此时就会将数据在这个过程返回给主机。这个过程可能包含多次数据输入传输,有主机根据控制协议决定。数据过程实际是批量数据输入/出的过程。

状态过程:

实际还是一个批量事物,它的传输方向同数据过程相反,是一个数据为0的批量事物。也可以理解,控制事物实际是批量过程的一个更高层次的应用。因为控制传输过程中的每一次数据传输都是一个批量传输的过程。

控制过程例子:

建立过程

主机 --->设备   OUT +     DATA    

设备 --->主机    ACK

数据过程(可能有多次,但方向一定是同样的)

主句 --->设备   IN

设备 --->主机  DATA 

主机 --->设备 ACK

状态过程

主机 --->设备  OUT(因为上面是IN)

设备 --->主机 DATA

主机 --->设备 ACK

完了结束。

以上内容就是USB协议的全部概念的东西和通信过程,目前的理解,如果不对欢迎大佬纠正。

今天就这样了

参考:《圈圈教你玩USB(第二版)》

2019-06-03  21:16:32

USB2.0协议学习笔记---USB数据包结构的更多相关文章

  1. USB2.0协议学习笔记---USB工作过程(类的方法)

    前面学习了那么多的概念,这里需要记住一点分层概念即设备 ---> 配置 ---> 接口 ---> 端点,这种分层的概念结构 . 也可以理解为端点构成接口,接口组成配置,配置组成设备. ...

  2. USB2.0协议学习笔记---描述符

     USB设备描述符 字段名 长  度(字节)  地址偏移 含           义 bLenth   1  0  描述符长度 bDescriptorType   1  1 描述符类型 (这里为 1) ...

  3. USB2.0协议学习笔记---基本概念

    概念  USB是一种串行通信总线(Universal Serial Bus),经历的版本有USB1.0,USB1.1.USB2.0等.USB是一种主从模式的结构,因此它无法在设备与设备.主机与主机之间 ...

  4. MQTT协议-MQTT协议解析(MQTT数据包结构)

    协议就是通信双方的一个约定,即,表示第1位传输的什么.第2位传输的什么…….在MQTT协议中,一个MQTT数据包由:固定头(Fixed header). 可变头(Variable header). 消 ...

  5. 接口与协议学习笔记-USB协议_USB2.0_USB3.0不同版本(三)

    USB(Universal Serial Bus)全称通用串口总线,USB为解决即插即用需求而诞生,支持热插拔.USB协议版本有USB1.0.USB1.1.USB2.0.USB3.1等,USB2.0目 ...

  6. usb2.0 规范学习笔记

    1.一个USB HOST 最多可以同时支持128 个地址,地址0 作为默认地址,只在设备枚举期间临时使 用,而不能被分配给任何一个设备,因此一个USB HOST 最多可以同时支持127 个地址,如果一 ...

  7. USB协议-USB的包结构及包的分类

    USB是串行总线,所以数据是一位一位地在数据线上传送的.既然是一位一位地传送,就存在着一个数据位先后的问题.USB使用的是LSB在前的方式,即先出来的是最低位数据,接下来是次低位,最后是最高位(MSB ...

  8. usb2.0 协议分析

    转:https://blog.csdn.net/u011594613/article/details/48291307 一.USB硬件介绍1.1.概述 一条USB传输线分别由地线.电源线.D+和D-四 ...

  9. 截取usb数据包,控制usb设备----Relay设备

    在项目开发当中,我们需要一个usb转继电器的设备当开关控制无线发射设备,采购部采购时并未详细了解Relay设备的运行环境就买了一批设备,之后发现设备厂家只提供了windows库,而我们是要在linux ...

随机推荐

  1. Makefile 编写 tips

    1.变量赋值 VARIABLE = value #在执行时扩展,允许递归扩展 VARIABLE := value #在定义时扩展 VARIABLE ?= value #只有在该变量为空时才设置该值 V ...

  2. DAX 2009 for Retail's P job does not work after restoring AX database from another environment.

    This time, it's P job.  We already re-configured profiles, distribution locations, distribution grou ...

  3. 号外号外:9月21号关于Speed-BI 《全国人口统计数据分析》开讲了

    引言:如何快速分析纷繁复杂的数据?如何快速做出老板满意的报表?如何快速将Speed-BI云平台运用到实际场景中?       本课程将通过各行各业案例背景,将Speed-BI云平台运用到实际场景中,通 ...

  4. Struts2的处理结果(二)——处理结果的类型

    Struts2的处理结果(二) --处理结果的类型 1.Struts2內建的支持的结果类型: 在<result>元素中的type属性,确定了结果类型. chain:Action链式处理的结 ...

  5. C#中结构体与字节流互相转换

    1.定义与C++对应的C#结构体 在c#中的结构体不能定义指针,不能定义字符数组,只能在里面定义字符数组的引用. C++的消息结构体如下: //消息格式 4+16+4+4= 28个字节 struct ...

  6. JavaScript中一些你不一定知道的问题(持续更新中。。。。)

    一些js的问题与解析 1) ["1","2","3"].map(parseInt);的运行结果是? A.["1",&qu ...

  7. PHP 性能追踪及分析工具(XHPROF)

    原文:https://gold.xitu.io/post/5860d23f128fe10069e1cfbf XHPROF:Facebook 开源的轻量级PHP性能分析工具. 它报告函数级别的请求次数和 ...

  8. JavaScript对象创建的几种方式

    1 工厂模式 1.1 创建 function createFruit(name,colors) { var o = new Object(); o.name = name; o.colors = co ...

  9. freemarker报错之九

    1.错误描述 五月 30, 2014 11:52:04 下午 freemarker.log.JDK14LoggerFactory$JDK14Logger error 严重: Template proc ...

  10. js 中innerHTML,innerText,outerHTML,outerText的区别

    开头说下innerText和outerText只在chrome浏览器中有效 定义和用法 innerHTML 属性设置或返回表格行的开始和结束标签之间的 HTML,包括标签. 来看代码 <!DOC ...