【STM32H7】第8章 学习USB协议栈前要了解的基础知识
论坛原始地址(持续更新):http://www.armbbs.cn/forum.php?mod=viewthread&tid=99710
第8章 学习USB协议栈前要了解的基础知识
本章节为大家讲解USB基础知识点,学习USB前,非常有必要有个系统的认识。
8.1初学者重要提示
8.2 USB历史
8.3 USB架构
8.4 USB硬件
8.5 USB电流
8.6 USB传输速度
8.7 USB通信(重要)
8.8 USB描述符
8.9 USB类
8.10 总结
8.1 初学者重要提示
- USB1.1和USB2.0规格书以及Cypress做的中文版USB文档,非常推荐大家学习:
http://www.armbbs.cn/forum.php?mod=viewthread&tid=100698
- USB初学 -- 入门篇 (USB基础知识速览)
http://www.armbbs.cn/forum.php?mod=viewthread&tid=100687 。
- 文献参考:
https://en.wikipedia.org/wiki/USB
https://zh.wikipedia.org/wiki/USB
https://en.wikipedia.org/wiki/USB_hardware
8.2 USB历史
1994年,由七个公司组成的小组开始开发USB:Compaq,DEC,IBM,Intel,Microsoft,NEC和Nortel。目标是通过替换PC背面的众多连接器,解决现有接口的可用性问题以及简化所有连接到USB设备的软件配置,从根本上简化外部设备连接至PC,并且可以为外部设备提供更高的数据速率。 阿杰·巴特(Ajay Bhatt)和他的团队在英特尔制定该标准。第一批集成电路支持USB的产品由英特尔于1995年生产。
最初的USB 1.0规范于1996年1月推出,它定义了1.5 Mbit / s 低速和12 Mbit / s全速的数据传输速率 。12 Mbit / s适用于打印机和软盘驱动器等高速设备,1.5 Mbit / s适用于键盘,鼠标和操纵杆等低数据速率设备。Microsoft Windows 95,OSR 2.1在1997年8月为设备提供了OEM支持。USB的第一个广泛使用的版本是1998年9月发布的1.1。苹果的iMac是第一个带有USB的主流产品,而iMac的成功推广了USB本身。在苹果公司决定从iMac上删除所有兼容端口之后,许多PC制造商开始构建兼容版PC,这导致使用USB成为PC市场标准。
USB 2.0规范于2000年4月发布,并在2001年底被USB-IF批准。惠普,英特尔,朗讯科技(现为诺基亚),NEC和飞利浦共同领导了该计划。开发更高的数据传输速率,从而使规范达到480 Mbit / s,是原始USB 1.1规范的40倍。
USB 3.0规范发布于2008年11月12日,其主要目标是提高数据传输速率(高达5 Gbit / s),减少电力消耗,提高输出功率,并且向后兼容USB 2.0。USB 3.0包括与USB 2.0总线类似的新型高速总线SuperSpeed。因此,新版本也称为SuperSpeed。首批配备USB 3.0的设备于2010年1月推出。截止到2008年,全球市场上大约有60亿个USB端口和接口,每年大约销售20亿个。
USB 3.1规范于2013年7月发布。2014年12月,USB-IF向IEC(TC100–音频,视频和多媒体系统和设备)提交了USB 3.1,USB Power Delivery 2.0和USB-C规范,以纳入国际标准IEC 62680(通用串行总线接口,用于数据和电源),目前基于USB 2.0。
USB 3.2规范于2017年9月发布。
USB4规范于2019年8月29日由USB-IF发布。
8.3 USB架构
系统中只能有一个主机,并且与设备进行的通信是从主机的角度进行的。主机是“上行” 组件,设备则是“下行” 组件,数据从主机转移到外设的操作是 OUT 传输。数据从外设转移到主机的操作是 IN 传输。主机(尤其是主控制器)控制着所有通信并向设备发出指令。共有三种常见的 USB 主控制器:
- 通用主控制器接口(UHCI): 由 Intel 生产,适用于 USB 1.0 和 USB 1.1。使用 UHCI 时需要得到 Intel 的许可。该控制器支持低速模式和全速模式。
- 开放主控制器接口(OHCI): 由 Compaq、 Microsoft 和 National Semiconductor 生产, 适用于 USB 1.0 和 1.1。该控制器支持低速模式和全速模式, 并且它的效率比 UHCI 更高, 因为可以执行更多硬件功能。
- 扩展型主控制器接口(EHCI): 在 USB-IF 要求发布单一主控制器规范后,已经生产了该控制器,它适用于 USB2.0。 EHCI 仅支持高速传输,并且将低速和全速传输委托给 OHCI 或 UHCI 控制器执行。
可以将一个或多个设备连接至一个主机。每个设备均有一个地址,并且会对寻址它的主机指令做出响应。设备预计具有某种形式的功能,并不简单作为一个被动组件。设备具有一个上行端口。端口是设备上的 USB 物理连接点。集线器是一个专用设备,允许主机同总线上的多个外设进行通信。与 USB 外设(例如鼠标)具有实际功能不同,集线器设备是透明的,并且作为直通连接使用。集线器也作为主机和设备间的通道。集线器具有多个连接点,从而可以将多个设备连接到一个主机上。一个集线器可以将与下行设备进行的通信,重复使用到一个上行端口和最多七个下行端口。但集线器并没有主机功能。
通过使用集线器最多能够将 127 个设备连接至主控制器上。连接设备的数目限制由 USB 协议决定,它限制设备地址为 7 位。另外,由于集线器的时间限制和电缆传播的延迟,因此最多只能将五个集线器链接在一起。下图显示的是 USB 层次系统的框图,它表示集线器和设备的链接限制。大家可以看到,随着集线器的链接限制,层次系统也限制为七层。
USB设备分为以下几个类别:
- Hubs
Hubs集线器(USB扩展设备)提供了附加的连接点,并从用户角度简化了USB连接。每个集线器将单个连接点转换为多个连接点,称为端口。
- Functions
Functions为系统提供了发送或接收数据和控制信息的功能。每个功能都包含描述设备功能和资源要求的配置信息。
- Composite Devices
复合设备是实现多种功能并包括嵌入式集线器的物理程序包。复合设备在主机上看起来像是带有一个或多个不可移动USB设备的集线器。复合设备支持不止一种类别,因此为主机提供了不止一种功能。
对于以主机为中心的开发,USB连接看起来像是星形网络。集线器不会引起任何编程复杂性,并且对程序员而言是透明的。无论是直接连接到根集线器还是通过中间集线器连接,USB设备的工作方式都相同。在该主/从网络中,所有USB设备都可用作可寻址节点。只有主机可以在网络中启动数据传输。
注意:
- 任何USB系统中仅存在一个主机。
- 在第7层中,只能启用功能。
- 符合设备占据两层。
8.4 USB硬件
市场是上USB连机器种类非常多,常用的如下:
Type A,Type B是四个引脚,对于的引脚定义如下:
Mini 和 Micro 连接器具有五个(而不是 4 个)引脚。额外引脚是 ID 引脚,用于识别 OTG 应用中的主机和设备,此引脚接地表示主机,未连接表示设备。
更多的USB接口如下:
8.5 USB电流
USB2.0和USB3.0支持的电压范围和最大电流如下:
注:BC1.2是Battery Charging (BC) 1.2,PD是Power Delivery。
8.6 USB传输速度
不同USB版本的速度如下:
8.7 USB通信(重要)
USB是轮询总线,USB主机发起所有数据交换。数据往返于USB设备中的端点。USB主机中的客户端将数据存储在缓冲区中,但没有端点。USB主机和外围USB设备具有不同的层,如下图所示。层之间的连接是每个层之间的设备接口。在连接之间,使用Pipes传输数据。
USB数据是由二进制数字串构成的,首先数字串构成域,域再构成包Packet(令牌包、数据包、握手包),包再构成事务Transaction(IN、OUT、SETUP),事务再构成传输Transfer(中断传输、同步传输、批量传输和控制传输),传输最后再构成管道Pipe。下图可以形象的展示它们之间的关系:
8.7.1 管道(Pipes)
管道是主机与设备端点数据传输的连接通道,代表了主机的数据缓冲区与设备端点之间交换数据的能力。管道包括数据流管道和消息管道。
- Message Pipes:消息管道具有定义的USB格式,并且受主机控制。消息管道允许数据双向流动,并且仅支持控制传输。
- Stream Pipes:流管道没有定义的USB格式,可以由主机或设备控制。数据流具有预定义的方向,即IN或OUT。流管道支持中断传输,同步传输和批量传输。
将USB设备连接到USB总线并由USB主机配置后,大多数管道就存在了。管道源自主机客户端中的数据缓冲区,并在USB设备端点的内部终止。
8.7.2 传输(Transfers)
传输(数据流类型管道)可以包含一个或多个事务,管道支持以下传输类型之一:
- 控制传输通常用于设置USB设备。它们始终使用IN / OUT端点0。
- 中断传输可用于定期发送数据的地方,例如用于状态更新。
- 同步传输传输实时数据,例如音频和视频。它们具有固定带宽,但没有错误检测。
- 批量传输可用于时间不重要的数据发送,例如打印机。
8.7.3 控制传输(Control Transfers)
控制传输是双向传输,供主机使用,以便主机使用IN和OUT端点0向设备发送和从设备请求配置信息。每个控制转移包括两个及其事务。控制端点数据的最大数据包大小:
- 低速USB是8个字节。
- 全速USB是8,16,32或者64字节。
- 高速USB是64字节。
通常,应用程序软件不使用这种类型的传输。控制传输的三个阶段:
1、SETUP阶段携带8个字节被称为设置包,定义请求,以及指定多少数据应在数据阶段被转移。
2、该数据阶段是可选的。如果存在,它将始终从包含DATA1数据包的事务开始。然后,事务类型在DATA0和DATA1之间交替,直到所有必需的数据都已传输。
3、STATUS阶段是含有零长度分组DATA1事务。如果DATA阶段为IN,则STATUS阶段为OUT,反之亦然。
8.7.4 中断传输(Interrrupt Transfers)
中断传输与设备之间的延迟有限。在USB中,中断传输或中断管道具有以下定义的轮询速率:
- 全速和低速分别为1ms和255ms。
- 高速端点为125μs至4096ms。
中断端点数据的最大包大小为:
- 全速USB最大64字节。
- 高速USB最大1024字节。
开发人员可以定义主机多久请求设备进行数据传输。例如,对于鼠标,可以保证每10 ms的数据传输速率。但是,定义轮询速率并不能保证每10毫秒传输一次数据,而是保证交易将发生在第十帧内的某个位置。因此,USB事务有一定的抖动。
通常,中断传输数据由事件通知,字符和来自设备的坐标组成。
8.7.5 同步传输(Isochronous Transfers)
同步传输用于传输实时信息,例如音频和视频数据,并且必须以恒定的速率发送。为USB等时数据流分配了USB带宽的专用部分,确保按所需的速率传送数据。同步管道在每个帧中发送一个新的数据包,而不管最后一个包的成功或失败。
等时端点数据的最大数据包大小为:
- 全速最大1023字节。
- 高速最大1024字节。
同步传输没有错误检测。电气传输中的任何错误均无法纠正。同步传输也受定时抖动的影响。
8.7.6 批量传输(Bulk Transfers)
批量传输用于控制,中断和同步传输以外的数据。使用错误检测可以在硬件级别上确保可靠的数据交换。
数据的传输方式与中断传输的方式相同,但是没有定义轮询速率。批量传输占用了其他传输完成后的所有可用带宽。如果总线非常繁忙,则批量传输可能会延迟。
批量端点数据的最大数据包大小为:
- 全速USB支持8、16、32或64字节。
- 高速USB支持512字节。
对于低速和全速端点,以下内容有效:如果总线空闲,则可以在单个1ms帧中进行多个批量传输(中断和同步传输限制为每帧最多一个数据包)。
例如,批量传输将数据发送到打印机。只要在合理的时间范围内打印数据,确切的传输速率就不重要。
8.7.7 事务(Transaction)
事务:分别有IN事务、OUT事务和SETUP事务三大事务,每一种事务都由令牌包、数据包、握手包三个阶段构成:
- 令牌包(Token Packet)是定义事务类型,方向,设备地址和端点。
- 数据在数据包(Data Packet)中传输。
- 事务的最终状态在握手数据包(Handshake Packet)中确认。
在事务中,数据从USB主机传输到USB设备,反之亦然。传输方向在USB主机发送的令牌包中指定。然后,发送端发送一个数据包或指示它没有要传输的数据。通常,目的地以握手包作为响应,指示传输是否成功。
8.7.8 包(Packets)
每个数据包以当前传输速率传输整数个字节。数据包以同步模式开始,然后是数据包的数据字节,最后以数据包结束(EOP)信号结束。
所有USB数据包模式都首先发送最低有效位。在数据包之前和之后,总线处于空闲状态。
特殊的数据包是帧开始数据包(SOF),它将USB总线分为多个时间段。每个管道在每个帧中分配一个插槽。帧开始数据包在全速链路上每1ms发送一次。高速时,将1ms帧分为8个每帧125μs的微帧。在每个微帧的开头使用相同的帧号发送帧开始数据包。帧号每1ms增加一次。
8.7.9 域(field)
域是USB数据最小的单位,由若干位组成,域可分为七种类型:
- 同步域(SYNC),8位,值固定为0000 0001,用于本地时钟与输入同步,标志一个包的起始。
- 标识域(PID),由四位标识符+四位标识符反码构成,表明包的类型和格式,可以计算出USB的标识码有16种。
- 地址域(ADDR):七位地址,代表了设备在主机上的地址,地址000 0000被命名为零地址,是任何一个设备第一次连接到主机时,在被主机配置、枚举前的默认地址,因此一个USB主机只能接127个设备。
- 端点域(ENDP),4位,由此可知一个USB设备有的端点数量最大为16个。
- 帧号域(FRAM),11位,每一个帧都有一个特定的帧号,帧号域最大容量0x800,帧号连续增加,到0x7ff后从自动0开始,对于同步传输有重要意义。
- 数据域(DATA):长度为0~1023字节,在不同的传输类型中,数据域的长度各不相同,但必须为整数个字节的长度。
- 校验域(CRC):对令牌包(CRC5)和数据包(CRC16)中非PID域进行校验的一种方法,CRC校验在通讯中应用很泛,是一种很好的校验方法,至于具体的校验方法请查阅相关资料,只须注意CRC码的除法是模2运算,不同于10进制中的除法。
8.7.10 端点(Endpoints)
端点,实际上是设备硬件上具有一定大小的数据缓冲区。USB系统中,每一个端点都有唯一的地址,是有设备地址和端点号给出的。默认设置端点0用作控制传输端点,其他端点必须在设备被主机配置后才能使用。
端点可以描述为数据源或接收器,并且仅存在于USB设备中。可以从USB主机接收或等待将其存储在端点上的数据。可以将端点配置为USB规范中定义的四种传输类型(控制传输,中断传输,同步传输和批量传输)。在硬件限制内,可以使用USB协议栈配置端点(例如,将端点限制为某种传输类型)。
端点充当一种缓冲区。例如,USB主机的客户端可以将数据发送到端点1。来自USB主机的数据将发送到OUT端点1。准备就绪后,微控制器上的程序将立即读取数据。由于程序无法自由访问USB总线(USB总线由USB主机控制),因此必须将返回数据写入IN端点1。IN端点1中的数据将保留在那里,直到主机向端点1发送一个IN数据包以请求数据为止。
这些规则适用于所有微控制器设备:
- 一个设备最多可以有16个OUT和16个IN端点。
- 每个端点只能有一个传输方向。
- 端点 0仅用于控制传输,不能分配任何其他功能。
- OUT始终是指从主机指向设备的方向。
- IN始终指指向主机的方向。
注意:
- 端点的总数和每个端点支持的功能由硬件定义。
8.8 USB描述符
USB设备使用描述符报告其属性,描述符是具有定义格式的数据结构。每个描述符开头字节是此描述符的字节数,之后是描述符类型字段。
将USB设备连接到USB总线时,主机通过枚举来识别和配置设备。设备插入USB主机后,USB主机立即发送设置请求。系统将指示该设备选择配置和接口,以匹配USB主机上运行的应用程序。选择配置和接口后,设备必须为活动的端点提供服务,以此与USB主机交换数据。
常用的描述符如下:
- 设备描述符。
- 配置描述符。
- 接口描述符。
- 一个或多个端点描述符。
具体各种描述符的定义,在后面章节为大家说明。
8.9 USB类
常用的USB类如下:
其中HID,CDC,Audio,MSC等类,将在后续章节详细说明。
8.10 总结
本章就为大家介绍这么多,涉及到的知识点比较多,需要大家看本章开头提供的参考文档地址来进一步的熟悉。