热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【STM32H7】第4章ThreadXUSBX协议栈基础知识

教程更新中:http:www.armbbs.cnforum.php?modviewthread&tid108546第4章ThreadXUSBX协议栈基础知识本章节

教程更新中:http://www.armbbs.cn/forum.php?mod=viewthread&tid=108546

第4章   ThreadX USBX协议栈基础知识

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

目录

4.1   初学者重要提示

4.2   USB历史

4.3   USB架构

4.4   USB硬件

4.5   USB电流

4.6   USB传输速度

4.7   USB通信(重要)

4.7.1      管道(Pipes)

4.7.2      传输(Transfers)

4.7.3      控制传输(Control Transfers)

4.7.4      中断传输(Interrrupt Transfers)

4.7.5      同步传输(Isochronous Transfers)

4.7.6      批量传输(Bulk Transfers)

4.7.7      事务(Transaction)

4.7.8      包(Packets)

4.7.9  域(field)

4.7.10 端点(Endpoints)

4.8   USB描述符

4.9   USB类

4.10 总结




4.1   初学者重要提示

1、  USB1.1和USB2.0规格书以及Cypress做的中文版USB文档,非常推荐大家学习:

http://www.armbbs.cn/forum.php?mod=viewthread&tid=100698

2、  USB初学 -- 入门篇 (USB基础知识速览)

http://www.armbbs.cn/forum.php?mod=viewthread&tid=100687 。

3、  文献参考:

https://en.wikipedia.org/wiki/USB

https://zh.wikipedia.org/wiki/USB

https://en.wikipedia.org/wiki/USB_hardware

4.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发布。

 


4.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层中,只能启用功能。
  •   符合设备占据两层。

4.4   USB硬件

市场是上USB连机器种类非常多,常用的如下:

 

Type A,Type B是四个引脚,对于的引脚定义如下:

 

Mini 和 Micro 连接器具有五个(而不是 4 个)引脚。额外引脚是 ID 引脚,用于识别 OTG 应用中的主机和设备,此引脚接地表示主机,未连接表示设备。

 

更多的USB接口如下:

 

4.5   USB电流

USB2.0和USB3.0支持的电压范围和最大电流如下:

 

注:BC1.2是Battery Charging (BC) 1.2,PD是Power Delivery。

4.6   USB传输速度

不同USB版本的速度如下:

 

4.7   USB通信(重要)

USB是轮询总线,USB主机发起所有数据交换。数据往返于USB设备中的端点。USB主机中的客户端将数据存储在缓冲区中,但没有端点。USB主机和外围USB设备具有不同的层,如下图所示。层之间的连接是每个层之间的设备接口。在连接之间,使用Pipes传输数据。

 

USB数据是由二进制数字串构成的,首先数字串构成域,域再构成包Packet(令牌包、数据包、握手包),包再构成事务Transaction(IN、OUT、SETUP),事务再构成传输Transfer(中断传输、同步传输、批量传输和控制传输),传输最后再构成管道Pipe。下图可以形象的展示它们之间的关系:

 

4.7.1      管道(Pipes)

管道是主机与设备端点数据传输的连接通道,代表了主机的数据缓冲区与设备端点之间交换数据的能力。管道包括数据流管道和消息管道。

  •   Message Pipes:消息管道具有定义的USB格式,并且受主机控制。消息管道允许数据双向流动,并且仅支持控制传输。
  •   Stream Pipes:流管道没有定义的USB格式,可以由主机或设备控制。数据流具有预定义的方向,即IN或OUT。流管道支持中断传输,同步传输和批量传输。

将USB设备连接到USB总线并由USB主机配置后,大多数管道就存在了。管道源自主机客户端中的数据缓冲区,并在USB设备端点的内部终止。

4.7.2      传输(Transfers)

传输(数据流类型管道)可以包含一个或多个事务,管道支持以下传输类型之一:

  •   控制传输通常用于设置USB设备。它们始终使用IN / OUT端点0。
  •   中断传输可用于定期发送数据的地方,例如用于状态更新。
  •   同步传输传输实时数据,例如音频和视频。它们具有固定带宽,但没有错误检测。
  •   批量传输可用于时间不重要的数据发送,例如打印机。

4.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,反之亦然。

 

4.7.4      中断传输(Interrrupt Transfers)

中断传输与设备之间的延迟有限。在USB中,中断传输或中断管道具有以下定义的轮询速率:

  •   全速和低速分别为1ms和255ms。
  •   高速端点为125μs至4096ms。

中断端点数据的最大包大小为:

  •   全速USB最大64字节。
  •   高速USB最大1024字节。

开发人员可以定义主机多久请求设备进行数据传输。例如,对于鼠标,可以保证每10 ms的数据传输速率。但是,定义轮询速率并不能保证每10毫秒传输一次数据,而是保证交易将发生在第十帧内的某个位置。因此,USB事务有一定的抖动。

通常,中断传输数据由事件通知,字符和来自设备的坐标组成。

 

4.7.5      同步传输(Isochronous Transfers)

同步传输用于传输实时信息,例如音频和视频数据,并且必须以恒定的速率发送。为USB等时数据流分配了USB带宽的专用部分,确保按所需的速率传送数据。同步管道在每个帧中发送一个新的数据包,而不管最后一个包的成功或失败。

等时端点数据的最大数据包大小为:

  •   全速最大1023字节。
  •   高速最大1024字节。

同步传输没有错误检测。电气传输中的任何错误均无法纠正。同步传输也受定时抖动的影响。

 

4.7.6      批量传输(Bulk Transfers)

批量传输用于控制,中断和同步传输以外的数据。使用错误检测可以在硬件级别上确保可靠的数据交换。

数据的传输方式与中断传输的方式相同,但是没有定义轮询速率。批量传输占用了其他传输完成后的所有可用带宽。如果总线非常繁忙,则批量传输可能会延迟。

批量端点数据的最大数据包大小为:

  •   全速USB支持8、16、32或64字节。
  •   高速USB支持512字节。

对于低速和全速端点,以下内容有效:如果总线空闲,则可以在单个1ms帧中进行多个批量传输(中断和同步传输限制为每帧最多一个数据包)。

例如,批量传输将数据发送到打印机。只要在合理的时间范围内打印数据,确切的传输速率就不重要。

 

4.7.7      事务(Transaction)

事务:分别有IN事务、OUT事务和SETUP事务三大事务,每一种事务都由令牌包、数据包、握手包三个阶段构成:

  •   令牌包(Token Packet)是定义事务类型,方向,设备地址和端点。
  •   数据在数据包(Data Packet)中传输。
  •   事务的最终状态在握手数据包(Handshake Packet)中确认。

 

在事务中,数据从USB主机传输到USB设备,反之亦然。传输方向在USB主机发送的令牌包中指定。然后,发送端发送一个数据包或指示它没有要传输的数据。通常,目的地以握手包作为响应,指示传输是否成功。

4.7.8      包(Packets)

每个数据包以当前传输速率传输整数个字节。数据包以同步模式开始,然后是数据包的数据字节,最后以数据包结束(EOP)信号结束。

 

所有USB数据包模式都首先发送最低有效位。在数据包之前和之后,总线处于空闲状态。

 

特殊的数据包是帧开始数据包(SOF),它将USB总线分为多个时间段。每个管道在每个帧中分配一个插槽。帧开始数据包在全速链路上每1ms发送一次。高速时,将1ms帧分为8个每帧125μs的微帧。在每个微帧的开头使用相同的帧号发送帧开始数据包。帧号每1ms增加一次。

 

4.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进制中的除法。

 

4.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始终指指向主机的方向。

注意:

  •   端点的总数和每个端点支持的功能由硬件定义。

4.8   USB描述符

USB设备使用描述符报告其属性,描述符是具有定义格式的数据结构。每个描述符开头字节是此描述符的字节数,之后是描述符类型字段。

将USB设备连接到USB总线时,主机通过枚举来识别和配置设备。设备插入USB主机后,USB主机立即发送设置请求。系统将指示该设备选择配置和接口,以匹配USB主机上运行的应用程序。选择配置和接口后,设备必须为活动的端点提供服务,以此与USB主机交换数据。

常用的描述符如下:

  •   设备描述符。
  •   配置描述符。
  •   接口描述符。
  •   一个或多个端点描述符。

 

具体各种描述符的定义,在后面章节为大家说明。

4.9   USB类

常用的USB类如下:

 

其中HID,CDC,Audio,MSC等类,将在后续章节详细说明。

4.10 总结

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


推荐阅读
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • 本文是一位90后程序员分享的职业发展经验,从年薪3w到30w的薪资增长过程。文章回顾了自己的青春时光,包括与朋友一起玩DOTA的回忆,并附上了一段纪念DOTA青春的视频链接。作者还提到了一些与程序员相关的名词和团队,如Pis、蛛丝马迹、B神、LGD、EHOME等。通过分享自己的经验,作者希望能够给其他程序员提供一些职业发展的思路和启示。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • Windows7 64位系统安装PLSQL Developer的步骤和注意事项
    本文介绍了在Windows7 64位系统上安装PLSQL Developer的步骤和注意事项。首先下载并安装PLSQL Developer,注意不要安装在默认目录下。然后下载Windows 32位的oracle instant client,并解压到指定路径。最后,按照自己的喜好对解压后的文件进行命名和压缩。 ... [详细]
  • 本文介绍了win7系统休眠功能无法启动和关闭的解决方法,包括在控制面板中启用休眠功能、设置系统休眠的时间、通过命令行定时休眠、手动进入休眠状态等方法。 ... [详细]
  • 本文介绍了在Mac上安装Xamarin并使用Windows上的VS开发iOS app的方法,包括所需的安装环境和软件,以及使用Xamarin.iOS进行开发的步骤。通过这种方法,即使没有Mac或者安装苹果系统,程序员们也能轻松开发iOS app。 ... [详细]
  • svnWebUI:一款现代化的svn服务端管理软件
    svnWebUI是一款图形化管理服务端Subversion的配置工具,适用于非程序员使用。它解决了svn用户和权限配置繁琐且不便的问题,提供了现代化的web界面,让svn服务端管理变得轻松。演示地址:http://svn.nginxwebui.cn:6060。 ... [详细]
  • SpringBoot整合SpringSecurity+JWT实现单点登录
    SpringBoot整合SpringSecurity+JWT实现单点登录,Go语言社区,Golang程序员人脉社 ... [详细]
  • PL2303HXD电路图(USB转UART)介绍及应用
    本文介绍了PL2303HXD电路图(USB转UART)的特性和应用,该电路图可以实现RS232和USB信号的转换,方便嵌入到手持设备中。PL2303HXD作为USB/RS232双向转换器,可以将USB数据转换为RS232信息流格式发送给外设,并将RS232外设的数据转换为USB数据格式传送回主机。通过利用USB块传输模式和自动流量控制,PL2303HXD能够实现更高的数据传输吞吐量比传统的UART端口。 ... [详细]
  • 本文介绍了在Ubuntu 11.10 x64环境下安装Android开发环境的步骤,并提供了解决常见问题的方法。其中包括安装Eclipse的ADT插件、解决缺少GEF插件的问题以及解决无法找到'userdata.img'文件的问题。此外,还提供了相关插件和系统镜像的下载链接。 ... [详细]
  • 如何使用PLEX播放组播、抓取信号源以及设置路由器
    本文介绍了如何使用PLEX播放组播、抓取信号源以及设置路由器。通过使用xTeve软件和M3U源,用户可以在PLEX上实现直播功能,并且可以自动匹配EPG信息和定时录制节目。同时,本文还提供了从华为itv盒子提取组播地址的方法以及如何在ASUS固件路由器上设置IPTV。在使用PLEX之前,建议先使用VLC测试是否可以正常播放UDPXY转发的iptv流。最后,本文还介绍了docker版xTeve的设置方法。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
author-avatar
芹牵一线
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有