1、事务

在介绍USB传输类型之前,请允许我先简答介绍一下USB事务。

事务一般由令牌包、数据包(可选)、握手包组成。

  • 令牌包:用来启动一个事务,总是由主机发送。
  • 数据包:可以从主机到设备,也可以由设备到主机,方向由令牌包决定。
  • 握手包:通常情况,数据的接收者发送握手包(ACK或者NAK)。

USB协议规定了四种传输类型:控制传输、批量传输、同步传输、中断传输。下面简答介绍一下这四种传输类型及其注意事项。

2、控制传输

2.1. 控制传输分为三个过程:建立过程、数据过程(可选)、状态过程。

建立过程:

a. 主机发送令牌包:SETUP

b. 主机发送数据包:DATA0

c. 设备返回握手包:ACK或不应答,注意:设备不能返回NAK或STALL,即设备必须接收建立事务的数据。

数据过程(可选):

一个数据过程可以包含多个数据事务,但所有数据事务必须是同一方向的。若数据方向发生了改变,则认为进入状态过程。数据过程的第一个数据包必须为DATA1,然后每次正确传输一个数据包后就在DATA0和DATA1之间交替。

状态过程:

状态过程只使用DATA1包,并且传输方向与数据过程相反。

2.2. 控制传输的应用场合:主要应用于设备的枚举过程和对数据准确性要求较高的场合。

3、同步传输

  • 同步传输的应用场合:主要用在数据量大,对实时性要求较高的场合。如视频设备、音频设备等。

4、批量传输

  • 批量传输使用批量传输事务,一次批量传输事务分为三个阶段:令牌包阶段、数据我阶段、握手包阶段。
  • 批量传输分为批量读和批量写,批量读使用批量输入事务,批量写使用批量输出事务。注意:不论输入还是输出都是以主机为参考的。
  • 批量传输的应用场合:主要用在数据量大、对数据实时性要求不高的场合,例如USB打印机、扫描仪、大容量存储设备等等。

批量输出流程:

1) 主机发送OUT令牌包。

说明:令牌包中包含设备地址、端点号。

2) 设备处理令牌包。

  • 令牌包正确:设备等待接收数据包。
  • 令牌包错误:设备既不接收、处理数据包,也不返回握手包,让主机等待超时。

注:令牌包的正确与否包括设备地址和端点号是否匹配。

3) 主机发送数据包,然后切换到接收模式,等待接收设备返回的握手包。

说明:数据包中包含一个DATA(具体是什么类型的DATA,取决于数据切换位)。

4) 设备处理数据包。

  • 数据包正确,并有足够的空间保存数据:设备返回ACK握手包或NYET握手包(只有告诉模式才有NYET握手包,它表示本次数据接收成功,但是没有能力接收下一次传输)。
  • 数据包正确,但是没有足够的空间保存数据:设备返回NAK握手包。主机收到NAK,延时一段时间后,再重新进行批量输出事务。
  • 数据包正确,但端点处于挂起状态:设备返回一个STALL握手包。
  • 数据包错误:设备不返回任何握手包,让主机等待超时。

批量输入流程:

1) 主机发送IN令牌包,然后切换到接收数据状态,等待设备返回数据。

说明:令牌包中包含设备地址、端点号。

2) 设备处理令牌包。

  • 令牌包正确,且有数据需要返回:设备将一个数据包放到总线上。
  • 令牌包正确,但没有数据需要返回:设备返回NAK握手包。主机收到NAK,延时一段时间后,再重新进行批量输入事务。
  • 令牌包正确,但端点处于挂起状态:设备返回一个STALL握手包。
  • 令牌包错误:设备不做任何响应,让主机等待超时。

3) 主机接收并处理数据包。

  • 数据包正确:主机发送一个ACK握手包。
  • 数据包错误:主机不做任何响应,让设备等待超时。

注:USB协议规定,不允许主机使用NAK握手包来拒绝接收数据包。

PING事务:

  • PING事务只有令牌包和握手包。
  • PING事务是USB2.0高速模式特有的,全速模式和低速模式没有。
  • PING事务作用:主机探测设备是否有空间接收数据。

PING流程:

1. 主机发送PING令牌包。

2. 设备返回状态。

  • 设备有空间接收数据:设备返回ACK握手包。
  • 设备没有空间接收数据:设备返回NAK握手包。
  • 设备端点挂起:设备返回STALL握手包。

5、中断传输

  • 中断传输是一种保证查询频率的传输。
  • 中断端点在端点描述符中报告它的查询间隔,主机会保证在不小于这个时间间隔的范围内安排一次传输。
  • 中断传输可以用来不断检测某个状态,当条件满足后,再使用批量传输来传送大量的数据。
  • 中断传输和批量传输的结构基本上一样(除了对端点查询策略)。
  • 中断传输的应用场合:主要用在数据量小,但对时间要求严格的场合。如人机接口设备(HID)中的鼠标、键盘、轨迹球等。

6、端点

  • 一个具体的端点只能工作在一种传输模式下。通常我们把工作在什么模式下的端点,叫做什么端点。如控制端点、批量端点、同步端点、中断端点。
  • 端点0是设备的默认控制端点,在设备上电后就存在并可以使用,在Set Config之前所有的传输都是通过端点0传输的。
  • 端点描述符中规定了端点所能支持的最大包长。
    • 控制传输:高速模式的最大包长固定为64个字节;全速模式可在8、16、32、64字节中选择;低速模式的最大包长固定为8个字节。
    • 批量传输:高速模式固定为512个字节;全速模式最大包长可在8、16、32、64字节中选择;低速模式不支持批量传输。
    • 同步传输:高速模式的最大包长上限为1024个字节;全速模式的最大包长上限为1023个字节;低速模式不支持同步传输。
    • 中断传输:告诉模式的最大包长上限为1024个字节;全速模式最大包长上限为64个字节;低速模式最大最大包长上限为8个字节。

USB的四种传输类型与端点的更多相关文章

  1. USB的四种传输类型

    USB协议规定了4种传输类型:批量(bulk)传输,等时传输(同步传输),中断传输和控制传输.

  2. USB:USB通信中的端点(endpoint)和四种传输模式

    USB的传输模式有4种,分别是控制传输(Control Transfer).中断传输(Interrupt Transfer).批量传输或叫块传输(Bulk Transfer).实时传输或叫同步传输(I ...

  3. usb四种传输模式bulk

    当USB插入USB总线时,USB控制器会自动为该USB设备分配一个数字来标示这个设备.另外,在设备的每个端点都有一个数字来表明这个端点.USB设备驱动向USB控制器驱动请求的每次传输被称为一个事务(T ...

  4. OAuth2简易实战(一)-四种模式

    1. OAuth2简易实战(一)-四种模式 1.1. 授权码授权模式(Authorization code Grant) 1.1.1. 流程图 1.1.2. 授权服务器配置 配置授权服务器中 clie ...

  5. 朱晔的互联网架构实践心得S2E5:浅谈四种API设计风格(RPC、REST、GraphQL、服务端驱动)

    Web API设计其实是一个挺重要的设计话题,许多公司都会有公司层面的Web API设计规范,几乎所有的项目在详细设计阶段都会进行API设计,项目开发后都会有一份API文档供测试和联调.本文尝试根据自 ...

  6. OAuth2 RFC 6749 规范提供的四种基本认证方案

    OAuth2 RFC 6749 规范提供了四种基本认证方案,以下针对这四种认证方案以及它们在本实现中的使用方式进行分别说面. 第一种认证方式: Authorization Code Grant (授权 ...

  7. PHP 将数据从 Laravel 传送到 vue 的四种方式

    在过去的两三年里,我一直在研究同时使用 Vue 和 Laravel 的项目,在每个项目开发的开始阶段,我必须问自己 “我将如何将数据从 Laravel 传递到 Vue ?”.这适用于 Vue 前端组件 ...

  8. Windows 电脑的四种运行状态工作状态 (Working), S0 睡眠状态 (Sleep), S1 或 S3 休眠状态 (Hibernate), S4 关机状态 (Shutdown), S5

    == Windows 电脑的四种运行状态 == 这四种运行状态(或称电源状态)是: 工作状态 (Working), S0 睡眠状态 (Sleep), S1 或 S3 休眠状态 (Hibernate), ...

  9. 两个变量交换的四种方法(Java)

    对于两种变量的交换,我发现四种方法,下面我用Java来演示一下. 1.利用第三个变量交换数值,简单的方法. (代码演示一下) class TestEV //创建一个类 { public static ...

随机推荐

  1. C#开发移动应用系列(1.环境搭建)

    前言 是时候蹭一波热度了..咳咳..我什么都没说.. 其实也是有感而发,昨天看到Jesse写的博文(是时候开始用C#快速开发移动应用了),才幡然醒悟 , 原来我们的Xamarin已经如此的成熟了... ...

  2. mysql too many connections 问题

    我的处理步骤: 第一步:首次确定你的服务可不可以重启,如果可以重启转第二步,如果不可以重启转第三步,这个主要考虑已经部署到客户现场或者正在使用中的数据库不能重启. 第二步:查找mysql的安装路径,这 ...

  3. java加密算法入门(一)-算法概念及单向加密

    说起加密,我的第一印象就是电视剧各种密码本破解解密的场景,这两天在看加密相关的东西,做下笔记以便以后查看,也提供给大家个参考. 本文是java加密的第一篇,主要讲述下消息编码Base64以及简单的消息 ...

  4. NLTK学习笔记(四):自然语言处理的一些算法研究

    自然语言处理中算法设计有两大部分:分而治之 和 转化 思想.一个是将大问题简化为小问题,另一个是将问题抽象化,向向已知转化.前者的例子:归并排序:后者的例子:判断相邻元素是否相同(与排序). 这次总结 ...

  5. 自己整理的openresty安装步骤

    这几天一直在研究对webapi的限流和名单的问题,于是看了开涛博客的方案,于是就用到了openresty,一个把Nginx和lua集成的东西. 下面就是整理的安装方案(简单使用基本可以这么安装) 下载 ...

  6. [codeforces167B]Wizards and Huge Prize

    B. Wizards and Huge Prize time limit per test: 2 seconds memory limit per test: 256 megabytes input: ...

  7. tostring方法

    //__tostring()方法//输出内容时不报错 用法实例:class Ren{ public $name; public function __tostring() { return " ...

  8. 动态读取文件持续显示在UI上

    private void DisplayLogInfo(FileInfo _LastFile) { if (_LastFile != null) { StreamReader sr = null; t ...

  9. Linux下一些命令

    #修改键盘布局 setxkbmap -layout us #给用户添加工作组 usermod -G groupname username #解压Tar包至指定目录 tar -xvf example.t ...

  10. 将数据库从服务器移到浏览器--indexedDB基本操作封装

    数据库是属于服务器的,这是天经地义的事,但是有时候数据也许并非需要存储在服务器,但是这些数据也是一条一条的记录,怎么办?今天来带领你领略一下H5的一个新特性--indexedDB的风骚.你会情不自禁的 ...