ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【STM32F429】第8章 学习USB协议栈前要了解的基础知识

2021-02-24 17:33:51  阅读:143  来源: 互联网

标签:USB 主机 传输 端点 栈前 数据包 STM32F429 设备


论坛原始地址(持续更新):http://www.armbbs.cn/forum.php?mod=viewthread&tid=99710

第8章   学习USB协议栈前要了解的基础知识

本章节为大家讲解USB基础知识点,学习USB前,非常有必要有个系统的认识。

目录

第8章   学习USB协议栈前要了解的基础知识

8.1   初学者重要提示

8.2   USB历史

8.3   USB架构

8.4   USB硬件

8.5   USB电流

8.6   USB传输速度

8.7   USB通信(重要)

8.7.1      管道(Pipes)

8.7.2      传输(Transfers)

8.7.3      控制传输(Control Transfers)

8.7.4      中断传输(Interrrupt Transfers)

8.7.5      同步传输(Isochronous Transfers)

8.7.6      批量传输(Bulk Transfers)

8.7.7      事务(Transaction)

8.7.8      包(Packets)

8.7.9  域(field)

8.7.10 端点(Endpoints)

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 总结

本章就为大家介绍这么多,涉及到的知识点比较多,需要大家看本章开头提供的参考文档地址来进一步的熟悉。

 

标签:USB,主机,传输,端点,栈前,数据包,STM32F429,设备
来源: https://blog.csdn.net/Simon223/article/details/114029465

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有