← 返回 计组与微机控制

计组与微机控制

8.3 USB控制总线

8.3 USB控制总线

一、USB 端点 Endpoint

前面说过,USB 通信不是直接对“设备整体”传数据,而是对设备内部的 端点 传数据。

可以这样理解:

USB 设备 = 一个外设 端点 Endpoint = 这个外设内部的通信入口/出口 管道 Pipe = 主机软件和端点之间建立的逻辑通道

比如一个 U 盘可能有控制端点、数据输入端点、数据输出端点。主机不是模糊地“访问 U 盘”,而是通过某个端点和它通信。

1. 端点的主要属性

教材列了端点的几个属性,可以记成:

端点号 总线频率/延时要求 带宽要求 差错控制要求 最大分组长度 传输类型 数据方向

其中最重要的是这几个:

注意 USB 里的方向是站在 主机角度说的:

IN:设备 → 主机 OUT:主机 → 设备

所以“IN 端点”不是输入到设备,而是输入到主机。

2. 端点 0 的特殊性

端点 0 是最特殊的。所有 USB 设备都必须有:端点 0

它是默认端点,用于:

设备上电后的初始化 读取设备描述符 分配地址 设置配置 控制传输

所以端点 0 又可以叫:缺省端点 / 默认控制端点

设备刚插上 USB 的时候,还没有正式地址,也没有完成配置,这时主机只能通过端点 0 和设备通信。

3. 端点数量

教材说,低速设备端点数较少,而全速设备附加端点数量最多可以有:

16 个输入端点 + 16 个输出端点

注意这不是说每个设备都一定有这么多,而是协议上最多支持这么多。

可以记成:端点号 4 位,所以端点号范围 0~15。 每个端点还分 IN/OUT 方向。

二、USB 管道 Pipe

教材接着讲“管道”。管道不是物理线,而是一个逻辑概念。

USB 管道 = 主机软件和 USB 设备端点之间的数据通路

它连接的是:主机上的软件缓冲区 ↔ USB 设备上的某个端点

主机软件要和设备通信,必须通过管道。

1. 管道不解释数据内容

教材中特别说,USB 并不翻译管道中的数据内容。

意思是:

USB 只负责把数据包送过去; 数据包里面是什么含义,由设备驱动和应用程序解释。

比如 USB 键盘发送的按键信息,USB 协议只负责传输,至于哪个字节代表哪个按键,是 HID 协议和驱动来解释。(有点像计网里传输层的TCP协议哈)

2. 缺省管道

设备刚上电时,端点 0 自动拥有一个管道:缺省管道

这个缺省管道用于设备识别和配置。

主机通过缺省管道完成:

读取设备描述符 获取设备能力 分配设备地址 选择配置

配置完成后,设备的其他端点才可以被正式使用。

三、USB 的四种传输类型

USB 定义了四种传输类型,这是考试重点。

控制传输 同步传输 中断传输 批量传输

1. 控制传输 Control Transfer

控制传输主要用于:

命令 / 状态 / 配置操作

典型用途:

设备枚举 读取描述符 设置地址 设置配置 发送控制命令

特点:突发性,非周期性,可靠性要求高

端点 0 默认使用控制传输。

例如设备刚插入时,主机通过端点 0 发控制请求:

你是什么设备? 你的厂商 ID 是多少? 你需要多少电流? 你有哪些配置?

2. 同步传输 Isochronous Transfer

同步传输主要用于时间相关的数据。

典型用途:

音频 视频 实时采样数据

特点:

周期性 连续性 强调时间 通常不重传

它适合需要稳定速率的数据流,比如 USB 摄像头、USB 音频。

同步传输的重点不是“每个字节都必须可靠”,而是:数据必须按时到达。

如果一个音频数据包错了,与其等待重传导致声音卡顿,不如丢掉这一小段继续播放。

3. 中断传输 Interrupt Transfer

中断传输主要用于设备向主机报告服务请求。

典型用途:

键盘 鼠标 游戏手柄 状态变化通知

它名字叫“中断”,但不是 CPU 那种真正的硬件中断。

USB 是主机控制总线,设备不能直接打断主机。所谓中断传输,本质是主机周期性轮询设备:

你有没有新数据? 你有没有新数据? 你有没有新数据?

如果设备有数据,就返回给主机。

特点:

数据量小 低频率 延迟固定 适合事件型数据

例如鼠标移动、键盘按键,不需要很大带宽,但需要比较快地被主机发现。

4. 批量传输 Bulk Transfer

批量传输主要用于大数据量传输。

典型用途:

U 盘 移动硬盘 打印机 扫描仪

特点:

数据量大 非周期 突发性强 利用剩余带宽 可靠性高

批量传输不保证固定延时,但保证数据正确。

也就是说:有空就传,传错就重传。

所以它适合文件传输,不适合实时音视频。

四种传输类型对比

可以这样记:

控制:管设备 同步:保时间 中断:报事件 批量:搬大块

四、USB 总线枚举

总线枚举是 USB 的核心过程。

所谓枚举,就是主机发现一个新设备,并完成识别、分配地址和配置的过程。

1. 为什么需要枚举?

USB 支持热插拔。设备可能随时插入,也可能随时拔出。

所以主机必须动态完成:

发现设备 识别设备 给设备分配地址 读取设备信息 加载驱动 设置配置 管理端点

这整个过程叫:USB 枚举

2. 插入 USB 设备后的过程

教材给出的步骤可以整理成这样:

① 设备插入某个 Hub 端口。 ② Hub 通过状态变化管道通知主机。 ③ 主机询问 Hub,确认哪个端口发生变化。 ④ 主机向该端口发送复位和使能信号。 ⑤ Hub 保持复位信号约 10 ms。 ⑥ 复位释放后,设备进入默认状态。 ⑦ 设备可从总线获得 100 mA 电流。 ⑧ 设备用默认地址 0 响应主机。 ⑨ 主机通过端点 0 读取设备描述符。 ⑩ 主机给设备分配唯一 USB 地址。 ⑪ 主机继续读取配置描述符、接口描述符、端点描述符。 ⑫ 主机选择一个配置,使设备进入配置完成状态。

简单说就是:

插入 → 复位 → 默认地址通信 → 分配新地址 → 读取描述符 → 设置配置 → 正常工作

3. 设备拔出时

设备拔出时,Hub 也会通知主机。

主机会:

禁用该端口 释放设备占用的地址和资源 更新本地拓扑结构 通知驱动设备已移除

五、USB 传输与数据包格式

USB 通信中,数据必须组织成包。

教材说,所有数据包前面都有同步字节,随后是 PID。

同步字段 → PID → 其他字段

PID 是:Packet Identifier数据包识别字段(有点像操作系统进程里面的syscall的处理方法编号,但是也是差不多的识别作用)

用来说明这个包是什么类型。

1. PID 类型

常见 PID,可以按类别记。标记包 Token

其中:

OUT:主机 → 设备 IN:设备 → 主机 SETUP:控制请求开始 SOF:Start of Frame,帧开始

握手包 Handshake

ACK 表示:我收到了,而且没错。

NAK 表示:我现在没准备好,或者暂时没有数据。

STALL 表示:这个请求我不支持,或者端点被禁止。

这…这…这…都是我们计网学过的东西啊,第三章!!!我死去的记忆又回来了

数据包 Data

DATA0 和 DATA1 交替使用,是为了检测重复包或丢包。

例如主机发了 DATA0,设备收到后回 ACK。如果 ACK 丢了,主机可能重发 DATA0。设备看到同步位没变,就知道这是重复包,不会重复处理。

特殊包 Special

2. USB 数据包格式

教材图 7.8 画了几种包格式。

8.3 USB控制总线 图 1

标记包 Token Packet

一般包括:

PID ,USB ,地址端点号 , CRC5

它的作用是说明:

这次通信找哪个设备? 找这个设备的哪个端点? 这次是 IN、OUT 还是 SETUP?

USB 地址是 7 位,所以最多:2^7 = 128 个地址

但 0 是默认地址,所以正常最多连接:127 个设备

端点号是 4 位,所以端点号范围:0 ~ 15

数据包 Data Packet

教材中数据字段最大可到 1023 字节,这对应的是当时 USB 规范下的包大小描述。

CRC16 用来做数据校验。

握手包 Handshake Packet

握手包比较简单:PID

比如 ACK、NAK、STALL,本身不需要携带大量数据。

帧起始包 SOF Packet

USB 主机会周期性发送 SOF,用来标识帧开始。

3. CRC5 和 CRC16

教材说 USB 使用两种 CRC:CRC5,CRC16

CRC5 用于:标记包、帧起始包等短字段校验

CRC16 用于:数据包的数据字段校验

可以这样记:

短控制信息用 CRC5; 真正的数据内容用 CRC16。

4. ACK / NAK 和停等流控

教材最后讲了 ACK 和 NAK 的作用。

USB 设备收到主机发来的数据包后:

正确收到 → 回 ACK 不能接收 / 没数据 → 回 NAK 端点错误或禁止 → 回 STALL

如果主机收到 NAK,就会等待一段时间后重新尝试。

这种方式叫:

停等式数据流控制 Stop and Wait Flow Control

它的核心是:(计网第三章还是第四章说过的GBN回退N步,还有SR选择重传机制,一定要看喔)

发送下一个数据包前,必须等上一个数据包的响应。

这样可以提高可靠性,但效率不如连续发送高。

六、USB 的发展现状

教材这里是按当时背景写的,说 USB 2.0 在 2000 年发布,最高速率达到:480 Mb/s

USB 2.0 基本可以满足当时绝大多数外设需求,比如:

数码相机 外置硬盘 扫描仪 MODEM 游戏手柄 键盘鼠标

并预测 USB 会逐渐取代传统串口和并口。

从学习角度,要掌握的是:USB 的出现,是为了统一外设接口,支持热插拔、即插即用和高速串行连接。

七、IEEE 1394 总线

IEEE 1394 也是一种高速外总线。

它有几个常见名字:

IEEE 1394 FireWire i.LINK

其中:FireWire 常用于 Apple 领域

i.LINK 常用于消费电子领域

1. IEEE 1394 的用途

IEEE 1394 最初由 Apple 开发,目的是替代并行 SCSI,后来被广泛用于:

视频设备 音频设备 数字摄像机 高速外部存储 多媒体数据传输

教材说它可以达到:

100 Mb/s 200 Mb/s 400 Mb/s

后来的 IEEE 1394b 可进一步提高到:

800 Mb/s 1.6 Gb/s 3.2 Gb/s

2. IEEE 1394 的 OHCI 结构

教材讲了 IEEE 1394 的开放主控制器接口:OHCI

它分成四个部分:

物理层 链路层 事务层 串行总线管理

物理层

作用:

提供设备和线缆之间的电气、机械连接; 完成数据发送和接收; 保证设备能够访问总线。

可以理解成“线怎么接、电信号怎么传”。

链路层

作用:负责数据包确认 定址 数据校验 数据分帧

它比物理层更接近“数据包”的处理。

事务层

作用:处理异步数据包,提供 Read、Write、Lock 命令

其中:

Read:向对方读取数据 Write:向对方写入数据 Lock:用于读写组合或同步操作

串行总线管理

作用:

管理总线控制 设备供电 优化定时 分配同步通道 ID 错误提示

可以理解成 IEEE 1394 总线的管理层。

3. IEEE 1394 的同步和异步传输

IEEE 1394 支持两种数据传输:

同步传输 异步传输

异步传输

异步传输时,发送方和接收方先交换地址,然后传数据。

收到数据后,接收方要返回确认信息。

如果没收到,系统会进行错误恢复。

特点:可靠,适合普通数据传输

同步传输

同步传输时,发送方先获得一个固定带宽的数据通道,然后把通道 ID 附加到数据中。

接收方只接收对应 ID 的数据流。

特点:

实时性更好 优先级更高 适合音频视频

所以 IEEE 1394 曾经很适合 DV 摄像机、音视频设备。

4. IEEE 1394 的主要特点

可以总结为:

高速 支持同步和异步传输 支持点对点传输 拓扑灵活 支持热插拔 支持即插即用 支持公平仲裁 供电方式灵活

教材说 IEEE 1394 有 6 条线:2 条供电线,4 条数据线