USB 是一种串行传输总线,使用差分信号传输数据,USB 设备支持热插拔。

USB 规格及接口

USB 传输速率

USB 标准的不同版本有不同的传输速率和电压电流特性。

标准版本 发布日期 速率代码 最大传输速率 电压/电流
USB 1.0 1996 年 1 月 Low Speed 1.5 Mbps 5 V / 500 mA
USB 1.1 1998 年 9 月 Full Speed 12 Mbps 5 V / 500 mA
USB 2.0 2000 年 4 月 High Speed 480 Mbps 5 V / 500 mA
USB 3.2 Gen1 2008 年 11 月 Super Speed 5 Gbps 5 V / 900 mA
USB 3.2 Gen2 x1 2013 年 7 月 Super Speed+ 10 Gbps 20 V / 5A
USB 3.2 Gen2 x2 2017 年 9 月 Super Speed+ 20 Gbps 20 V / 5A
USB 4 2019 年 9 月 40 Gbps 20 V / 5 A

USB IF 组织对 USB 标准的命名几经改动,USB 标准的命名不是很清晰。

USB 物理接口

USB 信号接口

USB 有四根线:VBUS,GND,D+,D-。VBUS 和 GND 是电源和地,D+和D-是差分信号数据传输线。USB 设备有两种供电模式,外部供电和自供电,外部供电时就是通过 VBUS 获得电源。

USB 系统拓扑结构

USB 总线由三部分组成:USB 主机(USB host),USB 设备(USB devices),USB 互联(USB interconnect)。一个USB 系统中仅有一个 USB 主机;设备包括 USB 普通设备和 USB Hub 两种类型;USB 互联指 USB 设备和 USB 主机连接和通信的方式。主机(计算机)上的 USB 接口被称作主机控制器,主机控制器由硬件、固件或软件组合而成,主机(计算机)上除 USB 控制器外,还会集成根集线器(Root Hub)以向外提供一或多个 USB 连接口。

USB 总线拓扑

USB 设备连接到 USB 主机。USB 物理互连采用分层星形拓扑结构。每个星形结构的中心都是一个 HUB,HUB 的上游端口连接到上一层,HUB 的下游端口连接到下一层。如下图所示:

把上图称作一个 USB 系统,那么一个 USB 系统最多支持七层,一个 USB 系统中只有一个 USB 主机,根集线器(Root Hub)集成于 USB 主机内部,去掉第一层和第七层,一个 USB 系统中最多只允许 5 个 USB Hub 级联。一个 USB 主机最多支持 128 个设备地址,地址 0 特殊,只在设备枚举期间使用,地址 0 不能被分配给设备使用,所以一个 USB 系统中最多只能有 127 个设备,Root Hub 以及外接的 Hub 都会占用设备地址,所以实际能接入的普通 USB 设备会少于 127。

USB 物理总线拓扑

USB 系统中各设备与主机通过分层的星形拓扑结构建立物理连接,分层星形结构可以避免连接回环。USB HUB 提供设备连接点,这线连接点就是 USB 端口,HUB 有上游端口和下游端口。根集线器(Root Hub)集成在 USB 主机内。

在硬件上将多个 USB 设备与一个 HUB 组装到一台设备内部,这样的设备称为组合设备(Comound Device),如上图所示的组合设备实际包含一个 HUB 设备和两个普通设备,一共三个物理设备,占用三个设备地址,主机能看到三个 VID:PID。在软件上将多个 USB 功能(比如将摄像头视频输入功能、麦克风录音功能)集成在一起,这样的设备称为复合设备(Compsite Device)。复合设备只有一个物理设备,只有一个设备地址,主机上只能看到一个 VID:PID。

看一下主机系统上连接的 USB 设备的情况:

think@stone-suse:~> lsusb -t -v
/: Bus 02.Port 1: Dev 1, Class=root_hub, Driver=uhci_hcd/2p, 12M
ID 1d6b:0001 Linux Foundation 1.1 root hub
|__ Port 1: Dev 2, If 0, Class=Human Interface Device, Driver=usbhid, 12M
ID 0e0f:0003 VMware, Inc. Virtual Mouse
|__ Port 2: Dev 3, If 0, Class=Hub, Driver=hub/7p, 12M
ID 0e0f:0002 VMware, Inc. Virtual USB Hub
/: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=ehci-pci/6p, 480M
ID 1d6b:0002 Linux Foundation 2.0 root hub
|__ Port 1: Dev 2, If 0, Class=Video, Driver=uvcvideo, 480M
ID 046d:08e5 Logitech, Inc. C920 PRO HD Webcam
|__ Port 1: Dev 2, If 1, Class=Video, Driver=uvcvideo, 480M
ID 046d:08e5 Logitech, Inc. C920 PRO HD Webcam
|__ Port 1: Dev 2, If 2, Class=Audio, Driver=snd-usb-audio, 480M
ID 046d:08e5 Logitech, Inc. C920 PRO HD Webcam
|__ Port 1: Dev 2, If 3, Class=Audio, Driver=snd-usb-audio, 480M
ID 046d:08e5 Logitech, Inc. C920 PRO HD Webcam

USB 逻辑总线拓扑

USB 系统中,主机与设备通信时,就像设备是直接连接到主机一样,整个系统的逻辑视图如下:

USB 的四种传输模式

USB 传输的数据有功能数据和控制数据两种。在主机软件和 USB 设备的特点端点之间建议一条数据传输的通道,这条通道叫做管道,管道可能是单向的或双向的。通常,不同管道内的数据流是独立的,一条管道的数据流不受其他管道的影响。一个给定的 USB 设备可能有许多管道。例如,一个给定的 USB 设备可能具有一个输入端点,连接一个输入管道,接收来自主机的数据,还有一个输出端点,连接一个输出管道,将数据发送给主机。

有四种 USB 传输模式:

控制传输

用于在枚举阶段配置设备,也可用于其他设备特定用途,包括控制设备上的其他管道。当设备第一次连上主机时,主机上的软件发送控制数据来配置设备。控制传输是双向传输,是可靠传输。

控制传输中的最大包长:高速设备最大包长是 64 字节;低速设备是 8;全速设备可以是 8 或 16 或 32 或 64。最大包长表示一个端点单次接收/发送数据的能力,实际上就是该端点对应的缓冲区的大小。当一次传输的数据量超过该端点的最大包长时,需要将数据拆分成多个包传输,只有最后一个包可以小于最大包长,除最后一个包外的其他包都应等于最大包长。所以在一次控制传输中,如果一个端点收到/发送了一个长度小于最大包长的包,则表示此次数据传输结束。

批量传输

批量传输用于对延迟要求不高,数据量大的可靠传输,如 U 盘等。批量传输是单向传输,是可靠传输。

批量传输的延迟没有保证。它会尽量用完可用带宽,但跟其他传输模式比量传输具有最低优先级,它适合数据量比较大的非实时数据传输。

中断传输

中断传输用于对延迟要求较高、数据量小的可靠传输,如键盘、鼠标、游戏手柄等。中断传输是一种单向传输,是可靠传输。

中断传输采用轮询的传输方式(并非寻常的软件中断模式),主机以固定间隔对中断端点查询,有新数据则接收。中断并非实时传输,它可以使用较短的轮询间隔以保证较低的延迟。

等时传输

等时传输也称为流式实时传输,用于对可靠性要求不高的实时数据传输,如摄像头等。占用预先协商好的 USB 带宽,具有预先协商好的传输延迟。对于任何给定的设备配置,管道只支持上述传输类型中的一种。等时传输是一种实时传输、是不可靠传输,不支持错误重发机制。

USB 协议的逻辑层次:设备、配置、接口和端点

USB 设备有四个逻辑层次:设备、配置、接口、端点,如下图所示:

设备就是指 USB 物理设备,一个设备有一个 VID(Vender ID) 和 PID(Product ID),如上述打印清单中,罗技 C920 摄像头的 VID:PID 是 046d:08e5。

每个 USB 设备可包含一或多个配置,一个配置就是一组功能组合,不同的配置包含不同的功能组合,在设备枚举阶段,选中其中一个配置来配置设备。配置由多个接口组成。

一个接口代表一个基本功能,是 USB 设备驱动程序控制的对象。接口由多个端点组成。USB 的设备驱动是绑定在 USB 接口级别,而不是设备级别。在上述打印清单中,罗技 C920 摄像头有 4 个接口,2 个视频接口和 2 个音频接口。

端点是 USB 通信的基本对象,主机软件与设备端之间建立一条数据管道,USB 数据在此管道内传输,注意端点位于设备侧,而管道则是在主机软件视角的逻辑通道,USB 主机侧通过管道进行数据收发,USB 设备则通过端点进行数据收发。这里说的“端点”位于 USB 协议的逻辑层面,端点 0 特殊,端点 0 是控制端点,用于在枚举过程中配置设备,端点 0 是双向传输端点,所以逻辑层的端点 0 实际占用了物理硬件上的两个端点(一个输入端点和一个输出端点),除端点 0 外的其他端点都是单向的,每个 USB 设备必须存在端点 0。注意,端点的方向是从 USB 主机侧来看的,输入端点表示主机从端点接收数据,输出端点表示主机向端点发送数据。

以 Xilinx MPSoC 平台 DWC3 USB 控制器为例,规格书中描述此 USB 控制器“ Supports 12 endpoints (six out and six in)”,它有 12 个物理端点(6 个输入和 6 个输出),控制端点(端点 0)占用两个物理端点(一个输入和一个输出),能用于数据通信的最多只有剩下的 10 个端点(5 个输入和 5 个输出)。

参考资料

[1] Universal Serial Bus Specification Revision 2.0

[2] USB硬件接口

[3] USB Compoite Device 与 Compound Device

修改记录

2025-06-14 V1.0 初稿

USB工程应用基础概念简介的更多相关文章

  1. 【Machine Learning】机器学习及其基础概念简介

    机器学习及其基础概念简介 作者:白宁超 2016年12月23日21:24:51 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本系列文章是作者结 ...

  2. TCP/IP基础概念及通信过程举例

    TCP/IP基础概念及通信过程举例 出现 上个世纪60年代,由于中央集中式网络的容灾性较弱,以美国国防部为中心的一家组织研究出分组交换网络.后来为了验证分组交换技术的实用性,ARPANET出现了,并且 ...

  3. XML 参考:XML基础 XML 简介

    XML 参考:XML基础 -- XML简介和用途 转:http://www.cnblogs.com/Dlonghow/archive/2009/01/22/1379799.html XML 参考:XM ...

  4. RabbitMQ基础概念详细介绍

    http://blog.csdn.net/column/details/rabbitmq.html 转至:http://www.ostest.cn/archives/497 引言 你是否遇到过两个(多 ...

  5. UML基础概念(转)

    UML基础概念 UML概述 uml简介 uml(unified Modeling Language )为面向对象软件设计提供统一的.标准的.可视化的建模语言.适用于描述以用例为驱动,以体系结构为中心的 ...

  6. JavaWeb开发技术基础概念回顾篇

    JavaWeb开发技术基础概念回顾篇 第一章 动态网页开发技术概述 1.JSP技术:JSP是Java Server Page的缩写,指的是基于Java服务器端动态网页. 2.JSP的运行原理:当用户第 ...

  7. Java多线程概念简介 多线程中篇(一)

    Java的线程与操作系统的线程   在线程的相关介绍中,有讲到“线程的实现”分为三种:内核支持,用户级以及两者混合.(这只是一种简要的分类) Java线程在JDK1.2之前,是用户线程实现的 而在JD ...

  8. DNA拷贝数变异CNV检测——基础概念篇

    DNA拷贝数变异CNV检测——基础概念篇   一.CNV 简介 拷贝数异常(copy number variations, CNVs)是属于基因组结构变异(structural variation), ...

  9. 第214天:Angular 基础概念

    一.Angular 简介 1. 什么是 AngularJS - 一款非常优秀的前端高级 JS 框架 - 最早由 Misko Hevery 等人创建 - 2009 年被 Google 公式收购,用于其多 ...

  10. Exynos4412 IIC总线驱动开发(一)—— IIC 基础概念及驱动架构分析

    关于Exynos4412 IIC 裸机开发请看 :Exynos4412 裸机开发 —— IIC总线 ,下面回顾下 IIC 基础概念 一.IIC 基础概念 IIC(Inter-Integrated Ci ...

随机推荐

  1. 什么是HTTP压缩及HTTP压缩的过程

    HTTP压缩是指: Web服务器和浏览器之间压缩传输的"文本内容"的方法. HTTP采用通用的压缩算法,比如gzip来压缩HTML,Javascript, CSS文件. 能大大减少 ...

  2. Shader作画

    代码运行网站:http://editor.thebookofshaders.com/ // Author @CuriosityWang // https://www.cnblogs.com/curio ...

  3. Efficient Scalable Multi-Party Private Set Intersection

    论文学习:Efficient Scalable Multi-Party Private Set Intersection 这篇论文提出了一种基于双中心零共享(Bicentric Zero-Sharin ...

  4. String类的三种常见构造方法

    1.根据构造方法创建字符串对象 1.public String() 创建一个空字符串,里面不包含任何内容 2.public String(char[] chs) 创建一个字符数组,将其拼接成字符串对象 ...

  5. leetcode每日一题:最大或值

    题目 2680. 最大或值 给你一个下标从 0 开始长度为 n 的整数数组 nums 和一个整数 k .每一次操作中,你可以选择一个数并将它乘 2 . 你最多可以进行 k 次操作,请你返回 nums[ ...

  6. js调用datasnap rest server

    场景: 有嵌套的多层json数据结构的变量,js通过post调用 datasnap rest server,会出现问题: var json = [{ stcd: system.sn, dateTime ...

  7. postgresql的日期函数

    一个to_char干完所有的活.包括日期的转换 函数 返回类型 描述 实例 to_char(timestamp, text) text 将时间戳转换为字符串 to_char(current_times ...

  8. Unity中检查重复的资源

    目的:检查Unity中资源是否重复,例如有两张贴图,明明是一张,却被复制为两份放在工程中,名字或者所在目录位置不同,这对于资源管理来说是很浪费的.因此需要写一个检查工具来检查项目中是否存在重复的资源. ...

  9. elemengui分页

    <!-- 分页模块 --> <template> <div class="block" style="margin-top:20px&quo ...

  10. Spring Bean的声明方式

    一.环境说明 项目结构 StudentService package com.cookie.service; /** * @author cxq * @version 1.0 * @date 2020 ...