USB 2.0 协议专栏之 USB 2.0 连接与枚举(二)

前言:本篇博客为手把手教学的 USB 2.0 协议栈类精品博客,该专栏博客侧重针对 USB 2.0 协议进行讲解。本篇博客将针对 USB 2.0 中的连接与枚举进行教学,USB 的枚举过程是 USB 协议中至关重要的一环,也是嵌入式工程师必须掌握的内容。USB 协议栈是嵌入式工程研发过程中很大的坑,USB 协议栈非常冗杂且深奥,但它在工程项目中却至关重要,希望这篇博文能给读者朋友的工程项目给予些许帮助,Respect!

Universal Serial Bus 版本:

Universal Serial Bus 枚举过程:

推荐网址

USB官网:Front Page | USB-IF

USB中文网:USB中文网 (usbzh.com)

沁恒WCH官网:首页 - 南京沁恒微电子股份有限公司 (wch.cn)

一、USB 连接与检测

1.1 USB 主从机

USB HOST:

1、控制总线: USB 主机控制整个 USB 总线,包括数据传输的初始化、管理和终止。 主机负责为 USB 设备提供电源,并管理所有与设备之间的通信。

2、枚举过程: 当 USB 设备连接到主机时,主机通过枚举过程来识别设备,并为其分配资源。 枚举包括查询设备信息、加载必要的驱动程序,并为设备分配唯一的地址。

3、带宽管理: 主机负责分配总线带宽,确保各个设备按照其传输类型(控制、批量、中断、同步)的要求进行数据传输。

4、协议和标准: USB 主机必须符合 USB 规范,并能够处理各种 USB 设备类型和速度等级(如低速、全速、高速和超速)。

USB Device:

1、响应请求: USB 设备响应来自主机的请求,执行数据传输或其他操作。 设备通常有一个或多个端点(Endpoint),用于与主机进行数据交换。

2、地址分配: 在枚举过程中,每个 USB 设备会被主机分配一个唯一的地址,用于后续通信。

3、速度等级: USB 设备根据其速度能力被分类为低速 1.5 Mbps、全速 12 Mbps、高速 480 Mbps 或超速 5 Gbps 及以上。

4、设备类型: USB 设备可以是各种类型,如存储设备、音频设备、视频设备、打印机、键盘、鼠标等。

1.2 全速和低速 USB 

低速(Low Speed)和全速(Full Speed)设备区分方法比较简单:在设备端有一个1.5k的上拉电阻,当设备插入hub或上电(固定线缆的USB设备)时,有上拉电阻的那根数据线就会被拉高,hub根据D+/D-上的电平判断所挂载的是全速设备还是低速设备。

  • 低速设备1.5K上拉电阻位于D-

  • 全速设备1.5K上拉电阻位于D+

(1)、低速 USB 设备:

(2)、全速 USB 设备:

(3)、高速 USB 设备(依赖于全速 USB):

1、电缆和连接器:高速USB设备使用与全速和低速USB相同的物理连接器和电缆,但为了支持更高的数据速率,电缆的质量和电气特性必须满足更严格的标准。高速USB电缆通常有更厚的导线和更好的屏蔽。

2、信号完整性:高速信号传输要求更低的信号衰减和更好的电磁兼容性(EMC)。

1.3 USB 连接

 (1)、USB 是否连接

1、USB 设备断开:主机检测到 D+ 和 D- 上近地状态(0V),并持续 2.5us 以上

2、USB 设备连接:主机检测到 D+ 或 D- 上有高电平(3V),并持续 2ms 以上

 (2)、各种速度 USB 设备连接  

1、Low Speed USB:主机检测到 D- 上高电平

2、Full Speed USB:主机检测到 D+ 上高电平(有可能是高速设备)

3、High Speed USB:主机检测到 D+ 上高电平,然后通过一系列协商握手信号确认双方身份(双向检查)

USB 连接时候的电平状态:

二、USB 枚举过程

2.1 USB 枚举

当 USB 产品被成功检测到连接时,USB HOST 将与 USB Device 之间进行枚举操作,USB 设备间的枚举是学习 USB 协议栈至关重要的部分!

USB 枚举过程:

USB主机检测到USB设备插入后,就要对设备进行枚举了。
枚举的作用就是从设备是那个读取一些信息,知道设备是什么样的设备,然后通信,这样主机就可以根据这些信息安装合适的驱动程序。
USB设备的枚举过程如下:

1、​USB 设备插入USB 接口后,主机检测 D+/D- 线上的电压,确认有设备连接,USB 集线器通过中断 IN 通道,向主机报告有USB设备连接。

2、主机接到通知后,通过集线器设备类请求 GetPortStatus 获取更多的信息。然后主机等待100ms等待设备稳定,然后发送集线器设备类请求 SetPortStatus,对 USB 设备进行复位,复位后USB设备的地址为0,这样主机就可以使用地址 0 与USB设备进行通信,复位后的设备可以从USB总线上获取小于100mA的电流,用于使用默认地址对管道 0 控制事务响应。

3、主机向地址为 0(即刚插入的 USB 设备)的设备端点 0(默认端点)发送获取设备描述符的标准请求 GetDescriptor。

4、USB 设备收到请求后,将其预设的设备描述符返回给主机。

5、主机收到设备描述符后,返回一个 0 长度的数据确认包。

6、主机对设备再次复位,复位后主机对地址为0的设备端点0发送一个设置地址 SetAddress请求(新的设备地址在数据包中)。

7、主机发送请求状态返回,设备返回 0 长度的状态数据包。

8、主机收到状态数据包后,发送应答包 ACK 给设备,设备收到 ACK 后,启用新的设备地址。

9、主机再次使新的地址获取设备描述符 GetDescriptor,设备返回地址描述符。

10、主机获取第一次配置描述符有前 18 个字节,设备返回配置描述符的前 18 个字节,其数据包中含有配置描述符的总长度。

11、主机根据配置描述符的总长度再次获取配置描述符,设备返回全总的配置描述符。

12、如果还有字符串描述符,系统还会获取字符串描述符。像HID设备还有报告描述符,它也需要单独获取。 

2.2 代码案例

本篇博客以沁恒微 CH32V307VCT6 作为 MCU 进行讲解分析(USB Device为主):

以沁恒微 CH32V307 的官方 USB 模拟 MSC(UDISK) 为例,针对  USB 的枚举我们重点关注 ch32v30x_usbhs_device.c 这个文件,该文件中包含了一系列的 USB Device(从机)的 USB 初始化、USB 枚举和 USB 中断服务函数等操作!

在 ch32v30x_usbhs_device.c 文件中我们可以找到 USBHS_IRQHandler() 函数,该函数就是 USB 设备建立通信以及数据传输的核心函数:

USBHS_IRQHandler() 函数中,存在 SETUP 令牌包的处理过程。当 USB 设备进行枚举过程中,SETUP 操作将 USB 从机中保存的 Device descriptor、Configuration descriptor、 String description 等一系列描述符发送给主机进行处理(根据 USB HOST 发送的请求进行应答):

读者朋友们可以根据自己的代码去分析一下 USBHS_IRQHandler() 函数中的内容,这部分是最核心的内容了!针对这部分出现的各类描述符,包括: Device descriptor、Configuration descriptor、 String description 等,作者将在后续的博客中进行详细讲解!

在 USB 枚举过程中,一般发挥核心作用的 USB 端点为 Enp0,这一点在 USBHS_IRQHandler() 函数中也可以被看出!

三、粉丝群 

嵌入式交流群 1 群:958820627(可能已满);嵌入式交流群 2 群:876919359(可能已满);嵌入式交流群 3 群:957431539(推荐加入)。欢迎加群,有问题可以群内分享技术交流,秋招和春招会有诸多大厂内推码或者内推名额推荐。希望大家友好讨论技术知识!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/51262.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python层内层外多图布局图基分析

🎯要点 🎯多层图和多路复用图结构模型 | 🎯图结构变换、读写图、聚类系数、可视化、同构、图基分析 | 🎯稀疏网络边数和节点数线性扩展 | 🎯耦合边的生成和惰性评估 | 🎯层内布局计算、多层网络绘图、层间…

世界的三大财团都是谁在控制?

在美国的华尔街有三巨头,他们是世界的三大财团,管理着将近22万亿美元的财富。这个数字是个什么概念呢,我们打个比方,欧盟27国再加上日本一年的GDP也不过才刚刚好20万亿美元。这三大财团分别是:第一是贝莱德管理着10万亿…

基于深度学习网络的USB摄像头实时视频采集与水果识别matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) 将usb摄像头对准一个播放不同水果图片的显示器,然后进行识别,识别结果如下: 本课题中…

智能火灾预警系统:基于深度学习的火焰与烟雾检测平台

基于深度学习的火焰与烟雾检测系统(UI界面YOLOv8/v7/v6/v5代码训练数据集) 引言 火灾是对人类生命和财产安全的严重威胁,及时检测和报警是减少火灾损失的关键。传统的火焰和烟雾检测方法主要依靠传感器,但这些方法存在检测范围有…

Vue3--

一、pinia (集中式状态(数据)管理) 1、准备一个效果 2、存储读取数据 3、修改数据三种方式 4、storeToRefs 5、getters 当state中的数据,需要经过处理后在使用时,可以使用getters配置 6、$subscribe的使用…

【Oracle 进阶之路】SQL 简介

SQL 的历史 E. F. Codd 博士于 1970 年 6 月在计算机机械协会 (ACM) 期刊 Communications of the ACM 上发表了论文“A Relational Model of Data for Large Shared Data Banks”。Codd 模型现在被接受为关系数据库管理系统 (RDBMS&#xff…

mqtt:测试eclipse paho qos=1的数据重发的功能

# 测试程序 【pom.xml】 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.3.12.RELEASE</version></dependency><dependency…

Unity横版动作游戏 -瓦片地形和动画瓦片

(规则瓦片)瓦片地形和动画瓦片 准备阶段 在Tilemap中创建一个新的文件夹起名叫做Rule Tile&#xff0c;创建一个Rule Tile&#xff0c;用来设置瓦片地形&#xff0c;我们将用他来绘制地形图&#xff0c;类似于Godot中的瓦片地形。 这里给他取名为了Ground 1&#xff0c;用于创…

C++——vector在使用过程中迭代器失效的几个常见情景

在使用vector的时候我们可以会遇到需要在已有对象的某个数据之前插入一个数据再对被插入的数据进行修改操作&#xff0c;情况如下&#xff1a; 这段代码在编译器的过程中并不会出现问题&#xff0c;可是一旦运行程序就会出现程序崩溃&#xff0c;这里就是迭代器失效的第一种情况…

如何使用 HTTPie 进行高效的 HTTP 请求

如何使用 HTTPie 进行高效的 HTTP 请求 引言 HTTPie 是一个命令行 HTTP 客户端&#xff0c;它以其简洁的语法和人性化的输出格式赢得了广大开发者的喜爱。与 curl 相比&#xff0c;HTTPie 提供了更加直观和用户友好的接口&#xff0c;使得执行 HTTP 请求变得轻松愉快。本文将…

PVE环境中调整虚拟机磁盘大小

我的希望将PVE中的虚拟机磁盘调整一下&#xff0c;增加20GB。在查询了一些资料后&#xff0c;做一下总结教程。 环境是 PVE8.2.2 版本&#xff0c;虚拟机系统是centos7.9.2009-minimal&#xff0c; 安装系统时划分磁盘分区方式是默认分区方式&#xff08;不同分区方式下&#…

pinia安装及简介

pinia简介 基本特点 轻量级&#xff1a;Pinia相比于传统的Vuex&#xff0c;体积更小&#xff0c;性能更好&#xff0c;只有大约1KB左右。 简化API&#xff1a;Pinia简化了状态管理库的使用方法&#xff0c;抛弃了Vuex中的mutations&#xff0c;只保留了state、getters和actions…

WHAT - 一个 Github 仓库的 License 如何解读

目录 一、背景二、解读许可证说明的作用常见的开源许可证类型使用他人代码仓库时需要注意的事项结论 实践作为开发者1. 选择许可证类型2. 在 README 文件中编写许可证信息 作为使用者1. 确定权限2. 了解和遵守条款 总结 一、背景 我们经常在一些 Github 仓库里看到 License 部…

探索 `pyjwt`:Python 中的 JWT 处理专家

文章目录 探索 pyjwt&#xff1a;Python 中的 JWT 处理专家简介&#xff1a;为何选择 pyjwt&#xff1f;什么是 pyjwt&#xff1f;安装 pyjwtpyjwt 的基本使用1. 编码JWT2. 解码JWT3. 验证签名4. 过期时间5. 自定义头部 场景应用场景一&#xff1a;用户登录场景二&#xff1a;A…

使用标量函数实现 EF Core 的实用方法

一.介绍 在构建应用程序时&#xff0c;您可能使用标量函数在数据库端实现一些逻辑。在 SQL 中&#xff0c;标量函数是一种对单个值或少量输入值进行操作并始终返回单个值作为输出的函数。这些函数本质上是可重复使用的代码块&#xff0c;用于对数据执行计算或操作。 以下是标…

商品中心关于缓存热key的解决方案

缓存热key一旦被击穿&#xff0c;流量势必会打到数据库&#xff0c;如果数据库崩了&#xff0c;游戏直接结束。 从两点来讨论&#xff1a;如何监控、如何解决。 如何监控 通过业务评估&#xff1a;比如营销活动推出的商品或者热卖的商品。基于LRU的命令&#xff0c;redis-cl…

doccano安装与使用

1.安装 &#xff08;1&#xff09;创建虚拟环境 conda create -n doccano conda activate doccano &#xff08;2&#xff09;安装doccano pip install doccano &#xff08;3&#xff09;doccano初始化 doccano init doccano createuser --username admin --password pa…

Java整理20

1、数据校验 Validation数据校验&#xff08;1&#xff09;实现org.springframework.validation.Validator接口&#xff0c;在代码中调用这个类&#xff08;2&#xff09;按照BeanValidation方式来校验&#xff0c;通过注解方式&#xff08;3&#xff09;基于方法实现校验&…

chk是什么文件格式 chk文件怎么恢复正常 chkdsk文件损坏怎么修复

在使用电脑和移动存储设备时&#xff0c;有时我们会发现磁盘中出现了大量的chk文件。这些chk文件无法打开&#xff0c;也无法得知其原本内容。那么&#xff0c;这些chk文件是什么呢&#xff1f;又该如何将chk文件恢复正常呢&#xff1f; chk文件是什么&#xff1f; 在我们查看…

Cocos Creator2D游戏开发-(2)Cocos 常见名词

场景&#xff08;Scene): 它一个容器&#xff0c;容纳游戏中的各个元素&#xff0c;如精灵&#xff0c;标签&#xff0c;节点对象。它负责着游戏的运行逻辑&#xff0c;以帧为单位渲染这些内容。就是你理解到的那个场景; 个人理解就是一个画面, 一个游戏不同的关卡,会有不同的…