USB基础概念

USB基础概念 [!NOTE] 在学习USB开发的时候,因为涉及到很多未接触过的概念以及本人存在的一些思维定势,导致在学习过程中遇到了很多问题。为了防止以后遗忘,也为后人学习提供一些参考思路,现将USB的一些基础概念整理成文。本文的核心目标是能够帮助初学者辅助理解USB的编程。 [!CAUTION] 因个人实际学习需要,本文内容主要关注USB 2.0,且对于OTG内容探讨较少,另外虽然会涉及物理层面的内容,但是在本文中不会过于详细探讨。此外因本人并非专业USB开发人员,个人水平有限,内容可能存在遗漏或错误,欢迎指正。 USB基础概念 USB组织架构 系统物理架构 系统逻辑组织 单设备逻辑组织 USB数据传输 设计概念 包 事务 传输 总结 参考资料 USB组织架构 系统物理架构 一个拥有USB功能的芯片中通常至少有一个USB控制器(USB Controller)。若该USB控制器可以运行在主机模式(HOST MODE),则其内部拥有一个根集线器(ROOT HUB),通过根集线器可以延伸出一个或多个下行端口(Downstream Port)。若该USB控制器只能运行在设备模式(DEVICE MODE),则其不存在根集线器,并仅提供一个上行端口(Upstream Port)。 每个端口(Port)至少有两根数据传输线D+/D-(以USB 2.0为例)。与I2C这类单端信号总线不同,**D+/D-**为差分数据线,它们传输大小相等、相位相反的信号,并且每个端口采用一对一连接,进行半双工通信。 部分芯片的USB控制器支持OTG(On-The-Go)功能,则该设备同时支持主机模式和设备模式,并可以在使用过程中进行切换。OTG接口通常还需要多一根ID引脚(ID Pin)来决定默认角色:当ID引脚接地时,设备默认作为主机(A-device);当ID引脚悬空时,设备默认作为从设备(B-device)。对于一个实际的USB物理端口,还应有VCC和GND两根供电线。 为了实现设备检测和传输速度识别,通过对数据传输线D+/D-的上下拉电阻来实现。USB主机的D+/D-两根线均使用15KΩ电阻下拉至GND。对于全速(Full Speed)或高速(High Speed)的USB设备,则使用1.5KΩ电阻将D+上拉至3.3V。对于低速(Low Speed)的USB设备,则使用1.5KΩ电阻将**D-上拉至3.3V。主机通过检测D+/D-**引脚的电平来判断是否有设备接入以及接入设备的初始工作速度。高速设备在连接初期会表现为全速设备,在与主机完成握手协商后,再切换到高速模式。 系统逻辑组织 USB(通用串行总线)的逻辑结构为一种分层星型结构,也称树形结构。 一个USB通信系统中有且仅有一个USB主机(USB HOST),系统中所有的通信均由主机发起和控制,它是这个树形结构的根节点。主机通过其内部的根集线器,在物理上会提供一个或多个下行端口(Downstream Port)。下行端口可用于连接USB 设备或USB 集线器。 一个USB通信系统中可以有多个USB设备(USB DEVICE)。设备不能主动与主机或其他设备通信,必须等待主机轮询,它们是这个树形结构的叶节点。 一个USB通信系统中可以有多个USB集线器(USB HUB)。一个USB集线器通常有一个上行端口(Upstream Port)和多个下行端口(Downstream Port)。其上行端口连接USB主机或上层集线器的下行端口,其下行端口可以连接USB设备或下层集线器。在通信过程中,集线器扮演着双重角色:对于上层而言,它是一个USB设备;对于下层而言,它扮演着简化版USB主机的角色(负责端口管理和信号中继)。尽管USB集线器可以层层级联,但USB协议规定这种拓扑的最大深度不能超过7层。USB集线器是树形结构的分支节点。 不过对于USB主机而言,在逻辑拓扑上所有的USB设备都是和USB主机直接相连的,通过访问不同的地址即可实现访问任意设备。 对于一个USB通信系统,包括USB集线器在内的所有设备不能超过127个,因为USB的寻址系统使用7位地址,最多可提供127个设备地址(地址0保留用于初始配置)。 单设备逻辑组织 对于某一个具体的USB设备而言,其在逻辑组织上存在一个四层组织,从上到下分别是:设备、配置、接口、端点,每个层次都有对应的描述符可用于发送给USB主机,在设备插入后进行发送用于设备的枚举。 [!CAUTION] 在下方的介绍中我会提供描述符的结构示例,但是并不会详细介绍每项具体是做什么的,事实上如果只是为了目前的初步学习,你也没必要认真看每一项,通常情况如果需要配置描述符的时候再去查就可以了。 设备(设备描述符):用于描述这是一个怎样的设备。里面包含了厂商ID(VID)、产品ID(PID),用于唯一标识设备型号,操作系统可以用它来寻找合适的驱动程序。除此之外,还可以在里面设置该设备的设备类 (Class)、子类 (SubClass)、协议 (Protocol),用于粗略指出设备的类型(如果是复合设备,即拥有多种功能的设备,则不建议在设备描述符里面明确这一部分)。以下是设备描述符的结构: struct _DEVICE_DESCRIPTOR_STRUCT { BYTE bLength; //设备描述符的字节数大小,为0x12 BYTE bDescriptorType; //描述符类型编号,为0x01 WORD bcdUSB; //USB版本号,表示了本设备能适用于那种协议,例如 0x0200 代表 USB 2.0 BYTE bDeviceClass; //USB分配的设备类代码,0x01~0xfe为标准设备类,0xff为厂商自定义类型 BYTE bDeviceSubClass; //usb分配的子类代码,同上,值由USB规定和分配的 BYTE bDeviceProtocol; //USB分配的设备协议代码,同上 //上面三个字段的配置,如果设备类定义在接口描述符中,则设备描述符中的这些字段应设置为 0x00 BYTE bMaxPacketSize0; //端点0的最大包长 WORD idVendor; //厂商编号 WORD idProduct; //产品编号 WORD bcdDevice; //设备出厂编号 BYTE iManufacturer; //描述厂商字符串的索引 BYTE iProduct; //描述产品字符串的索引 BYTE iSerialNumber; //描述设备序列号字符串的索引 BYTE bNumConfigurations;//可能的配置数量 } 配置(配置描述符):代表设备的一种工作模式,一个设备可以有一个或多个配置,但是同一时间只能有一个配置是激活的。配置描述符会指定设备的供电方式、最大功耗、接口数量。切换配置会改变整个设备的功耗、接口等特性。通常情况,一个设备有一个配置就够了,不过在部分需要实现设备高低功耗切换或使用不同传输模式的情况下,就可以设置多个配置。以下是配置描述符的结构: ...

September 4, 2025 · 云雾海