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. django之orm单表查询

    这几天重新学习了一下django的orm,以此作为记录来分享. Part1:修改配置,生成表 在写数据和查数据之前,首先先得把django配置一下,具体配置如下: 1.先在公共项目的settings中 ...

  2. java虚拟机入门(三)- 你了解对象吗

    对象对于java程序员来说,那是想要多少就有多少,所以那些嘲笑程序员的单身狗,哼,只有无知使你们快乐,想我大java开发,何曾缺少过对象.我们不仅仅知道创建对象,还知道创建对象的过程是啥样的,不信?往 ...

  3. Java语法糖详解

    语法糖 语法糖(Syntactic Sugar),也称糖衣语法,是由英国计算机学家 Peter.J.Landin 发明的一个术语,指在计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更 ...

  4. 知乎社区核心业务 Golang 化实践 - 知乎 https://zhuanlan.zhihu.com/p/48039838

    知乎社区核心业务 Golang 化实践 - 知乎 https://zhuanlan.zhihu.com/p/48039838

  5. WebRTC 泄漏真实 IP 地址

    WebRTC(网页即时通信,Web Real-Time Communication) 它允许浏览器内进行实时语音或视频对话,而无需添加额外的浏览器扩展.包括 Chrome.Firefox.Opera. ...

  6. Windows 10 安装 JDK14 Java 环境,没有 jre 包

    一.下载 JDK Oracle JDK 官网下载地址:https://www.oracle.com/technetwork/java/javase/downloads/index.html 二.配置环 ...

  7. loj10170

    在 n×n 的棋盘上放 k 个国王,国王可攻击相邻的 8 个格子,求使它们无法互相攻击的方案总数. -------------------------------------------------- ...

  8. python实现文件查找功能,excel写入功能

    因为要丛UE文档中过滤关键字来统计解码时间,第一次自己完成了一个自动化统计的小工具,用起来颇有成就感. UE文件的内如如下: 需要丛这份关键字中过滤红色标记的两个关键字,取 一个关键字的最后一位,和取 ...

  9. Linux内核poll/select机制简析

    0 I/O多路复用机制 I/O多路复用 (I/O multiplexing),提供了同时监测若干个文件描述符是否可以执行IO操作的能力. select/poll/epoll 函数都提供了这样的机制,能 ...

  10. Spring,Spring MVC,MyBatis,Hibernate总结

    将之前学习的框架知识进行了UML图总结,若有错误或不当之处,劳烦朋友们指正,会及时作出修改和补充: [toc] Spring Spring MVC MyBatis,Hibernate