说明首次连接电缆时要做什么的 USB 规范到底在哪里?

电器工程 USB USB设备
2022-01-10 21:08:17

所以我知道位于USB.org 站点的USB 2.0 规范

我有点懒惰和不耐烦。有人能告诉我在连接 USB 电缆时去哪里可以准确了解我的外围设备的期望吗?

例如,如果我的外围设备是打印机,我如何告诉另一端的计算机刚刚连接了打印机(我想带有特定型号描述)?比,在计算机中,打印机驱动程序如何知道哪个 USB 端口连接到打印机?

我的应用程序实际上是 USB MIDI。我也得到了这个USB-MIDI 文档,但我缺乏更基本的 USB 协议。

仅供参考,我使用的 USB 芯片是FTDI FT220x,它连接到 ADSP-21479 SHArC 的 SPI。我们现在将它简单地用于使用 PC(运行 TeraTerm)作为“控制台”进行文本通信。我可以访问设置 SPI 端口并连接到 FTDI 芯片的代码,但是没有代码可以进行任何初始通信。我不知道 FT220x 第一次连接到 PC 时会做什么。

我不喜欢阅读和学习,但我想知道从哪里开始阅读,而且 100 MB 的 USB 规格太大而无法射击。真诚感谢任何人提供可操作的帮助。

2个回答

USB 有多个层,在USB 2.0 规范中进行了描述。如果你熟悉 OSI 分层网络模型,你可以这样想:

  • 会话层 = 第 10 章 USB 主机硬件和软件(设备驱动程序)
  • 传输层 = 第 9 章 USB 设备框架
  • 网络层 = 第 8 章协议层(比特流)
  • 数据链路层 = 第 7 章电气(电路)
  • 物理层 = 第 6 章机械(电缆和连接器)

从概念上讲,USB 基于称为Endpoints的数据流,它可以是 IN(到主机)或 OUT(从主机)。每个设备都有端点 0,用于控制和状态。设备可能具有用于应用程序数据的附加端点。每个端点的行为就像一个 FIFO 缓冲区。

数据在端点上以Bulk(如 TCP/IP,保证每个字节以正确的顺序到达)或Isochronous(如 UDP/IP,保证新鲜但可能丢弃数据包)的形式在端点上传输。有一种误导性地命名为“中断”传输类型,它实际上只是由主机轮询。

USB 2.0 使用差分对进行数据链路。我不会详细介绍,因为 USB 2.0 规范第 7 章对此进行了介绍。通常在 PCB 布局中,我们将其视为长度匹配的差分对,并放入任何 USB PHY(物理接口)正在使用中。USB 外围设备在 D+ 或 D- 线之一上使用高阻值电阻来通知主机它是高速或低速外围设备。

USB 主机发现设备存在后不久,主机会从该设备请求一堆描述符这是由 FTDI 芯片在幕后处理的。描述在第 9.5 章中描述。其中包括设备描述符配置描述符接口描述符端点描述符字符串描述符,甚至可能是HID 报告描述符

设备描述符包括USB VID(供应商标识)和PID(产品标识)编号。操作系统使用这对数字 VID_PID 来确定该设备应使用哪个设备驱动程序。请注意,VID 号码是由 USB 实施者论坛的成员颁发的,所以如果您是个人发明者,这会是一个问题。

此外,还有 HID(人机接口设备)类驱动程序,它为键盘/鼠标等提供某种通用输入,以及任何通用输入/输出。HID 的一个优点是它不需要提供自定义设备驱动程序,但与自定义批量驱动程序相比,它的吞吐量有所限制。关于 HID 描述符还有一个完整的其他规范文档;HID 使用表 文档,其中详细说明了描述给定人机接口设备上可用的各种功能的所有代码编号。

FT220X 数据表等 FTDI 芯片提供 USB“串行接口引擎”(不要与 SPI 串行或 RS232 串行混淆)。这处理了第 6、7 和 8 章中描述的大部分低级内容。

FTDI 使用 EEPROM(在 FT2232H 上为片外,在 FT220X 上为片上)来包含一些进入描述符的信息。您可以自定义 VID/PID 值,并提供自定义描述字符串。

USB“伙伴”(主机和设备)的行为和交互分散在 USB 规范中。获得一些基础的最好方法是查看第 9 章的“设备框架”,它在第 10 章和第 11 章中描述了可能的(强制的)设备状态(图 9-1)和主机(和集线器)框架。忽略协议细节(管道/事务类型/抽象 OSI 协议层、PCB 布局等),通过研究端口状态图(图 11-10)可以更好地掌握初始交互。

本质上,如果主机和设备之间没有连接电缆,则主机端口处于“Powered State”(VBUS 为 ON),但“Disconnected”。D+ 和 D- 线通过 15k 下拉保持在低位。

连接电缆后,VBUS 进入设备。设备识别它正在连接,并通过将 D 线之一拉高来发出“连接”事件的信号,如果是 FS/HS 设备,则为 D+,如果是 LS 设备,则为 D-。

在某个端口上拉 D+/- 线会给主机软件一个中断,报告“端口状态变化”。主机软件(通常是 ehci.sys)然后在该特定端口上启动“端口重置”排序成功完成“USB 端口重置”后,主机端口启用 USB 通信。端口变为活动状态(帧数据包开始流出)。

使用 USB 协议,主机为该设备分配唯一地址,并读取“设备描述符”。这将启动“设备枚举”过程。设备描述符包含有关它属于哪个设备类的信息(HID、COM、MIDI、打印机等),以及该特定设备的 VID/PID,以及一堆其他信息,请参见表 9-8。

获得设备类和 VID/PID 后,主机软件尝试在设备注册表中匹配此信息,并加载相应的 DEVICE 驱动程序,可以是通用驱动程序,也可以是供应商特定驱动程序(如果存在)。然后设备驱动程序通过选择以设置“设备配置”结束的设备接口来完成枚举过程。显然,整个 USB 通信仅在此特定端口后被识别,即使所有数据包都广播到所有启用的端口。

以上就是USB连接协议的大体框架。为任何特定目的(如 MIDI)打包数据是另一回事,如果系统获得正确的设备类,它可以在应用程序级别或设备驱动程序级别处理。要获得本机 MIDI 通信,设备必须在其描述符中包含此类并遵循所有MIDI 类定义