STM32F103C8T6音乐控制器实战教程[1]
USB简单介绍:
"USB"代表通用串行总线(Universal Serial Bus),是一种用于连接计算机及其外部设备的标准接口。USB接口允许各种设备(如打印机、存储设备、键盘、鼠标、摄像头等)通过单一的标准接口与计算机通信和交换数据。USB标准经过多次升级,逐渐演变为不同版本,每个版本都引入了新的功能和改进。
以下是USB标准的主要版本:
- USB 1.x:
- USB 1.0: 最早的USB规范,于1996年发布,最大传输速率为12 Mbps(兆位每秒)。
- USB 1.1: 于1998年发布,进行了一些修正和改进。
- USB 2.0:
- 于2000年发布,最大传输速率提升至480 Mbps。这个版本在广泛的计算机和设备中得到了应用,成为了普遍采用的标准。
- USB 3.x:
- USB 3.0: 于2008年发布,又称为“SuperSpeed USB”,最大传输速率为5 Gbps。
- USB 3.1: 于2013年发布,分为两个版本,分别为5 Gbps和10 Gbps的速率。后来的更新将10 Gbps版本标记为USB 3.1 Gen 2。
- USB 3.2: 于2017年发布,引入更高的传输速率,最高版本为20 Gbps,被称为USB 3.2 Gen 2x2。
- USB 4:
- 于2019年发布,最大传输速率为40 Gbps。USB 4标准集成了雷电(Thunderbolt)技术,使其具备更高的速度和更多的功能。
USB的主要优点和缺点:
优点:
-
通用性: USB接口是一种通用标准,适用于各种设备,如打印机、存储设备、键盘、鼠标、摄像头、移动设备等。这种通用性使得设备之间更容易互相连接。
-
热插拔: USB设备可以在计算机运行时进行插拔,无需重启计算机。这种热插拔功能使设备管理更加便捷,无需中断计算机的运行。
-
高速传输: 随着USB版本的升级,传输速率不断提高。较新的USB标准(如USB 3.0、USB 3.1、USB 3.2和USB 4)可以提供很高的传输速率,适用于大容量文件和多媒体数据。
-
供电功能: USB接口可以为连接的设备提供电源,这意味着许多设备(如键盘、鼠标、移动设备)可以通过USB接口获得所需的电力,无需额外电源适配器。
-
广泛支持: USB接口得到了广泛的支持和采用,几乎所有的计算机和设备都配备了USB接口,使其成为连接设备的通用选项。
-
适配器和扩展: USB接口可以用于连接各种适配器和扩展设备,如USB集线器、转接头等,从而扩展计算机的连接能力。
缺点:
-
传输距离限制: USB连接的传输距离相对较短,通常在3至5米范围内。超过一定距离后,信号衰减可能导致传输不稳定。
-
共享带宽: 在某些情况下,多个USB设备共享同一主机上的带宽可能会导致数据传输速率降低,特别是在较旧的USB版本中。
-
物理连接易损: USB插头和插孔是物理连接,如果不小心操作,可能会导致连接松动、接触不良甚至损坏插头。
-
复杂性: 对于某些高级功能,如电源传递、高速数据传输等,USB协议可能变得相对复杂,需要更多的电子组件和设计。
-
设备兼容性: 尽管USB标准很普遍,但有时设备制造商可能会采用不同的规范,导致某些设备在不同计算机上的兼容性问题。
USB系统的组成:
- 主机(Host): 主机是USB系统的控制中心,通常是计算机或其他设备,负责管理和控制连接到USB总线上的所有设备。主机生成和管理USB通信,并为连接的设备提供电力。
- 设备(Device): 设备是连接到USB总线上的外部设备,如打印机、存储设备、键盘等。每个USB设备都有一个唯一的地址,主机通过这个地址识别和通信与之连接的设备。
- 总线(Bus): USB总线是设备连接的物理通道,通过这条通道传输数据和电力。USB总线支持多个设备同时连接,但所有设备共享总线带宽。
- 集线器(Hub): 集线器是用于扩展USB端口数量的设备。它可以连接到主机的USB端口,并提供多个附加端口,使您能够连接更多的USB设备。
- 连接线(Cable): USB连接线是将主机、集线器和设备连接到一起的物理线缆。USB连接线分为不同类型和版本,以适应不同的连接需求和速率。
Hub不能无限拓展的原因:
- 设备数量限制: USB规范将最大连接设备数量限制为127个。这意味着即使使用多个USB集线器,您总共连接的USB设备数量也不应超过127个。
- 总线带宽限制: USB总线的带宽是有限的,随着连接的设备数量增加,总线上的可用带宽会减少。每个USB设备共享总线带宽,因此连接的设备越多,每个设备可用的带宽越少。
- 信号干扰: 随着集线器层数的增加,信号可能会变得更加脆弱,从而可能导致数据传输错误或稳定性问题。这是因为每个层级都会引入一定的信号损耗。
- 电源供应: 随着连接的设备数量增加,对于供电的要求也会增加。USB集线器本身需要电源供应,而连接的设备也需要电力。如果设备的功耗超过了USB集线器的电源能力,可能会导致电力不足的问题。
USB主机需要的程序:
主机应用程:
在USB系统中,应用程序是指在主机计算机上运行的软件,用于与连接的USB设备进行交互、数据交换和实现特定的功能。
-
数据传输: 许多USB设备用于数据传输,如外部存储设备、摄像头等。应用程序可以与这些设备通信,读取或写入数据,执行备份、文件传输等操作。
-
设备控制: 一些USB设备具有控制功能,如打印机、扫描仪、音频接口等。应用程序可以发送控制命令,调整设备的设置、启动打印任务等。
-
设备监控: 应用程序可以监控连接的USB设备的状态和活动。例如,监控电池充电状态、存储设备容量等。
-
音频和视频处理: 许多音频和视频设备使用USB接口,如耳机、麦克风、摄像头等。应用程序可以与这些设备配合,进行音频录制、视频采集、通话等。
-
数据采集: 一些测量设备(如传感器、测量仪器)通过USB接口传输数据。应用程序可以从这些设备中读取数据,分析、记录或可视化数据。
-
游戏控制: 游戏控制器、操纵杆等游戏设备使用USB接口与计算机连接。游戏应用程序可以与这些设备交互,实现游戏控制。
-
移动设备管理: 移动设备(如智能手机、平板电脑)通过USB接口与计算机同步数据、传输文件等。相关的应用程序可以管理这些移动设备的内容。
-
特定设备交互: 某些设备有独特的功能和交互方式,应用程序可以根据设备类型和规格实现特定的功能。例如,3D打印机的控制、数码相机的图像下载等。
USB应用程序通常需要调用设备驱动程序提供的接口和功能来实现操作。这些应用程序可以是操作系统内置的工具,也可以是由第三方开发的应用程序。无论是哪种情况,应用程序的目标是实现与USB设备的有效交互,使用户能够充分利用连接的设备。
应用程序驱动程序:
应用程序驱动程序是特定设备的软件组件,它们允许操作系统与连接的USB设备进行通信和交互。每个USB设备可能需要一个特定的驱动程序,以便操作系统能够正确识别设备、了解其功能,并实现正确的数据交换。这些驱动程序的功能包括:
-
设备识别: 驱动程序帮助操作系统识别连接的USB设备。操作系统需要知道设备的厂商、型号以及支持的功能,以便正确管理设备。
-
功能支持: 驱动程序允许应用程序利用设备的各种功能。例如,对于打印机,驱动程序会允许操作系统和应用程序发送打印作业。
-
数据传输: 驱动程序处理数据在设备和计算机之间的传输。它们确保数据正确地从设备发送到计算机,或从计算机发送到设备。
-
错误处理: 驱动程序处理设备通信中的错误,如数据传输错误、超时等。它们可以通过重新传输数据或采取其他措施来解决这些问题。
-
电源管理: 驱动程序可能负责管理设备的电源状态,例如将设备置于休眠状态以节省能源。
主机端控制程序:
主机端控制程序是主机计算机上的软件组件,用于管理连接到USB总线的所有设备和数据流。这些程序与操作系统和USB控制器一起工作,确保设备的正确连接、数据传输和电源管理。它们的功能包括:
-
设备管理: 主机端控制程序负责识别连接的USB设备并与之通信。它们监控总线上的设备并允许操作系统访问这些设备。
-
驱动程序加载: 当新设备连接到计算机时,主机端控制程序可能会自动加载适当的驱动程序,以便设备能够与操作系统交互。
-
电源分配: 对于带有USB供电功能的设备,主机端控制程序负责管理为设备提供的电流和电力。它们根据设备的需求分配电源。
-
数据传输管理: 主机端控制程序协调数据传输,确保设备之间的数据传输不会冲突或干扰。
-
设备协商: 当设备连接时,主机端控制程序可能会与设备进行协商,以确定支持的功能、传输速率等。
各个程序之间的关系:
在USB系统中,应用程序、设备驱动程序和主机端控制程序三者之间有密切的关联,它们共同协作以实现设备连接、数据交换和功能操作。以下是它们之间的关联:
-
设备驱动程序和应用程序关联: 设备驱动程序是用于操作系统识别和管理USB设备的软件组件。它们与具体的USB设备通信,将设备特定的通信协议转化为操作系统和应用程序能够理解的数据。应用程序需要调用这些驱动程序来与连接的设备进行交互。应用程序通过设备驱动程序向操作系统发出请求,从设备中读取数据、发送指令或执行其他操作。
-
主机端控制程序和应用程序关联: 主机端控制程序是在主机计算机上运行的软件,用于管理连接到USB总线的所有设备。这些程序与操作系统、USB控制器和设备驱动程序一起工作,协调设备的连接、数据传输和电源管理。应用程序通过主机端控制程序获得对USB设备的访问权限。主机端控制程序负责识别新连接的设备,加载适当的驱动程序,分配电源,协调数据传输等,以确保应用程序与设备的正常通信。
-
应用程序与主机端控制程序关联: 应用程序通过主机端控制程序访问连接的USB设备。应用程序使用主机端控制程序提供的接口来查找已连接的设备、启动数据传输、发送控制命令等。主机端控制程序将应用程序的请求翻译成USB通信协议,以便与设备进行交互。应用程序依赖于主机端控制程序来协调设备连接和通信,以及提供设备的访问权限。
应用程序、设备驱动程序和主机端控制程序在USB系统中密切关联,共同实现了设备的连接、数据交换和操作功能。应用程序通过设备驱动程序和主机端控制程序与USB设备进行通信,并依赖于它们来实现设备的功能和操作。
USB设备如何被主机识别:
其实就是根据D+、D- 的高低电平来检测设备的插入。
在USB集线器的下游端口D+和D-上,分别接了一个15kΩ下拉电阻;
在设备端,D+或D-上接了一个上拉电阻1.5kΩ(本图中是D+),低速设备的上拉电阻接在D-上,高速和全速设备的上拉电阻接在D+上。在当没有设备插入时,输入端的电平就被这两个下拉电阻拉到了低电平。当有设备插入时,接了上拉电阻的数据线,电平被拉高,根据被拉高的是D+还是D- 来判断是低速设备还是全速设备。
USB高速设备显示被识别成全速设备,然后通过集线器和设备两者的确认,再切换到高速模式。高速模式下,是电流传输,这时要将D+上的上拉电阻断开
USB信号是如何传输的:
差分信号: USB信号传输采用差分信号方式。这意味着对于每个信号,有一对电线,分别是D+(数据正极)和D-(数据负极)。数据是通过这两根线之间的电压差来传输的。
USB标准中的USB-A、USB-B、USB-C等各种类型的连接器在物理层上包含了不同数量的线,用于数据传输、电源供应和其他功能。常见的USB连接器中,USB 2.0和USB 3.0采用了差分信号传输方式,其线的分布如下:
USB 2.0:
USB 2.0连接器通常有4根线,其中2根用于差分信号传输,用于数据传输,另外两根用于电源供应和接地。
- D+: 差分信号,用于正向数据传输。
- D-: 差分信号,用于反向数据传输。
- VCC: 电源线,提供电源供应。
- GND: 地线,提供电路的接地。
USB 3.0:
USB 3.0引入了额外的差分信号线以支持更高的传输速率,因此USB 3.0连接器通常有9根线,其中4根用于差分信号传输,其余的用于电源、接地以及其他功能。
- D+: USB 2.0差分信号,用于正向数据传输。
- D-: USB 2.0差分信号,用于反向数据传输。
- VCC: 电源线,提供电源供应。
- GND: 地线,提供电路的接地。
- SS TX+: 差分信号,用于USB 3.0数据传输的正向通道。
- SS TX-: 差分信号,用于USB 3.0数据传输的反向通道。
- SS RX+: 差分信号,用于USB 3.0数据接收的正向通道。
- SS RX-: 差分信号,用于USB 3.0数据接收的反向通道。
- GND: 电路接地。
**差分信号解释:**差分信号是指两个信号线之间的电压差来表示数据的传输。在USB中,D+和D-两根信号线形成了一对差分信号线,数据的变化是通过改变这两根线之间的电压差来实现的。这种差分信号传输方式对干扰更加稳健,因为外部干扰信号会同时影响这两根线,但只要电压差保持,数据传输就能保持稳定。这种传输方式提高了数据的可靠性,特别是在高速数据传输中。
差分信号的逻辑1跟逻辑:
逻辑1(High): 在差分信号传输中,逻辑1由D+线的电压高于D-线的电压表示。这会导致电压差增大,从而表示逻辑1。这种差异电压是数据传输和解释的基础。
逻辑0(Low): 逻辑0则相反,D-线的电压高于D+线的电压。这也会导致电压差,但与逻辑1相比电压差更小,表示逻辑0。
差分信号传输中的逻辑1和逻辑0是通过比较D+线和D-线之间的电压差来确定的。逻辑1的情况下,D+线电压高于D-线;逻辑0的情况下,D-线电压高于D+线。这种编码方式使得差分信号传输在抵抗干扰、提高可靠性方面具有优势。
USB电路图:
由图可知STM32作为一个简单的从设备还是比较简单的只需要把DP DM链接到PA11跟PA12管脚即可。
丰富多样的USB连接器:
USB连接器是一种用于连接USB设备和计算机(或其他主机设备)的物理接口。USB连接器允许设备通过USB总线进行数据传输、电源供应和通信。根据USB的不同版本和用途,存在多种类型的USB连接器。以下是一些常见的USB连接器类型:
-
USB Type-A: 这是最常见的USB连接器类型,通常用于主机设备(如计算机、电视、游戏主机)的USB端口。它是一个矩形的连接器,具有4个针脚,用于数据传输、电源供应和地线。
-
USB Type-B: USB Type-B连接器通常用于外部设备,如打印机、扫描仪和外部硬盘驱动器。它具有多种不同的变体,其中较常见的是标准Type-B和微型Type-B。
-
USB Type-C: USB Type-C连接器是一种逐渐普及的连接器,具有可逆插入特性,无论插头的方向如何,都可以正确连接。它支持更高的数据传输速率和电源功率,广泛应用于现代设备,包括智能手机、平板电脑、笔记本电脑等。
-
USB Mini: USB Mini连接器是一种较早的连接器类型,分为Mini-A、Mini-B和Mini-AB。它们用于一些较旧的移动设备和相机等。
-
USB Micro: USB Micro连接器是取代USB Mini的一种更小的连接器类型,分为Micro-A、Micro-B和Micro-AB。它也用于一些移动设备、相机和其他便携式设备。
-
USB On-The-Go (OTG): USB OTG连接器允许设备在主机模式和设备模式之间切换,从而实现设备之间的直接连接和通信,而无需计算机的中介。
-
USB 3.0 Micro-B: 这种连接器用于支持USB 3.0的设备,具有更多的引脚用于支持高速数据传输。
-
USB 3.1 Type-C: USB 3.1 Type-C连接器是Type-C连接器的增强版本,支持更高的数据传输速率和电源功率,适用于高性能设备。
这些连接器类型在不同的设备和应用中起着关键的作用,它们使设备能够通过USB总线进行数据传输、电源供应和通信,从而实现了设备的互连性和通用性。
USB协议规范:
USB(Universal Serial Bus)协议规范是定义USB系统各个方面的一系列标准,包括物理连接、数据传输、电源供应、通信协议等。
USB的基本规范包括通用的USB规范、各种设备类规范以及主机控制器规范,它们共同定义了USB系统的不同方面。这些基本规范共同构成了USB技术的基础,为USB设备和主机之间的通信、数据交换、电源供应等提供了标准化的框架。各种设备和主机都可以按照这些规范来设计和实现,以实现USB系统的互操作性和可靠性。
通用的USB规范: 这是USB技术的基础规范,定义了USB系统的物理连接、数据传输、电源供应、通信协议等方面。这个规范确保了不同设备和计算机之间的互操作性和通用性。它规定了USB连接器的不同类型,如USB Type-A、Type-B、Type-C,以及它们的引脚分配、电气特性等。此外,USB规范还定义了数据传输的基本机制、速率、帧结构等。
设备类规范: USB设备类规范定义了特定类型的USB设备的通信协议、数据格式和操作行为。不同类型的设备类规范包括但不限于:
- 人机交互式设备 HID(Human Interface Device):用于键盘、鼠标、游戏控制器等人机界面设备。
- 存储设备类 Mass Storage:用于外部存储设备,如USB闪存驱动器、硬盘驱动器等。
- 打印机类设备 Printer:用于打印机设备。
- 音频类设备类 Audio:用于音频设备,如耳机、扬声器等。
- 视频类设备类 Video:用于视频设备,如摄像头、显示器等。
- 通信设备类 Communication:用于通信设备,如调制解调器、网络适配器等。
这些设备类规范规定了特定设备类型的工作方式、数据格式、通信协议等,以确保各种设备在不同计算机上正常工作。
当谈到USB设备类规范时,有许多特定类型的设备类规范,每个规范都定义了特定类型的USB设备在通信、数据交换和操作方面的行为。
主机控制器规范: USB主机控制器规范定义了计算机主机上的USB控制器的工作方式、功能和接口。USB控制器负责管理连接到计算机的USB设备,包括设备的识别、配置、数据传输等。主机控制器规范确保了主机和设备之间的有效通信和交互。
深入理解USB的基本规范:
明确三个层次:
- 信号层: 信号层是USB连接的物理层,涉及USB电缆和连接器的物理特性。USB电缆中的差分信号传输是在信号层上完成的,其中D+和D-线用于数据传输。信号层确保电缆的正确连接和数据传输的稳定性。
- 协议层: 协议层定义了USB通信的规则和流程。USB协议层包括设备的枚举、配置、命令传输、数据传输等。USB协议层确保主机和设备之间的正确通信,允许主机识别设备、了解设备的能力,并与设备进行数据交换。
- 数据传输: 数据传输是指在USB连接上实际传输数据的过程。USB定义了两种主要类型的数据传输:控制传输、批量传输、中断传输和等时传输。控制传输用于配置和控制设备,批量传输用于大量数据的传输,中断传输用于低延迟的周期性传输,等时传输用于对时间要求较高的数据传输。
理解两个接口:
-
接口概念: 在USB设备中,一个接口是设备的一个功能单元。每个USB设备可以包含多个接口,每个接口可以提供不同的功能。例如,一个多功能打印机可能有一个接口用于打印、一个接口用于扫描。每个接口又包含多个端点。
-
端点概念: 在每个USB接口中,端点是数据传输的终点或起点。每个接口可以有多个端点,包括一个控制端点(用于控制和配置)和若干批量、中断或等时端点(用于数据传输)。端点在USB通信中起到了数据传输的重要角色,主机和设备通过端点进行数据的发送和接收。
协议层深入理解:
在USB通信中,协议层的数据传输通过一系列的数据包来完成。每个数据包都包含了不同的字段,用于标识、传输和校验数据。以下是USB数据包的各个字段的详细解释:
-
同步字段SYNC(Sync Field): 同步字段是一个特定的数据模式,用于同步接收方的时钟。它的作用是帮助接收方正确解析后续的数据。在USB 2.0中,同步字段由两个字节(16位)的位模式组成,称为K码。在USB 3.0中,使用8位的同步字段。
-
包标识符PID(Packet Identifier): 包标识符是一个4位的字段,用于标识数据包的类型。不同的包标识符表示不同类型的数据包,如数据包、令牌包、握手包等。
-
地址字段ADDR(Address Field): 地址字段用于指示目标设备的地址。在USB总线上可能存在多个设备,地址字段确定了数据包应该传递给哪个设备。
-
端点标识符EP(Endpoint Identifier): 在USB 2.0中,端点标识符用于指示目标设备的端点,以及数据传输的方向(输入或输出)。在USB 3.0中,端点标识符合并到地址字段中。
-
数据字段DATA(Data Field): 数据字段包含实际的数据内容。根据传输类型和应用,数据字段的长度可以不同。不同类型的USB传输(如控制传输、批量传输、中断传输、等时传输)在数据字段的使用上有所区别。
-
校验字段CRC(Cyclic Redundancy Check,CRC): 校验字段用于检测数据包是否在传输过程中发生了错误。发送方计算CRC码并将其添加到数据包中,接收方根据接收到的数据计算CRC码并与接收到的CRC码进行比较,以判断数据是否正确传输。
-
包结束EOF(End of Packet): 包结束字段标志着数据包的结束,通常由一个特定的位模式表示。接收方根据这个标志来识别数据包的结束。
综合起来,USB数据包的各个字段共同构成了一个完整的数据包,用于在USB总线上进行数据传输。这些字段的设计和使用确保了数据的可靠传输、识别和校验,从而实现了USB通信的稳定性和可靠性。
PID字段理解:
Packet Identifier(包标识符): 用于标识数据包的类型。不同的包标识符表示不同类型的数据包,如数据包、令牌包、握手包。
ADDR字段理解:
在USB数据包的前导码和包标识符之后,紧随的是用于指示目标设备地址或端点地址的地址字段。地址字段的具体格式取决于其所在的数据包类型。例如,对于令牌包(Token Packet),地址字段指示目标设备的地址;而对于数据包(Data Packet),地址字段用于指示传输的端点地址。在USB通信中,存在两种类型的地址:设备地址(Device Address)和端点地址(Endpoint Address)。
-
设备地址(Device Address):
设备地址是用来标识USB总线上的各个USB设备的唯一标识符。每个USB设备都被赋予一个独特的设备地址,以便主机可以区分不同的设备并与它们进行通信。设备地址的范围是从1到127,其中0被保留用于未分配地址和默认地址。设备初始化时,主机分配一个默认地址(通常是0),然后设备在初始化完成后获取一个非零的设备地址。 -
端点地址(Endpoint Address):
端点地址用于标识USB设备上的不同端点(Endpoint),每个端点是数据的进出口。在USB设备中,一个端点可以是输入端点(IN Endpoint)或输出端点(OUT Endpoint)。端点地址由两部分组成:一个3位的端点号和一个1位的方向标识(用于区分IN和OUT)。因此,一个USB设备可以有多个端点,每个端点都有一个唯一的端点地址。
不同类型的设备支持的端点不同:
低速(Low-Speed)设备和高速(High-Speed)设备在USB通信中支持的端点地址是不同的。USB设备通过端点来实现数据传输,不同速度的设备对端点的数量和功能有一些限制。
低速设备:
- 最多支持两个端点:一个控制端点(Endpoint 0)和一个数据端点(IN 或 OUT)。
- 控制端点(Endpoint 0)通常被用于设备的控制和配置,支持双向传输。
高速设备:
- 最多支持15个端点:一个控制端点(Endpoint 0)和最多七个输入端点(IN Endpoint)以及最多七个输出端点(OUT Endpoint)。
- 控制端点(Endpoint 0)通常被用于设备的控制和配置,支持双向传输。
- 输入端点(IN Endpoint)用于从设备发送数据到主机,输出端点(OUT Endpoint)用于从主机接收数据。
- 高速设备的端点支持更大的数据传输带宽,因此可以同时处理更多数据。
需要注意的是,USB规范中还存在其他类型的设备,如全速(Full-Speed)设备,其在支持的端点数量和功能上可能与低速设备或高速设备有所不同
帧号的理解:
USB 通信中的帧号通常由 11 个比特构成。这 11 个比特用来表示帧号,帧号从 0 开始递增,循环周期为 2^11 帧,即 2048 帧。这个循环周期大约为 1 毫秒(ms),因为每帧的持续时间是 1 毫秒 / 1000 = 1 微秒(μs),帧数为 2048,所以循环周期为 1 ms。
帧号的 11 个比特用于表示从 0 到 2047 的帧序号,当达到 2047 后会重新从 0 开始计数,形成一个循环。帧号的作用是在 USB 设备之间建立时间同步,以便数据传输和通信的正确进行。
令牌包(Token Packet)讲解:
0xB4令牌包是USB通信中的一种特殊类型的令牌包,用于支持高速USB总线上的低速或全速设备的通信。它的帧格式包含了特定的字段,用于指示目标设备和端点,以及管理分裂传输的过程。以下是0xB4令牌包的正确帧格式:以包标识符(PID,Packet Identifier)作为起始。
令牌包的格式如下:
- 包起始:令牌包的起始由一个包标识符(PID)来标志,表示不同类型的令牌,如OUT、IN、SETUP等。
- 目标设备地址:指示目标USB设备的地址,占用7位。
- 端点号:指示目标设备的端点号,占用4位。
- CRC5:用于校验令牌包的有效性和完整性的循环冗余校验(CRC5),占用5位。
- 帧结束标记:表示令牌包的结束。
令牌包的类型包括OUT令牌包、IN令牌包和SETUP令牌包,它们用于控制数据的传输方向和类型。
帧起始包(Start of Frame)讲解:
帧起始包(Start of Frame)是USB通信中的一个特殊类型的包,用于同步USB设备的时钟并标识USB帧的开始。SOF包在每个USB帧的开始时发送,以确保所有设备都保持同步,从而实现可靠的数据传输。
以下是SOF包的主要特点和帧格式:
-
用途:SOF包主要用于维持USB设备之间的时钟同步。USB设备在SOF包的接收边缘调整其内部时钟,以便在帧的持续时间内正确地进行数据传输。
-
包标识符(PID):SOF包的PID为0xA5。这是一个特殊的PID,用于标识SOF包。
-
帧号:SOF包携带一个11位的帧号字段,用于指示当前USB帧的帧序号。帧号从0开始递增,循环周期为2^11帧,即2048帧,对应约为1毫秒。
-
CRC5:SOF包携带一个5位的CRC5校验字段,用于检验SOF包的有效性和完整性。
-
帧结束标记(EOF):SOF包的末尾会包含帧结束标记,表示SOF包的结束。
SOF包在USB通信中的作用非常重要,它确保了所有USB设备都按照相同的时钟进行操作,从而保证数据传输的同步和准确性。SOF包的发送频率决定了USB通信的带宽和实时性。
数据包(Data Packet)讲解:
数据包(Data Packet)是USB通信中用于传输实际数据的包,它包含了要传输的有效数据以及相关的控制和校验信息。USB数据包的格式根据传输的方向(主机到设备或设备到主机)以及数据的类型(控制、批量、中断、等等)可能会有所不同。 实际上,在USB通信中,数据包的PID值是由数据传输的方向和端点号来确定的,而不是一个固定的值。以下是关于USB数据包的正确介绍:
USB数据包是用于在USB通信中传输实际数据的包。它的组成部分可以根据传输的类型和阶段而有所不同。一般来说,USB数据包的格式如下:
-
包起始标识(Packet Identifier,PID):数据包的PID标识了数据包的类型和传输方向。PID字段的值根据数据传输的具体情况而定,例如在批量传输中,数据包的PID值可能是0x02,而在中断传输中可能是0x06。
-
数据字段:数据包的数据字段承载实际要传输的数据。数据的长度取决于数据包的具体用途和传输类型。
-
CRC(Cyclic Redundancy Check):CRC校验码用于检测数据传输过程中是否出现错误。CRC校验字段在数据包中用来验证数据的完整性。
-
结束标识(End of Packet,EOP):数据包的末尾会包含一个结束标识,表示数据包的结束。
数据包的PID值会根据数据的传输方向(主机到设备或设备到主机)和数据包所用的端点号来确定。不同类型的数据传输,如批量传输、中断传输、控制传输等,会有不同的PID值,用于标识数据包的类型。因此,并没有一个固定的PID值用于所有数据包。
握手包(Acknowledgment Packet)讲解:
握手包用于确认数据包的接收,以及传输状态的反馈。以下是关于握手包的正确讲解:
握手包(Handshake Packet)是USB通信中用于确认数据包的特殊类型的包,它用于传输状态的确认和反馈。握手包的目的是确保数据传输的可靠性,并在数据传输的各个阶段提供反馈。
以下是握手包的主要内容:
- 包起始标识(PID):握手包的PID用于表示不同类型的握手信息。常见的PID值包括0x0E(ACK包,确认包)和0x0F(NAK包,否定确认包)。
- 帧结束标识(EOF):握手包的末尾会包含一个帧结束标识,表示握手包的结束。
常见的握手包类型有:
- ACK包(Acknowledgment):使用PID 0x0E,表示数据包已成功接收。接收方收到数据包后,会发送ACK包作为回应,以确认数据包的接收。
- NAK包(Negative Acknowledgment):使用PID 0x0F,表示数据包未能成功接收。接收方在某些情况下可能发送NAK包,表示需要重新发送数据包。
握手包在USB通信中扮演着重要角色,它确保了数据传输的可靠性,以及在不同阶段提供状态的反馈。通过ACK包和NAK包的发送,USB设备能够对数据包的接收状态做出明确的回应,从而确保通信的有效性。握手包是USB通信中用于确认数据包接收状态和传输状态的特殊包,通常使用ACK包和NAK包来提供确认和反馈。
数据传输层深入理解:
USB的数据传输层是负责实际数据传输的一部分,它涉及从主机到设备(OUT传输)和从设备到主机(IN传输)的数据传递。USB数据传输层定义了数据包的格式、错误处理、重传机制等,以确保可靠的数据交换。USB数据传输层包括以下几种传输类型(控制传输、同步传输、中断传输、大容量数据传输)的特点解释:
-
控制传输(Control Transfer):
- 特点:用于设备的配置、控制和命令交互,具有最高的灵活性。控制传输由主机发送命令和设备返回响应组成,用于设备初始化、状态查询、设置参数等操作。
- 特征:
- 低带宽占用:不适用于大量数据传输,主要用于控制信息的传递。
- 可靠性:具有重试和错误检测机制,确保命令和响应的正确传输。
- 延迟不确定:控制传输可能会有较高的传输延迟,不适用于实时性要求高的应用。
-
同步传输(Isochronous Transfer):
- 特点:用于实时应用,如音频和视频传输。提供固定的传输带宽,但不保证可靠传输。
- 特征:
- 固定带宽:每帧有固定的带宽用于同步传输,适用于实时性要求高的应用。
- 无重传机制:对于数据的丢失或错误没有重传机制,适合不要求完全可靠传输的应用。
- 低延迟:具有较低的传输延迟,适用于对实时性要求高的音频和视频传输。
-
中断传输(Interrupt Transfer):
- 特点:用于周期性地传输小块数据,适用于低延迟的应用,如鼠标、键盘等。
- 特征:
- 固定带宽:每帧有一定的带宽用于中断传输,确保周期性的数据传输。
- 较低带宽:相对于批量传输和控制传输,带宽较低,适用于小量数据传输。
- 较低延迟:具有较低的传输延迟,适用于需要快速响应的应用。
-
大容量数据传输(Bulk Transfer):
- 特点:用于大容量数据传输,对传输延迟不敏感。
- 特征:
- 高带宽:相对于控制传输和中断传输,具有较高的带宽,适用于大量数据传输。
- 可靠性:具有重传机制,确保数据的可靠传输。
- 相对高延迟:传输延迟可能相对较高,适用于不对传输延迟要求过高的应用。
不同的数据传输类型在USB通信中各自发挥重要作用,根据应用需求和实时性要求选择合适的传输类型。
USB的枚举过程详解:
USB设备的枚举过程是在设备插入到USB主机端口时,通过一系列的步骤来识别、配置和启用设备的过程。枚举是USB通信中的重要环节,它确保设备与主机之间的正常通信和合作。以下是USB设备枚举的详细步骤:
- 插入设备:当USB设备被插入主机的USB端口时,主机会检测到一个新的设备插入事件
- 供电:当USB设备被插入到主机端口时,主机会向设备提供所需的电力。
- 复位:在供电之后,USB设备会进行复位。复位是一个重要的步骤,它确保设备在一个已知状态下开始,清除之前的状态和设置。
- 设备检测:主机向设备发送一个带有默认地址的令牌包,以确认是否有设备响应。设备响应后,主机知道有一个新设备连接。
- 设备地址分配:主机会为设备分配一个唯一的设备地址。这个地址用于在USB总线上唯一标识设备。
- 设备描述符获取:主机请求设备的描述符,包括设备描述符、配置描述符、接口描述符等。这些描述符包含了设备的基本信息。
- 设备配置:主机根据设备的描述符信息,选择一个配置,并将配置描述符发送给设备。设备会根据配置进行初始化和设置。
- 设备启用:主机发送一个启用设备的命令,设备根据命令启用其功能。此时,设备完成了枚举过程,可以与主机进行正常的数据通信。
USB的描述符:
USB描述符的类型
USB1.1协议中定义的标准描述符有:
设备描述符(Device Descriptor)、
配置描述符(Configuration Descriptor)、
接口描述符(Interface Descriptor)、
端点描述符(Endpoint Descriptor)、
字符串描述符(String Descriptor)
USB2.0又新增了两个新的标准描述符:
Device Qualifier Descriptor、
Other Speed Configuration Descriptor
还有一些特殊的描述符,如类特殊描述符(HID描述符、音频接口描述符)、厂商自定义的描述符等。
设备描述的理解
USB(Universal Serial Bus)设备描述符是一种用于描述连接到USB总线上的设备的信息的数据结构。它提供了有关设备的基本信息,如供应商ID、产品ID、设备类别、协议等。
以下是常见的USB设备描述符字段和它们的含义:
-
Device Descriptor(设备描述符):
-
bLength: 描述符的长度。
-
bDescriptorType: 描述符的类型,对于设备描述符,值为0x01。
-
bcdUSB: 指示支持的USB规范版本。
-
bDeviceClass: 设备的类别。
-
bDeviceSubClass: 设备的子类别。
-
bDeviceProtocol: 设备的协议。
-
bMaxPacketSize0: 端点0的最大数据包大小。
-
idVendor: 供应商ID,由USB论坛分配。
-
idProduct: 产品ID,由制造商分配。
-
bcdDevice: 设备的版本号。
-
iManufacturer: 制造商信息的字符串描述符索引。
-
iProduct: 产品信息的字符串描述符索引。
-
iSerialNumber: 序列号信息的字符串描述符索引。
-
bNumConfigurations: 设备支持的配置数目。
-
-
Configuration Descriptor(配置描述符):
- bLength: 描述符的长度。
- bDescriptorType: 描述符的类型,对于配置描述符,值为0x02。
- wTotalLength: 配置描述符及其子描述符的总长度。
- bNumInterfaces: 配置中接口的数目。
- bConfigurationValue: 配置的值,用于选择配置。
- iConfiguration: 配置信息的字符串描述符索引。
- bmAttributes: 配置特性,如自供电、远程唤醒等。
- bMaxPower: 配置所需的最大电流。
-
Interface Descriptor(接口描述符):
- bLength: 描述符的长度。
- bDescriptorType: 描述符的类型,对于接口描述符,值为0x04。
- bInterfaceNumber: 接口的编号。
- bAlternateSetting: 可选择的设置编号。
- bNumEndpoints: 接口使用的端点数目。
- bInterfaceClass: 接口的类别。
- bInterfaceSubClass: 接口的子类别。
- bInterfaceProtocol: 接口的协议。
- iInterface: 接口信息的字符串描述符索引。
-
Endpoint Descriptor(端点描述符):
- bLength: 描述符的长度。
- bDescriptorType: 描述符的类型,对于端点描述符,值为0x05。
- bEndpointAddress: 端点的地址及方向。
- bmAttributes: 端点的属性,如控制、同步、批量、中断等。
- wMaxPacketSize: 端点支持的最大数据包大小。
- bInterval: 中断端点的轮询间隔。
-
String Descriptor(字符串描述符):
用于提供与设备相关的文本信息,如制造商名称、产品名称、序列号等。这些字符串描述符可以帮助用户和操作系统更好地识别和管理连接的USB设备。每个字符串描述符都有一个索引,它们包含在设备描述符、配置描述符和接口描述符中。
- bLength(描述符长度):字符串描述符的字节数。
- bDescriptorType(描述符类型):对于字符串描述符,值为0x03。
- bString:实际的字符串数据,使用UTF-16LE编码。字符串的长度是可变的,由bLength字段指定。注意,字符串描述符并不是以零结尾的C风格字符串,而是在数据中直接编码的。
- Language ID:对于字符串描述符,索引为0的字符串包含语言ID列表,该列表指示支持的语言。
- 索引:每个字符串描述符都有一个唯一的索引,从1开始。这些索引被用于在描述符中引用特定的字符串。
一些常见的字符串描述符索引包括: - iManufacturer:制造商名称的字符串描述符索引。
- iProduct:产品名称的字符串描述符索引。
- iSerialNumber:序列号信息的字符串描述符索引。
- iConfiguration:配置信息的字符串描述符索引。
- iInterface:接口信息的字符串描述符索引。
这些字符串描述符允许制造商在USB设备中提供易于理解的信息,以便用户能够识别设备并与之交互,而不必仅仅依赖于设备的硬件信息。
常见的USB描述符类型及其对应的编号
描述符类型(bDescriptorType) | 编号(bDescriptorType) | 描述 |
---|---|---|
设备描述符(Device Descriptor) | 0x01 | 描述连接到USB总线的设备的基本信息。 |
配置描述符(Configuration Descriptor) | 0x02 | 描述设备的配置和接口信息。 |
字符串描述符(String Descriptor) | 0x03 | 提供与设备相关的文本信息。 |
接口描述符(Interface Descriptor) | 0x04 | 描述接口的信息,包括类别、子类别和协议。 |
端点描述符(Endpoint Descriptor) | 0x05 | 描述端点的信息,包括方向、类型和最大数据包大小。 |
设备质量描述符(Device Qualifier Descriptor) | 0x06 | 用于USB 2.0设备,提供设备的速度和能力信息。 |
其他速度配置描述符(Other Speed Configuration Descriptor) | 0x07 | 提供USB 2.0设备的其他速度配置信息。 |
接口功率描述符(Interface Power Descriptor) | 0x08 | 描述接口的功率需求。 |
OTG描述符(OTG Descriptor) | 0x09 | 用于USB On-The-Go(OTG)设备,提供OTG设备的能力信息。 |
接口功能描述符(Interface Functional Descriptor) | 0x24 | 描述特定类型的接口的功能性信息,如音频、视频等。 |
MIDI接口描述符(MIDI Interface Descriptor) | 0x24 | 描述MIDI音频接口的特定功能信息。 |
注意,这只是一些常见的USB描述符类型,实际上还有其他特定领域的描述符和扩展描述符,用于支持更多的功能和特性。每个描述符类型都有其特定的用途和信息内容,帮助操作系统和应用程序正确地配置和与USB设备进行通信。
USB描述符之间的关系
USB描述符之间的关系:一个USB设备只有一个设备描述符。
设备描述符决定了该设备有多少种配置,每种配置都有一个配置描述符;
配置描述符中又定义了该配置有多少个接口,每个接口都有一个接口描述符;
接口描述符中又定义了该接口有多少个端点,每个端点都有一个端点描述符;
端点描述符定义了端点的类型、大小等。
如果有HID描述符或音频接口描述符,则在接口描述符的后面。
一个设备至少要包含设备描述符、配置描述符和接口描述符,如果USB设备没有端点描述符,则它仅仅用默认管道与主机进行数据传输。
USB描述符之间的关系是一层一层的,设备描述符、配置描述符、接口描述符、端点描述符。
我们在快速开发一个USB设备的时候就是要配置一个描述符结构体,这样主机就能识别到我们这个设备是什么东西,也就可以实现通信或者控制。
这是描述符号之间的关系图:
主机在获取描述符时,首先获取设备描述符,再获取配置描述符,然后根据配置描述符中的配置集合总长度,一次将配置描述符、接口描述符、类特殊描述符(如果有)、端点描述符一次读回。注意:接口描述符、类特殊描述符、端点描述符不能单独获取,必须跟配置描述符以一个集合的方式一并返回。
一个键盘的描述符是什么样的呢?
STM32内部的USB模块知识:
STM32F103C8T6是STMicroelectronics的STM32F1系列微控制器中的一款型号,它在USB功能方面提供了一些基本特性。注意,该型号的USB功能主要支持USB设备模式,不支持USB主机模式。以下是关于STM32F103C8T6的USB模块的一些基本特性:
-
USB设备支持:STM32F103C8T6支持将设备配置为USB设备。这意味着您可以将该微控制器配置为各种USB设备,如虚拟串口、HID设备、存储设备等。
-
USB 2.0全速支持:该型号支持USB 2.0全速(12 Mbps)通信,适用于大多数USB设备应用。
-
USB OTG不支持:相比一些更高级的STM32型号,STM32F103C8T6不支持USB On-The-Go(OTG)功能。因此,它只能工作在USB设备模式,无法在同一个接口上切换为USB主机。
-
USB接口支持:STM32F103C8T6支持多种USB接口,包括控制传输、批量传输、中断传输和同步传输等。
-
USB设备类库:STMicroelectronics提供了一套USB设备类库,可以帮助您更轻松地实现各种USB设备功能。
-
USB时钟管理:STM32F103C8T6提供了USB时钟管理功能,您可以根据需要调整USB时钟频率以满足USB通信的要求。
-
USB电源管理:STM32F103C8T6提供了USB电源管理功能,可以管理USB供电和待机模式等。
-
低功耗模式:STM32F103C8T6支持低功耗模式,可以最小化功耗,适用于电池供电的应用。
-
双向端点支持:STM32F103C8T6支持双向端点,这是USB通信中的一个关键特性。双向端点允许在同一个端点上进行双向数据传输,从而实现设备和主机之间的双向通信。这意味着设备可以同时接收来自主机的数据以及向主机发送数据。
-
USB挂起(Suspend)和唤醒(Resume)功能:
STM32F103C8T6支持USB挂起和唤醒功能,这是一种用于节省能源的USB电源管理特性。当USB设备进入挂起状态时,它会暂停通信并降低功耗,以便在不需要通信时最小化能源消耗。这在移动设备等电池供电场景下非常有用。
当主机希望唤醒设备时,它可以向设备发送唤醒信号(Resume信号)。设备接收到唤醒信号后,会从挂起状态恢复,并重新开始通信。这使得设备可以在需要时立即响应主机的通信请求。
需要注意的是,虽然STM32F103C8T6提供了USB设备模式的支持,但它的USB功能相对基本,不具备一些高级功能,如USB主机模式或USB OTG功能
STM32F103C8T6的USB模块框图解释:
-
USB核心(USB Core):
USB核心是USB模块的核心部分,负责处理USB通信的各个阶段和功能。它包括USB控制器、寄存器、状态机等,用于管理USB协议的数据传输、状态转换等。 -
时钟管理(Clock Control):
时钟管理模块用于提供USB所需的时钟信号。它可以配置USB时钟频率,确保USB通信的稳定性和准确性。 -
电源管理(Power Control):
电源管理模块用于控制USB模块的供电。它可以管理USB设备的供电状态、低功耗模式以及USB的挂起和唤醒功能。 -
USB I/O接口(USB I/O Interface):
USB I/O接口用于与外部连接,包括USB数据线(D+、D-)和USB电源线。它负责将USB通信的物理信号传输到USB核心进行处理。 -
USB收发器(USB Transceiver):
USB收发器用于将数字信号转换为模拟信号,并将模拟信号传输到USB总线上。同时,它还将来自USB总线的模拟信号转换为数字信号,以供USB核心处理。 -
USB握手和控制信号(Handshake and Control Signals):
这包括USB通信过程中的握手信号(如ACK、NAK)以及一些控制信号(如Reset、Suspend、Resume)等。这些信号用于控制USB通信的各个阶段和状态。 -
端点缓冲区(Endpoint Buffers):
端点缓冲区用于存储USB通信的数据。每个端点都有对应的缓冲区,用于存储输入或输出数据。数据在USB通信过程中通过这些缓冲区进行传输。 -
中断和DMA控制(Interrupt and DMA Control):
这部分负责管理USB通信中的中断事件以及可能使用的DMA(Direct Memory Access)传输。中断可以用于处理USB事件,而DMA可以加速数据传输过程。 -
USB协议处理(USB Protocol Handling):
USB协议处理模块负责解析USB协议数据包,处理令牌、数据、握手等内容,并根据USB协议执行相应的操作。
总之,STM32F103C8T6的USB模块框图由多个关键部分组成,每个部分都在不同层面上支持USB通信的各个方面,包括物理层的信号处理、USB协议的管理、时钟和电源管理等。详细了解这些组成部分将有助于您更好地理解STM32F103C8T6的USB模块以及其在USB通信中的功能。对于更具体的细节和配置,请查阅STM32F103C8T6的数据手册和相关的USB库文档。
实现一个STM32USB设备的一般步骤
- 选择合适的STM32微控制器:
选择适合您应用需求的STM32微控制器型号,确保它支持USB设备模式。 - 熟悉USB基础知识:
在开始之前,了解USB的基本原理、协议和通信机制,以便理解您将要实现的功能。 - 配置时钟和引脚:
配置微控制器的时钟以及与USB相关的引脚,确保USB时钟和数据线(D+、D-)的连接正确。 - 初始化USB模块:
初始化USB模块,包括USB核心、时钟和电源管理。这将启用USB功能并为后续的配置做准备。 - 配置USB端点:
配置USB端点,确定设备的输入和输出端点。选择适当的传输类型(批量、中断、控制等)和方向(输入、输出)。 - 配置USB描述符:
编写USB描述符,包括设备描述符、配置描述符、接口描述符等。这些描述符定义了设备的特性、功能和通信规则。 - 实现USB类功能(如果需要):
如果您希望实现特定的USB类功能(如HID、CDC等),根据USB类规范实现相应的功能和协议。 - 处理USB事件和中断:
实现USB事件和中断的处理程序,用于响应USB事件,如插拔、挂起、唤醒等。 - 实现USB数据传输:
在USB通信中,实现数据的传输和处理。这可能涉及在端点缓冲区中存储和获取数据。 - 测试和调试:
在实现后进行测试和调试,确保USB通信正常运作,处理各种情况和事件。
STM32支持的设备类:
当涉及到STM32微控制器的USB类时,以下是一些常见的USB类以及它们在STM32中的支持情况的简要列举。
USB类 | 描述和应用 | STM32支持情况 |
---|---|---|
HID(Human Interface Device) | 用于键盘、鼠标、游戏控制器等人机交互设备 | STM32 HAL库提供HID类驱动支持 |
CDC(Communication Device Class) | 用于串口通信设备、虚拟串口、通信接口等 | STM32 HAL库提供CDC类驱动支持 |
MSC(Mass Storage Class) | 用于USB存储设备、U盘模拟、SD卡模拟等 | STM32 HAL库提供MSC类驱动支持 |
Audio Class | 用于音频设备、麦克风、扬声器、音频接口等 | 一些STM32型号提供Audio类的部分支持 |
Printer Class | 用于打印机设备、USB打印输出等 | 通常需要自行实现,没有官方支持 |
CDC-ECM | 用于以太网控制模型,模拟USB以太网适配器 | 通常需要自行实现,没有官方支持 |
HID-Bootloader | 用于USB引导加载程序、固件更新等 | 通常需要自行实现,没有官方支持 |
这只是一些常见的USB类别和它们的应用,STM32系列提供了丰富的USB库和功能,使您能够实现各种USB设备功能。
Interface Device) | 用于键盘、鼠标、游戏控制器等人机交互设备 | STM32 HAL库提供HID类驱动支持 |
| CDC(Communication Device Class) | 用于串口通信设备、虚拟串口、通信接口等 | STM32 HAL库提供CDC类驱动支持 |
| MSC(Mass Storage Class) | 用于USB存储设备、U盘模拟、SD卡模拟等 | STM32 HAL库提供MSC类驱动支持 |
| Audio Class | 用于音频设备、麦克风、扬声器、音频接口等 | 一些STM32型号提供Audio类的部分支持 |
| Printer Class | 用于打印机设备、USB打印输出等 | 通常需要自行实现,没有官方支持 |
| CDC-ECM | 用于以太网控制模型,模拟USB以太网适配器 | 通常需要自行实现,没有官方支持 |
| HID-Bootloader | 用于USB引导加载程序、固件更新等 | 通常需要自行实现,没有官方支持 |
这只是一些常见的USB类别和它们的应用,STM32系列提供了丰富的USB库和功能,我们能够实现各种USB设备功能。
说明:
资料都是来自网络,仅仅是供大家参考,如有错误还请斧正。
部分截图来自哔哩哔哩的视频截图
视频链接在此:
https://www.bilibili.com/video/BV1nU4y1g7nD/?p=79&spm_id_from=333.880.my_history.page.click&vd_source=54e40fa364fe9f695d8955fd2d0b4f68