前面针对混乱的USB接口和协议进行了下简单科普(感兴趣的同学也可异步了解学习下),本节将对USB协议进行入门整体的学习,不过由于我们目的主要是针对软件开发,所以只是简单的介绍,尽量通俗易懂,缩略了很多繁杂的部分,让大家最基本的概念,更深入的需要参考协议进行学习。

另外,虽然现在协议已经发展到USB4了,但作为入门还是建议从USB 2.0开始入门,USB 2.0的协议架构是所有USB技术的基础,目前还是还是存在着大量基于USB2.0的外设,所以还是很有必要和意义的。

1 简介

USB(通用串行总线)是一种支持热插拔的高速串行传输总线,采用差分信号进行数据传输。其不同版本在传输速率上逐步提升:USB 1.0/1.1 支持 1.5 Mbps 的低速模式与 12 Mbps 的全速模式USB 2.0 进一步引入了 480 Mbps 的高速模式;后面USB1.0/1.1也分别改名USB 2.0 low/full speed,而新的USB2.0 协议改名USB 2.0 high speed,所以当我们现在提到USB2.0协议时,是包含这三种速率的协议的。

USB 2.0 在设计上注重向下兼容。当全速(USB 1.1)或低速(USB 1.0)设备接入高速(USB 2.0)主机时,主机会通过分离传输机制以兼容低速设备进行通信。此外,USB 总线的一个重要特性是,其整体传输速率将取决于总线上所连接设备中速度最慢的一台,即“木桶效应”决定整条总线的性能上限。

1.1 USB 互连 (USB interconnect)

USB 设备通过何种方式连接到主机并与之通信。这包括以下方面:

  • 总线拓扑 (Bus Topology):描述 USB 设备与主机之间的连接模型。
  • 层间关系 (Inter-layer Relationships):按功能分层描述 USB 系统中每一层执行的任务。
  • 数据流模型 (Data Flow Models):数据在 USB 系统中如何在数据生产者和消费者之间移动。
  • USB 调度 (USB Schedule):USB 提供了一个共享的互连结构,访问这个互连是通过调度来实现的,以支持同步(isochronous)数据传输并消除仲裁开销。

1.2 USB 设备 (USB Devices)

USB 设备是指通过 USB 接口连接到主机(Host)的外设,例如鼠标、键盘、摄像头或存储设备。

1.3 USB 主机 (USB Host)

USB 主机是整个系统的核心,负责管理和调度数据流,同时为外设提供配置和通信支持。

2 总线拓扑结构

在常规办公场景下,电脑的USB接口通常足以连接鼠标、键盘、U盘或移动固态硬盘等外设。然而,在嵌入式开发环境中,开发人员往往需要同时接入多种设备,如开发板串口调试线、程序烧录器、逻辑分析仪及其他调试工具,此时原生USB接口数量往往显得捉襟见肘。

为解决这一问题,我们通常会借助外接USB HUB来扩展接口,甚至采用多级HUB级联的方式。不过,这种扩展方式虽在主观上符合日常使用习惯,但其实际可行性与稳定性,仍需回归到USB协议所规定的拓扑结构上来理解。接下来,我们将从协议层面出发,系统了解USB拓扑的具体规范与限制。

一个USB HOST 最多可以同时支持128 个地址,地址0 作为默认地址,只在设备枚举期间临时使用,而不能被分配给任何一个设备,因此一个USB HOST 最多可以同时支持127 个地址,如果一个设备只占用一个地址,那么可最多支持127 个USB 设备。在实际的USB 体系中,如果要连接127 个USB设备,必须要使用USB HUB,而USB HUB 也是需要占用地址的,所以实际可支持的USB 功能设备的数量将小于127。

USB 体系采用分层的星型拓扑来连接所有USB 设备,如下图所示:
在这里插入图片描述
以HOST-ROOT HUB为起点,最多支持7 层(Tier),也就是说任何一个USB 系统中最多可以允许5个USB HUB 级联。一个复合设备(Compound Device)将同时占据两层或更多的层。

USB 体系包括 USB host(主机) 、USB device(设备) 以及 物理连接(USB interconnect) 三个部分。其中,设备(USB device) 又分为 USB function 和 USB Hub。

1、USB host
任何USB系统中只有一个主机。 主机系统的USB接口被称为主机控制器。 主机控制器可以以硬件,固件或软件的组合来实现。 根集线器集成在主机系统内以提供一个或多个连接点。

2、USB device
可以分为:

  • USB Hub: USB HUB提供了一种低成本、低复杂度的USB接口扩展方法。HUB的上行PORT面向HOST,下行PORT面向设备(HUB或功能设备)。在下行PORT上,HUB提供了设备连接检测和设备移除检测的能力,并给各下行PORT供电。HUB可以单独使能各下行PORT。不同PORT可以工作在不同的速度等级(高速/全速/低速)。

    • (1)一个 USB HOST 最多可以同时支持128 个地址,地址0 作为默认地址,只在设备枚举期间临时使用,而不能被分配给任何一个设备,因此一个USB HOST 最多可以同时支持127 个地址,如果一个设备只占用一个地址,那么可最多支持127 个USB 设备。在实际的USB 体系中,如果要连接127 个USB设备,必须要使用USB HUB,而USB HUB 也是需要占用地址的,所以实际可支持的USB 功能设备的数量将小于127。
    • (2)ROOT HUB 是一个特殊的USB HUB,它集成在主机控制器里,不占用地址。ROOT HUB 不但实现了普通USB HUB 的功能,还包括其他一些功能。
    • (3)“复合设备(Compound Device)”可以占用多个地址。所谓复合设备其实就是把多个功能设备通过内置的USB HUB 组合而成的设备,比如带录音话筒的USB 摄像头等。
  • USB function: 为系统提供各种能力,例如ISDN连接、数字操纵杆或扬声器

另外,USB设备在以下方面提供标准的USB接口:

  • 人机界面设备,例如鼠标、键盘、平板或游戏控制器
  • 成像设备,例如扫描仪、打印机或照相机
  • 大容量存储设备,例如CD-ROM驱动器、软盘驱动器或DVD驱动器

另外我们也可以从物理拓扑,逻辑拓扑和软件编程拓扑三个视图来看下。

2.1 USB的物理拓扑结构

USB 设备通过层级星型拓扑结构(tiered star topology)与主机(host)连接,正如下图所示。USB 连接点由一种特殊类别的 USB 设备提供,这种设备称为 集线器(hub)。

集线器提供的附加连接点称为 端口(ports)。主机包含一个嵌入式集线器,称为 根集线器(root hub),并通过根集线器提供一个或多个连接点。提供额外功能的 USB 设备称为 功能设备(functions)。

为了防止出现环形连接(circular attachments),USB 强制规定了层级顺序,这种层级顺序构成了 USB 星型拓扑的树形结构。

一个USB集线器(HUB)的物理构如下:
在这里插入图片描述
多个功能设备可能被打包成一个看起来像单一物理设备的形式。例如,一个键盘和一个轨迹球可能被组合成一个设备。在这个设备内部,单独的功能设备会永久连接到一个集线器,并且是这个内部集线器通过 USB 连接的。

当多个功能设备与一个集线器组合在一起时,它们被称为 复合设备(compound device)。该集线器和每个连接到集线器的功能设备都会分配独立的设备地址。

但复合设备本身作为一个整体只有一个设备地址。从主机的角度看,复合设备就像是一个有多个功能连接的独立集线器。图 5-5 也展示了复合设备的示例。

层级星型拓扑:

  • USB 的物理拓扑采用层级星型结构,其中主机通过根集线器(root hub)连接其他设备。每个集线器提供多个端口,可以让多个设备连接到同一个集线器。这种星型结构可以有效地管理多个设备,并且通过树形拓扑结构避免环形连接的问题(即设备之间的循环依赖)。
    根集线器与集线器:

  • 根集线器(Root Hub) 是内嵌在主机中的集线器,提供主机与外部 USB 设备连接的基本接口。根集线器本身就像是一个集线器,连接到更多的设备。
    集线器(Hub) 是一个 USB 设备,用于扩展连接端口,允许多个设备共享一个 USB 端口。每个集线器有多个端口,用于连接其他设备或更多的集线器。
    复合设备:

  • 复合设备(Compound Device):通常是一个集线器和多个功能设备的组合。集线器和每个功能设备都有独立的设备地址。可以将复合设备看作是一个集线器,提供多个功能设备连接。它包含多个接口,这些接口通常用于提供多个独立的功能。尽管有多个功能,它们共享一个设备地址。常见的复合设备包括带有多个功能的设备,如同一个 USB 设备中包含了键盘、鼠标、扬声器等多个接口。
    设备地址:

在 USB 中,每个设备都需要一个唯一的设备地址。当多个功能设备和一个集线器组合在一起时,复合设备的每个功能设备可能会有单独的地址,而复合设备本身则拥有一个单一的设备地址。

2.2 USB的逻辑拓扑结构

虽然设备物理连接到 USB 总线时采用的是分层星形拓扑,主机与每个逻辑设备进行通信时,会将这些设备视为直接连接到根端口。

这样形成了下图所示的逻辑视图,集线器(Hub)也是逻辑设备,但为了简化图示,在图中没有显示。

尽管大多数主机与逻辑设备的交互使用的是逻辑视角,但主机仍然保持对物理拓扑的感知,以支持处理集线器的移除。

当集线器被移除时,所有连接到该集线器的设备也必须从主机的逻辑拓扑视图中移除。
在这里插入图片描述

2.3 USB的客户端软件与功能的关系拓扑

尽管USB的物理和逻辑拓扑反映了总线的共享特性,但从用户软件的角度来讲,关注的是USB设备的提供的功能。

由于USB设备提供的不同功能使用USB接口(USB接口描述符)来承载,所以这个功能是以USB设备提供的接口为单位进行功能编程。
在这里插入图片描述
即使 USB 的物理和逻辑拓扑反映了总线的共享特性,操作 USB 功能接口的客户端软件(CSw)只会看到它所关心的接口。USB 功能的客户端软件必须通过 USB 软件编程接口(USB Software Programming Interfaces)来操作其功能,而不是像其他总线(如 PCI、EISA、PCMCIA 等)那样直接通过内存或 I/O 操作来访问。

这意味着在运行时,客户端软件应该独立于 USB 上可能连接的其他设备。这样,设备设计师和客户端软件开发者就可以专注于硬件与软件交互的设计细节。

上图展示了设备设计师在逻辑拓扑视图中,客户端软件与 USB 功能之间关系的一个视角。

USB 总线在物理层面上采用的是分层星形拓扑(tiered star topology),这意味着设备通过集线器(Hub)连接到主机,而集线器则将多个设备集中到一个 USB 端口。这是 USB 的物理连接方式。

但在逻辑层面上,主机与每个设备通信时会视它们为直接连接到根端口的设备。即便设备在物理上通过集线器连接,主机并不直接感知到这些集线器的存在。主机只关心每个设备,认为它们与根端口直接连接。

然而,集线器作为逻辑设备并不会显示在主机的逻辑视图中,目的是简化图示。尽管如此,主机仍然保持对物理拓扑的感知。当一个集线器被移除时,所有通过该集线器连接的设备也会从主机的逻辑视图中消失。这种方式确保主机能够正确地处理设备的插拔事件。

2.4 逻辑与物理拓扑的区别

USB 的物理拓扑是分层星形的,而在逻辑拓扑中,主机视设备为直接连接到根端口的设备。

集线器是物理上重要的设备,但在逻辑拓扑中,它们并不显式显示,简化了设备管理。

  • 客户端软件的独立性

客户端软件通过 USB 提供的编程接口来操作设备,不需要直接控制硬件。这种设计使得软件与其他设备的连接保持独立,便于开发与维护。

  • 集线器的管理

集线器被视为逻辑设备,移除集线器时,所有通过集线器连接的设备也必须从主机的逻辑视图中移除。这保证了系统在集线器移除时能够正确地处理设备的移除。

3 USB2.0电气规范

3.1 设备连接

电器特新这部分,一般嵌入式硬件需要深入理解下,但是对于软件人员来说,也要简单了解下,很多时候也要硬件问题,也需要能大概定位,下面会简单从软件人员的角度介绍下

  • USB2.0设备的引脚接线定义分为四根线,分别为:电源线(VBus)、D+、D-、地线(GND)
线 名称 电缆颜色(见下图) 描述
1 VBUS +5 V,电源
2 D− Data −,数据线
3 D+ 绿 Data +,数据线
4 GND Ground,接地
  • 线束颜色:
    在这里插入图片描述

  • 主机端与设备的电路图如图所示:
    在这里插入图片描述
    USB主机端的 D+ 和 D- 均有一个 15K 的下拉电阻,而设备端根据 USB 设备分为两大类 USB低速 和 USB全速/高速,分别在其设备的 D- 或 D+ 上拉一个 1.5K 的电阻。

  • 主机端 D+ 和 D- 均有一个 15K 的下拉电阻。

  • 低速设备端 D- 上拉一个 1.5K 的电阻

  • 高速/全速设备端 D+ 上拉一个 1.5K 的电阻

3.2 J/K状态

  1. 名词解析
  • Chirp J状态:Jabber,USB设备正在“说话”,准备通信。

  • Chirp K状态:Quiet, USB设备“安静”了,暂不可通信。

  • DP(D+):USB的数据正线,用于传输USB差分信号的正向信号。(positive)

  • DM(D-):USB的数据负线,用于传输USB差分信号的负向信号。(minus)

  • SE0 :表示Single Ended Zero状态。

USB2.0规范中对以下的差分信号 1 和 0 的状态定义为 J状态 和 K状态。

  • 全速和高速模式下
    • J状态对应差分信号“1”
    • K状态对应差分信号“0”
  • 低速模式下
    • J状态对应差分信号“0”
    • K状态对应差分信号“1”

无论是低速、全速或者是高速模式下,IDLE(即空闲状态)都是1,只是全速和高速的空闲状态叫J状态,而低速的叫K状态。

  1. 表格总结如下:
信号 转换状态 状态描述 低速D+ 低速D− 全速D+ 全速D−
J 空闲线路状态相同 出现在传输线转换期间,或等待新数据包 0 1 1 0
K J相反状态 出现在传输线转换期间 1 0 0 1
SE0 Single-ended zero D+和D−为低,指示包结束或USB设备移除 0 0 0 0
SE1 Single-ended one 非法状态,标示错误 1 1 1 1
  1. 实例分析
    图示是逻辑分析仪抓取的一个全速设备的SOF令牌包,可以来简单看下:
    在这里插入图片描述
特性 全速/高速设备 (Full-Speed/High-Speed) 低速设备 (Low-Speed)
J状态 D+ 为高电平 (≥2.0V), D- 为低电平 (≤0.8V)
(差分1)
D+ 为低电平, D- 为高电平
(差分0)
K状态 D+ 为低电平, D- 为高电平
(差分0)
D+ 为高电平, D- 为低电平
(差分1)
空闲状态 J状态 (D+高, D-低) K状态 (D+低, D-高)
SOP (包开始) 空闲状态 (J) 转换到 K状态 空闲状态 (K) 转换到 J状态
(逻辑同全速)
EOP (包结束) 短暂SE0 (D+和D-都拉低) 后跟随J状态 短暂SE0 (D+和D-都拉低) 后跟随K状态

3.3 NRZI (Non-Return to Zero Inverted) 编码

这里不在过多介绍,只需要知道:

  • ​​传输一个 0​​:表示​​电平发生一次跳变​​(从 J 变 K,或从 K 变 J)。
  • ​​传输一个 1​​:表示​​电平保持不变​​(继续保持 J 或继续保持 K)。

可以扩展了解:USB硬件编码格式NRZI - USB中文网

4 USB2.0设备速度的识别与断开过程

速度的识别也可以算是电器特性的一部分,虽然简单提过,但这里还是单独拉出来,因为也是需要重点了解的部分。

4.1 低速、全速/高速设备的识别

USB 在集线器和功能端(指USB设备)通过3.1章节图所示的方式连接。低速和全速/高速设备通过上拉电阻位置来区分:

  • 全速设备 (Full-speed devices):其上拉电阻位于 D+ 数据线上。
  • 低速设备 (Low-speed devices):其上拉电阻位于 D- 数据线上。

下游端口的下拉终端:是连接到地的电阻,值为 15 kΩ ±5%。

为了确保信号水平满足协议要求,上拉电阻的设计必须能够在复位后的最短恢复时间(2.5 µs)内将 D+ 或 D- 从 0V 拉升到最低 VIH(高电平输入电压)。

如果设备使用可拆卸电缆,则必须采用一个值为 1.5 kΩ ±5% 的电阻,该电阻连接到一个电压源(VTERM),该电压源范围在 3.0V 至 3.6V。

如果设备使用固定电缆,也可以使用其他终端方式,但任何终端的等效电阻 (Thevenin resistance) 必须不小于 900 Ω。
注意:终端的等效电阻不包括主机/集线器端的 15 kΩ ±5% 电阻。

上拉电阻的电压源必须来自USB电缆提供的电源或由其控制,以确保当VBUS被移除时,上拉电阻不会通过其连接的数据线提供电流。

4.2 高速度设备速度识别

通过上拉电阻接线的方式可以,区分主从可以协商好低速和全速/高速速率,那全速和高速是怎么区分呢?

4.2.1 CharpJ/K状态

在介绍高速设备识别之前,先介绍下CharpJ/K状态。

Chirp J和Chirp K状态只出现在高速模式的速度检测握手协议中,即设备从全速识别为高速设备的状态换过程中。

其原理是:高速模式是由电流驱动的,其J/K信号是由一个17.78mA的电流源向D+和D-数据线产生,当USB主机进入高速模式后,主机和设备两端的D-和D+都会挂载45Ω的等效终端电阻,并会断开D+数据线上的上拉电阻,这两个电阻并联之后为约为22.5Ω,因而可以在D+或者D-数据线上形成约为400mV的高速J/K信号。而高速设备在连接到USB主机时默认为全速模式,因此此时USB设备端还未挂接45Ω终端电阻,而是挂载了1.5K的上拉电阻,此时USB设备端的上拉电阻1.5K和主机端的45Ω并联后约45Ω,因此会在D+和D-上会形成800mV(17.78x45)的差分信号,这种差分信号就是Chirp J和Chirp K状态。

Chirp J和Chirp K状态只是断暂是因为设备端没有挂载45Ω的等效终端电阻而引起D+和D-上的短暂电压变高,待挂载了45Ω的等效终端电阻后电压自动降低而变成高带模式的J/K状态。
在这里插入图片描述

4.2.2 高速设备速度识别

其实从CharpJ/K的描述中基本已经可以理解,如何识别高速设备了,更具体的可以参考,USB中文网的一段描述:

USB2.0设备从全速模式到高速模式的识别过程及速率协商

4.3 USB2.0设备断开状态的检测

USB设备根据供电方式可分为自供电与总线供电(VBUS供电)两种。对于由VBUS供电的设备,一旦从主机断开,设备将失去电源,其固件程序也随之停止运行。因此,在这种设备上实现断开检测本身并不具备实际意义。

根据USB 2.0规范,VBUS电压正常工作时应高于特定门限值。因此,支持VBUS电压检测的设备,可通过判断VBUS是否低于VBSVLD(典型值为4.01V)来识别连接是否已断开。而对于不支持VBUS检测的设备,则通常依赖D+/D-线上的电压变化进行判断。

无论设备是否支持VBUS检测,一旦确认连接已断开,设备端都应确保D+或D-的上拉电阻处于有效状态,以保证下次连接时能正确初始化。

在实际电路中,设备端的VBUS引脚通常接有旁路电容。在频繁快速插拔的情况下,该电容可能导致VBUS电压无法迅速降至4.01V以下,从而影响断开检测的准确性。

具体的断开检测机制如下:

  • 低速/全速模式下的检测
    当设备断开时,主机或集线器下行端口的D+和D-线被内部下拉电阻拉低,电平降至单端低电平门限(0.8V)以下,进入SE0状态。若SE0状态持续时间超过TDDIS(USB 2.0规范定义,最小为2μs),下行端口即判定为断开。

  • 高速模式下的检测
    在高速模式下,若设备断开,其终端电阻随之移除,信号将因反射增强,使差分信号幅度升高至≥625 mV。断开检测通常在EOP(包结束)期间进行,利用其中连续40位无跳变的稳定信号段。若在发送至少32位无跳变信号后,检测到差分信号幅度超过625 mV的断开阈值,下行端口即判断为断开。

USB协议2.0(自行下载学习)
USB 2.0 协议规范(中文版)
USB协议基础篇_usb interfaceclass-CSDN博客
适合新手的 USB 2.0 协议内容 - 极术社区 - 连接开发者与智能计算生态
深入理解USB2.0通信协议——电气及物理层规范 - 知乎
USB2.0设备从全速模式到高速模式的识别过程及速率协商

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐