跳转到内容

串行编程/USB

来自维基教科书,开放世界中的开放书籍

什么是 USB?

[编辑 | 编辑源代码]

USB 代表“通用串行总线”。它是在 1990 年代中期开发的行业标准,定义了用于总线连接、通信和计算机与电子设备之间电源的线缆、连接器和通信协议。USB 的目的是标准化计算机外设(包括键盘、指示设备、数码相机、打印机、便携式媒体播放器、磁盘驱动器和网络适配器)与个人计算机的连接,既用于通信,也用于提供电力。它也已成为其他设备(如智能手机、PDA 和视频游戏机)的常见功能。USB 实际上已经取代了各种早期的接口,如串行端口和并行端口。

USB 闪存盘是通过 USB 端口插入和供电的内存设备。它们存储需要轻松访问的信息和数据。这些设备便携且方便人们随时使用。USB 端口是学生以及商业雇员或人员的常见必需品。除了方便之外,它们的存储容量从 1GB 到 64GB 不等,因此最终用户能够存储与小型计算机一样多的信息。

USB 闪存盘和读卡器

USB 通过一系列集线器将多个设备连接到主机控制器。在 USB 术语中,设备被称为功能,因为每个单独的物理设备实际上可能托管多个功能,例如带有内置麦克风的网络摄像头。集线器是专用设备,官方上不被视为功能。始终存在一个被称为根集线器的集线器,它直接连接到主机控制器。

这些设备/功能(和集线器)具有关联的管道(逻辑通道)。管道等同于 Unix 管道中的字节流。管道是从主机控制器到设备上名为端点的逻辑实体的连接。术语端点有时也用于指代整个管道。

这些端点(及其各自的管道)在每个方向上编号为 0-15,因此一个设备/功能可以拥有最多 32 个活动管道,其中 16 个进入主机控制器,16 个离开控制器。

每个端点只能在一个方向上传输数据,要么进入设备/功能,要么离开设备/功能,因此每个管道都是单向的。但是,端点 0 用于双向总线管理,因此占用 32 个端点中的两个——所有 USB 设备都要求实现端点 0,因此在任何给定设备上始终存在一个编号为 0 的内向和外向管道。

在这些管道中,数据以不同长度的数据包进行传输。每个管道都有一个最大数据包长度,通常为 字节,因此 USB 数据包通常包含大约 8、16、32、64、128、256 到 512 字节的数据。

管道还通过它们的传输类型划分为四种不同的类别

  • 控制传输 - 通常用于向设备发送简短的简单命令,以及状态响应,例如由总线控制管道编号 0 使用
  • 等时传输 - 以某种保证的速度(通常但不一定是尽可能快)进行,但可能会丢失数据,例如实时音频或视频
  • 中断传输 - 需要保证快速响应(有限延迟)的设备,例如指示设备和键盘
  • 块传输 - 使用所有剩余可用带宽进行的大量零星传输(但不对吞吐量或延迟提供保证),例如文件传输

当设备(功能)或集线器通过总线上的任何集线器连接到主机控制器时,它会由主机控制器在总线上分配一个唯一的 7 位地址。

然后,主机控制器通常以循环方式轮询总线以查找流量,因此没有设备可以在没有主机控制器的明确请求的情况下在总线上传输任何数据。相应端点上的中断传输实际上不会中断总线上的任何流量:它们只是被安排更频繁地查询,并在任何其他大型传输之间查询,因此 USB 总线上的“中断流量”实际上只是高优先级流量。

要访问端点,必须获得分层配置。连接到总线的设备有一个(且只有一个)设备描述符,它反过来有一个或多个配置描述符。这些配置通常对应于状态,例如活动状态与低功耗模式。每个配置描述符反过来又有一个或多个接口描述符,它们描述设备的某些方面,以便它可以用于不同的目的:例如,相机可以同时具有音频和视频接口。这些接口描述符反过来又具有一个默认接口设置,以及可能更多的备用接口设置,这些设置又具有端点描述符,如上所述。但是,端点可以在多个接口和备用接口设置之间重复使用。

主机控制器

[编辑 | 编辑源代码]
一个 USB 系列“A”插头

包含主机控制器和根集线器的硬件有一个面向程序员的接口,称为主机控制器设备 (HCD),并由硬件实现者定义。在实践中,这些是计算机中的硬件寄存器(端口)。

在 1.0 版和 1.1 版中,存在两种竞争的 HCD 实现。康柏的开放主机控制器接口 (OHCI) 被 USB-IF 采用为标准。但是,英特尔随后创建了他们称为通用主机控制器接口 (UHCI) 的规范,并坚持其他实现者付费许可和实施 UHCI。威盛科技从英特尔获得了 UHCI 标准的许可;所有其他芯片组实现者都使用 OHCI。OHCI 和 UHCI 之间的主要区别在于 UHCI 比 OHCI 更依赖于软件,这使得 UHCI 对处理器要求更高,但实施成本更低。相互竞争的实现迫使操作系统供应商和硬件供应商在两种实现上进行开发和测试,这增加了成本。在 USB 2.0 的设计阶段,USB-IF 坚持只使用一种实现。USB 2.0 HCD 实现称为扩展主机控制器接口 (EHCI)。只有 EHCI 支持高速传输。每个 EHCI 控制器包含四个虚拟 HCD 实现,以支持全速和低速设备。英特尔和威盛 EHCI 控制器上的虚拟 HCD 为 UHCI。所有其他供应商都使用虚拟 OHCI 控制器。

类代码

[编辑 | 编辑源代码]

USB 设备的设备描述符有一个签名,它告诉什么类型的设备已连接到总线。该签名由类代码、子类代码和协议字段组成。这些字段共同识别应使用哪个操作系统驱动程序与设备通信。此外,每个 USB 设备接口描述符都包含相同的签名字段。接口签名允许多个操作系统驱动程序同时与单个 USB 设备通信(例如具有音频和视频接口的 USB 设备),并且它们还允许同一驱动程序的多个实例与同一 USB 设备的不同接口通信(例如具有多个以太网端口的 USB 以太网适配器)。

连接到总线的设备可以是需要使用完全自定义设备驱动程序的完全自定义设备,也可以属于设备类。这些类定义了设备和接口描述符方面的预期行为,以便相同的设备驱动程序可用于声称自己是某个类成员的任何设备。操作系统应该实现所有设备类,以便为任何 USB 设备提供通用驱动程序。

设备类代码由 USB 实现者论坛的设备工作组决定。如果该类适用于整个设备,则类代码将分配给设备描述符的bDeviceClass字段,如果要为设备上的单个接口设置该代码,则将其分配给接口描述符的bInterfaceClass字段。还可以使用接口关联描述符对设备的多个接口进行分组,在这种情况下,类代码将分配给描述符的bFunctionClass字段。类代码是一个字节,因此最多可以有 254 个不同的设备类(值 0x00 和 0xFF 保留)。如果bDeviceClass设置为 0x00,操作系统将查看bFunctionClass以获取接口关联描述符,并查看每个接口的bInterfaceClass以确定设备类。每个类还可选地支持子类协议子定义。这些可以作为主要设备类不断修订时使用。

最常用的类代码(按分配的类 ID 分组)是:[1]

0x00 - 未指定类(设备描述符)
USB 设备没有分配的类代码。应使用设备接口描述符的类代码来识别设备支持哪些驱动程序。
0x01 - 音频类(接口描述符)
该接口遵循 USB 音频设备类规范。此类代码由类似声卡的设备使用。
0x02 - CDC / 通信设备类(设备或接口描述符)
USB 通信设备类(“CDC”),用于调制解调器、网卡、ISDN 连接、传真。
0x03 - HID 类 / 人机接口设备类(接口描述符)
USB 人机接口设备类(“HID”),键盘、鼠标等。
0x05 - 物理设备类(接口描述符)
?
0x06 - 静态图像类(接口描述符)
静态图像捕获设备类,与 USB 上使用的图片传输协议相同。
0x07 - 打印机类(接口描述符)
USB 打印机设备类,类似打印机的设备。
0x08 - 大容量存储类(接口描述符)
USB 大容量存储设备类,用于闪存驱动器、便携式硬盘驱动器、存储卡读卡器、数码相机、数字音频播放器等。此设备类将设备呈现为块设备(几乎总是用于存储文件系统)。
0x09 - 集线器(设备描述符)
USB 集线器。
0x0A - CDC 数据 / 通信设备类数据(接口描述符)
CDC-数据(通信类设备)。
0x0B - 智能卡类(接口描述符)
智能卡读卡器。
0x0D - 内容安全类(接口描述符)
内容安全。
0x0E - 视频类(接口描述符)
USB 视频设备类,类似网络摄像头的设备,运动图像捕获设备。
0xDC - 诊断设备类(设备或接口描述符)
诊断设备的类。此类有一个子类用于 USB 2.0 兼容性测试设备。
0xE0 - 无线控制器类(设备或接口描述符)
无线控制器,例如蓝牙适配器。此类代码通常仅在接口描述符中使用,只有蓝牙子类允许在设备描述符中使用。
0xEF - 杂项类(设备或接口描述符)
?
0xFE - 应用特定类(接口描述符)
?
0xFF - 供应商特定类(设备或接口描述符)
自定义设备类 - 用于确定设备或接口不支持任何标准设备类,需要自定义驱动程序。

USB 信号

[编辑 | 编辑源代码]
引脚编号(面向插座)
引脚分配[2]
引脚 功能
  1 VBUS(4.01–5.25 伏特
  2 D−
  3 D+
  4 GND
  外壳 屏蔽

助记符:Victor Dashes Across Ground-Zero (Vbus , - , + , GND , Shield/Blank)

USB 信号通过一对标记为 D+ 和 D− 的双绞线数据线传输。这些数据线共同使用半双工差分信号来抵消长线路上的电磁噪声的影响。D+ 和 D− 通常一起工作;它们不是独立的单工连接。传输的信号电平对于低电平为 0.0–0.3 伏,对于高电平为 2.8–3.6 伏。

传输模式
[编辑 | 编辑源代码]

USB 支持四种传输模式

  • 控制
  • 中断
  • 等时
传输速度
[编辑 | 编辑源代码]

USB 支持三种数据速率

  • 高达 1.5 Mbit/s(187.5 kB/s)的低速速率,主要用于人机接口设备 (HID),例如键盘、鼠标和操纵杆。
  • 高达 12 Mbit/s(1.5 [MB/s)的全速速率。全速是 USB 2.0 规范之前的最快速率,许多设备回退到全速。全速设备在先到先得的基础上分配 USB 带宽,在使用多个等时设备的情况下,带宽不足的情况并不少见。所有 USB 集线器都支持全速。
  • 高达 480 Mbit/s(60 MB/s)的高速速率。

即使是高速集线器,如果服务多个非高速设备,也可能会为这些设备分配 12 Mbit/s 的总带宽,这将减慢它们的运行速度,除非集线器每个端口都有事务转换器。[3]

虽然高速设备通常被称为“USB 2.0”并宣传为“高达 480 Mbit/s”,但并非所有 USB 2.0 设备都是高速设备。高速设备通常仅以理论最大值(60 MB/s)数据吞吐量的二分之一的速度运行。目前(2006 年)通过真实设备获得的最大速率约为一半,即 30 MB/s。[4] 大多数高速 USB 设备通常以更慢的速度运行,通常约为 3 MB/s,有时高达 10-20 MB/s。USB-IF 认证设备并提供许可,在通过合规性测试并支付许可费后,可以使用“基本速度”(低速和全速)或高速的特殊营销徽标。所有设备都根据最新的规格进行测试,因此最近符合标准的低速设备也是 2.0。

高速设备旨在当插入全速集线器时回退到全速的较慢数据速率。高速集线器具有一个称为事务转换器的特殊功能,该功能将全速和低速总线流量与高速流量隔离开来。高速集线器中的事务转换器(或每个端口根据电气设计可能存在多个)将作为连接到它的全速和低速设备的完全独立的全速总线。这种隔离仅针对带宽;有关电源和集线器深度的总线规则仍然适用。

集线器将拥有一个或多个事务转换器,并且没有标准方法来确定集线器可能拥有的事务转换器数量。连接到一个事务转换器的所有低速和全速设备将共享低速/全速带宽。这意味着集线器的性能会因事务转换器数量和插入其端口的设备而有很大差异。例如,一个具有一个事务转换器和 7 个连接到它的低速/全速设备的 7 端口高速集线器将与 USB 1.1 集线器没有区别,所有设备将争夺相同的低速/全速带宽。如果集线器为七个端口中的每一个端口都提供事务转换器,那么每个设备都将拥有所有可用的全速/低速带宽,并且只会在高速带宽方面竞争,高速带宽要大得多。[5]

数据编码

[编辑 | 编辑源代码]

USB 标准使用 NRZI 系统来编码数据,并使用比特填充来传输长度为 **6** 位的逻辑 1(在 **6** 位逻辑 1 之后插入逻辑 0;接收器会忽略紧随 **6** 位逻辑 1 之后的 0)。此外,如果接收器接收到连续 7 位逻辑 1,则会将其视为比特填充错误。NRZI(非归零反转)编码方法在传输逻辑 **1** 时不改变信号,但在传输每个逻辑 **0** 时反转信号电平。

迷你 USB 信号

[编辑 | 编辑源代码]
显示引脚编号的迷你 USB-A 和 -B 插头(未按比例绘制)
迷你-A 插头(左),迷你-B 插头(右)
迷你 USB 连接器引脚排列
引脚 功能
1 VBUS (4.4–5.25 V)
2 D−
3 D+
4 ID
5 接地

大多数迷你 USB 连接器的引脚与标准 USB 连接器相同,除了引脚 4。引脚 4 称为 "ID",在迷你-A 插头中连接到接地,但在迷你-B 插头中则未连接。这会导致支持 USB On-The-Go(带有迷你-AB 插座)的设备在连接到 USB 迷你-A 插头(迷你-A - 迷你-B 电缆的 "A" 端)时,最初充当主机。迷你-A 连接器在内部还增加了一块塑料,以防止插入到仅支持从机(仅支持 B)的设备中。

USB 连接器

[编辑 | 编辑源代码]

连接器类型

[编辑 | 编辑源代码]

USB 连接器有多种类型,随着规范的不断发展,还添加了一些新的类型。从最初的 USB 规范开始:

  • 标准-A 插头
  • 标准-A 插座
  • 标准-B 插头
  • 标准-B 插座

在 USB 2.0 规范的第一个工程变更通知中添加:

  • 迷你-B 插头
  • 迷你-B 插座

在 “通用串行总线 Micro-USB 电缆和连接器规范” 中添加:

  • Micro-A 插头(白色)
  • Micro-AB 插座(灰色)
  • Micro-B 插头(黑色)
  • Micro-B 插座(黑色)

适配器,也来自 “通用串行总线 Micro-USB 电缆和连接器规范”(注意,不允许使用其他适配器。)

  • 标准-A 插座到 Micro-A 插头
Micro-USB 插头
Micro-USB 插头
  • "Micro 系列 USB 技术将取代 OTG 产品中的迷你系列 USB" [1] "比弗顿,俄勒冈州,2007 年 1 月 4 日 - USB 联盟 (USB-IF) 今天宣布完成 Micro-USB 规范的制定,这是一种新的连接器技术,将取代目前便携产品中使用的许多迷你系列插头和插座。" Micro-USB 插头额定耐插拔次数为 10,000 次。它约为目前广泛使用的迷你 USB 连接器高度的一半,但宽度相似。

电缆和连接器

[编辑 | 编辑源代码]
系列 “A” 插头和插座。

电缆仅有插头,主机和设备仅有插座。主机具有 A 型插座;设备如果具有插座,则具有 B 型。A 型插头仅与 A 型插座配合,B 型插头与 B 型插座配合。

On-the-Go 补充规范允许产品既是主机又是设备,具有 Micro-AB 插座,可以接受 Micro-A 插头或 Micro-B 插头。Micro-A、Micro-B 和 Micro-AB 连接器可以通过颜色轻松识别。Micro-A 插头和插座内部的塑料始终为白色,Micro-B 连接器内部的塑料为黑色,Micro-AB 插座内部的塑料为灰色。

USB 规范允许使用有限的电缆类型。电缆分为两类 - “可拆卸” 和 “固定”。所有允许的 USB 电缆都具有一个 A 型插头,无论是标准-A 还是 Micro-A。 “固定” 电缆的另一端要么不可拆卸,要么在设备端具有自定义连接器。如果电缆是 “可拆卸” 的,则电缆的另一端必须具有 B 型插头。还存在一种特殊的适配器电缆,它具有 Micro-A 插头和标准-A 插座。

固定 USB 电缆类型

  • 标准-A 插头到设备。
    这种电缆在设备端可能具有自定义连接器。
  • Micro-A 插头到设备。
    这种电缆不打算由设备的最终用户拆卸。

可拆卸 USB 电缆类型

  • 标准-A 插头到标准-B 插头。
    这是将 USB 设备连接到主机的最流行的电缆。
  • 标准-A 插头到迷你-B 插头。
    用于将旧的移动设备连接到主机。
  • 标准-A 插头到 Micro-B 插头。
    用于将较新的移动设备连接到主机。
  • Micro-A 插头到 Micro-B 插头。
    用于将移动设备彼此连接。
  • Micro-A 插头到标准-A 插座。
    这是一种特殊的适配器电缆,其长度最多为 150 毫米。它需要允许移动设备充当 USB 主机,用于连接不使用 Micro-USB 连接器的设备。

任何具有插座(除了上述特殊情况)或具有两个 “A” 或两个 “B” 连接器的电缆,从定义上来说都不是 USB。 [6] 但是,许多电缆制造商生产和销售与 USB 兼容(但并不严格符合标准)的延长电缆,一端具有标准-A 插头,另一端具有标准-A 插座。请注意,这些不符合标准的延长电缆不应与包含小型总线供电集线器的符合标准的电缆混合使用。具有两个 A 型或甚至两个 B 型插头的电缆可以从更专业的供应商处获得。

请注意,只有 “全速” 和 “高速” 设备使用可拆卸电缆。符合标准的 “低速” 设备仅使用固定电缆,因为低速规范不允许使用标准可拆卸 USB 电缆的电气特性。

迷你-B、Micro-A、Micro-B 和 Micro-AB 连接器用于小型设备,例如 PDA、手机或数码相机。标准-A 插头大约为 4 毫米 × 12 毫米,标准-B 约为 7 毫米 × 8 毫米,Micro-A 和 Micro-B 插头约为 2 毫米 × 7 毫米。

USB 委员会指定的连接器旨在支持 USB 的许多底层目标,并反映从当时使用的各种连接器中吸取的经验教训。具体而言:

  • 连接器设计为坚固耐用。许多以前的连接器设计都很脆弱,引脚或其他精密的部件容易弯曲或断裂,即使只施加了非常小的力。USB 连接器中的电气触点受到相邻塑料舌头的保护,整个连接组件进一步受到外包金属套的保护。因此,USB 连接器可以安全地处理、插入和拔出,即使是小孩也可以做到。外包套和坚固的模制插头主体意味着连接器可以跌落、踩踏,甚至被压碎或撞击,都不会损坏;要严重损坏 USB 连接器,需要施加相当大的力。
  • 很难错误地连接 USB 连接器。连接器不能倒置插入,从外观和连接时插头和插座正确配合的运动感觉就可以清楚地看出。但是,对于没有经验的用户(或没有看到安装情况的用户)来说,乍一看并不清楚连接器应该朝哪个方向,因此通常需要尝试两种方式。
  • 连接器制造成本特别低。
  • 连接器强制执行 USB 网络的定向拓扑。USB 不支持循环网络,因此来自不兼容 USB 设备的连接器本身也不兼容。与其他通信系统(例如 RJ-45 电缆)不同,性别转换器几乎从未使用过,这使得创建循环 USB 网络变得很困难。
  • 指定了适度的插入/拔出力。USB 电缆和小型 USB 设备通过插座的夹紧力固定到位(无需螺丝、夹子或其他连接器所需的旋钮)。连接或断开连接所需的力很小,允许在尴尬的情况下或由有运动障碍的人进行连接。
  • 连接器结构始终确保插头上的外包套在内部的四个连接器连接之前与插座中的对应部分接触。该套管通常连接到系统接地,允许通过这条路径安全地放电,否则会导致损坏的静电(而不是通过精密的电子元件)。这种外包方式还意味着对 USB 信号在通过配合的连接器对(这是唯一一个必须在并行方向上行驶一段距离的扭曲数据对的位置)时提供了 (适度) 的电磁干扰保护。此外,电源和公共连接在系统接地之后,但在数据连接之前建立。这种分阶段的建立和断开时间允许安全地热插拔,并且长期以来一直是航空航天行业连接器设计中的普遍做法。
  • USB 标准规定了相对较低的公差用于符合规范的 USB 连接器,旨在最大程度地减少不同供应商生产的连接器之间的兼容性问题(这一目标已经非常成功地实现了)。与大多数其他连接器标准不同,USB 规范还定义了连接设备在其插头周围区域的尺寸限制。这样做是为了避免出现设备符合连接器规范但其尺寸过大而阻塞相邻端口的情况。符合规范的设备必须符合尺寸限制,或者支持符合规范的延长线。

然而,物理层在一些示例中发生了改变。例如,IBM UltraPort 是 IBM 笔记本电脑 LCD 顶部的一种专有 USB 连接器。它使用不同的机械连接器,同时保留了 USB 信号和协议。其他小型设备制造商也开发了自己的小型外形连接器,并且出现了各种各样的这类连接器。出于规范目的,这些设备被视为具有固定线缆。

USB 的扩展被称为 USB On-The-Go,它允许单个端口充当主机或设备,通过连接线缆的哪一端插入设备上的插座来决定。即使在连接线缆并开始通信之后,两个设备也可以在程序控制下“交换”端点。此功能针对 PDA 等设备,在这些设备中,USB 连接可能在一种情况下作为设备连接到 PC 的主机端口,而在另一种情况下作为主机连接到键盘和鼠标设备。因此,USB On-The-Go 定义了两种小型外形连接器,Mini-A 和 Mini-B,以及一个通用插座 (Mini-AB),这应该可以阻止专有设计的扩散。

无线 USB 是一种正在开发的标准,它扩展了 USB 标准,同时在协议级别保持与 USB 1.1 和 USB 2.0 的向后兼容性。

USB 连接线的最大长度为 5 米;更长的长度需要集线器 [2]。 USB 连接可以通过使用不同制造商开发的专用 USB 延长产品,通过 CAT5 线缆延长至 50 米,或通过光纤延长至 10 公里。

电源供应

[编辑 | 编辑源代码]

USB 规范在一条线上提供 5 V(伏特)电源,连接的 USB 设备可以从该电源线汲取电源。规范规定 +ve 和 -ve 总线电源线之间的电压不超过 5.25 V,也不低于 4.35 V。

最初,设备只允许汲取 100 mA 电流。它可以以 100 mA 为单位向上游设备请求更多电流,最大值可达 500 mA。实际上,大多数端口会在关闭电源之前提供完整的 500 mA 或更多电流,即使设备没有请求它或甚至没有识别自己。如果(符合规范的)设备需要的电源超过可用电源,那么它将无法运行,直到用户更改网络(通过重新排列 USB 连接或添加外部电源)以提供所需的电源。

如果 USB 设备检测到 USB 总线的数据线在 3 毫秒内处于空闲状态,则设备必须进入挂起状态。挂起状态的设备允许汲取 500 μA 电流。如果设备在挂起之前被配置为使用超过 100 mA 的电流,并且设备被配置为远程唤醒源,则设备在挂起状态下允许汲取 2.5 mA 电流。挂起状态下的电流限制是每秒平均值。

请注意,**On-The-Go** 和**电池充电规范**都为 USB 规范添加了新的供电模式。

如果使用总线供电集线器,则下游设备的总电流使用量仅限于四个单位 - 400 mA。这限制了符合规范的总线供电集线器的端口数量,以及其他限制。需要超过 500 mA 电流的设备、端口数量超过 4 个的集线器以及下游设备总电流使用量超过四个 100 mA 单位的集线器,必须提供自己的电源。主机操作系统通常会跟踪 USB 网络的电源需求,并且可能会在某个段需要超过可用电源时向计算机操作员发出警告。


更多阅读材料

[编辑 | 编辑源代码]

参考文献

[编辑 | 编辑源代码]
华夏公益教科书