USB规格到底在哪里说明首次连接电缆时的操作?


15

于是,我知道了USB 2.0规范位于USB.org网站

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

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

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

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

我不快乐阅读和学习,但我想知道从哪里开始阅读,和100 MB的USB规范是太大的目标进行拍摄的。衷心感谢任何人提供可行的帮助。


1
因此,您只是对FTDI FT220x在幕后所做的事情感到好奇,对吗?由于FTDI会为您处理很多USB设备,因此它对您的工作也有一些限制。我已经使用FT2232H系列已有一段时间,将尝试解释我所知道的...
MarkU

我最终想做的是使用这个USB端口,该端口已经足够聪明,可以将文本来回发送到运行TeraTerm的PC,我希望做的是使用相同的USB连接器执行USB MIDI。我需要了解如何将数据“打包”为32位数据包,但我认为(仍然认为)必须有某种协议可以告诉另一端这是USB MIDI设备。(到目前为止,我只是对USB的基本
知识一无所知

Answers:


21

USB具有多个层,在USB 2.0规范中进行了介绍。如果您熟悉OSI分层网络模型,则可以这样考虑:

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

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

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

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使用表 文档,其中详细说明了描述给定人机接口设备上可用的各种功能的所有代码。

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

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


6
我喜欢摘要。我必须在几周的时间内阅读《整个2.0规范》(我记得有1000多页),因为我必须自己弄清楚所有这些废话。我不得不说,这不是一个愉快的经历。(在我的情况下,不能使用HID。)也没有关于该主题的好书。我讨厌扬·阿克森(Jan Axelson)关于USB的书,并认为她的书“几乎完全没有用”,因为它是从头开始尝试作为嵌入式微型计算机进行这项工作的人的。否则,它实际上几乎一文不值。如果您知道一本适合实施者(定制硬件)的好书,那么我很高兴听到一个标题!+1
jonk

1
根据Op的潜在市场,VID / PID是最大的挑战。使用Axelsons方法论的意义在于,您可以使用她的VID(您自己的费用为$ 3.5k)并免费请求一个或多个她的PID。您还可以从Microchip / Atmel,FTDI和TI等组织(基于其VID)请求PID。IMO最好的书是Intel的“ USB设计实例”,虽然有点长,但对USB 2.x很有用。不幸的是,由于Visual Studio对其版本进行了更改,因此许多代码示例都无法使用。
Jack Creasey

1
业余爱好者获得VID / PID的最佳方法是使用LUFA(免费):fourwalledcubicle.com/files/LUFA/Doc/130303/html/… ..这些不能在商业产品中使用,但是适用于家庭/演示用途,可以在很大程度上控制碰撞。
Jack Creasey

1
PS。一个很棒的介绍是使用“嵌入式USB设计示例:FTDI发布的:ftdichip.com/Support/Documents/TechnicalPublications/… ...这有许多有用的示例(当然基于FTDI设备)以及所有相关的示例工作文件,包括使用PSOC控制器
杰克·克雷西

1
请注意,如果USB设备是自供电的,则必须在施加D +或D-上拉电阻之前等到检测到VBUS电压。我在此方面的认证失败。
亚当·豪恩

4

USB“伙伴”(主机和设备)的行为和交互分散在USB规范中。取得基础的最好方法是查看第9章“设备框架”,在第10和11章中介绍可能的(强制)设备状态(图9-1)和Host(和集线器)框架。协议详细信息(管道/事务类型/抽象的OSI协议层,PCB布局等),可以通过研究端口状态图来更好地控制初始交互(图11-10)。

本质上,如果主机与设备之间未连接电缆,则主机端口处于“已供电状态”(VBUS为ON),但处于“已断开连接”状态。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类定义

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.