计组与微机控制
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 画了几种包格式。

标记包 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 条数据线
