USB2.0协议学习笔记---USB数据包结构
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数据包结构的更多相关文章
- USB2.0协议学习笔记---USB工作过程(类的方法)
前面学习了那么多的概念,这里需要记住一点分层概念即设备 ---> 配置 ---> 接口 ---> 端点,这种分层的概念结构 . 也可以理解为端点构成接口,接口组成配置,配置组成设备. ...
- USB2.0协议学习笔记---描述符
USB设备描述符 字段名 长 度(字节) 地址偏移 含 义 bLenth 1 0 描述符长度 bDescriptorType 1 1 描述符类型 (这里为 1) ...
- USB2.0协议学习笔记---基本概念
概念 USB是一种串行通信总线(Universal Serial Bus),经历的版本有USB1.0,USB1.1.USB2.0等.USB是一种主从模式的结构,因此它无法在设备与设备.主机与主机之间 ...
- MQTT协议-MQTT协议解析(MQTT数据包结构)
协议就是通信双方的一个约定,即,表示第1位传输的什么.第2位传输的什么…….在MQTT协议中,一个MQTT数据包由:固定头(Fixed header). 可变头(Variable header). 消 ...
- 接口与协议学习笔记-USB协议_USB2.0_USB3.0不同版本(三)
USB(Universal Serial Bus)全称通用串口总线,USB为解决即插即用需求而诞生,支持热插拔.USB协议版本有USB1.0.USB1.1.USB2.0.USB3.1等,USB2.0目 ...
- usb2.0 规范学习笔记
1.一个USB HOST 最多可以同时支持128 个地址,地址0 作为默认地址,只在设备枚举期间临时使 用,而不能被分配给任何一个设备,因此一个USB HOST 最多可以同时支持127 个地址,如果一 ...
- USB协议-USB的包结构及包的分类
USB是串行总线,所以数据是一位一位地在数据线上传送的.既然是一位一位地传送,就存在着一个数据位先后的问题.USB使用的是LSB在前的方式,即先出来的是最低位数据,接下来是次低位,最后是最高位(MSB ...
- usb2.0 协议分析
转:https://blog.csdn.net/u011594613/article/details/48291307 一.USB硬件介绍1.1.概述 一条USB传输线分别由地线.电源线.D+和D-四 ...
- 截取usb数据包,控制usb设备----Relay设备
在项目开发当中,我们需要一个usb转继电器的设备当开关控制无线发射设备,采购部采购时并未详细了解Relay设备的运行环境就买了一批设备,之后发现设备厂家只提供了windows库,而我们是要在linux ...
随机推荐
- SpringMVC下关于静态资源访问
SpringMVC静态资源访问 聊一聊关于静态资源的访问问题 首先,我们要对web.xml里面的DispatcherServlet进行设置 <!-- 中央调度器--> <servle ...
- 打包遇到错误Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.22.2:test
引自:https://blog.csdn.net/xiexiangyan/article/details/107936774 遇到的问题 有一个maven项目,我clone一下最新的代码.准备打包(m ...
- Py其他内置函数,文件修改
其他内置函数 1.abs函数,取绝对值 print(abs(-1)) 2.all函数,判断可迭代对象是否全为真,有假直接假 假:0,'',None print(all([1,2,'1'])) prin ...
- https://github.com/golang/crypto/blob/master/bcrypt/bcrypt.go
https://github.com/golang/crypto/blob/master/bcrypt/bcrypt.go
- Infrastructure as Code 行为驱动开发指南 https://www.ibm.com/developerworks/cn/devops/d-bbd-guide-iac/index.html
Infrastructure as Code 行为驱动开发指南 https://www.ibm.com/developerworks/cn/devops/d-bbd-guide-iac/index.h ...
- What is the difference between btree and rtree indexing?
https://softwareengineering.stackexchange.com/questions/113256/what-is-the-difference-between-btree- ...
- 为什么要使用 do while(0)?
两点 避免宏定义的花括号对代码的完整性造成影响 可以在指定的代码块中(do{})使用break提前跳出,避免goto.
- MySql(五)SQL优化-优化SQL语句的一般步骤
MySql(五)SQL优化-优化SQL语句的一般步骤 一.优化SQL语句的一般步骤 1.1 通过show status命令了解各种SQL的执行频率 1.2 定位执行效率较低的SQL语句 1.3 通过e ...
- msf+cobaltstrike联动(一):把msf的session发给cobaltstrike
前提:MFS已经获取到session,可以进入metepreter,现在需要使用cobaltstrike进行图形化管理或团队协作. cobaltstrike起一个beacon监听,如使用:window ...
- dp practice 1
https://codeforces.com/problemset/problem/553/A dp+组合数学 dp[i] 放前i种颜色的方法数 #include<bits/stdc++.h&g ...