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

news2024/11/19 17:51:16

前言:本篇博客为手把手教学的 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.coloradmin.cn/o/1955121.html

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

相关文章

杂谈(杂鱼谈论c语言)——2.大小端字节序

⼤⼩端字节序和字节序判断 当我们了解了整数在内存中存储后&#xff0c;我们调试看⼀个细节&#xff1a; #include <stdio.h> int main() {int a 0x11223344;return 0; } 调试的时候&#xff0c;我们可以看到在a中的 0x11223344 这个数字是按照字节为单位&#xff0c;…

【多模态大模型】 ALBEF in NeurIPS 2021

一、引言 论文&#xff1a; Align before Fuse: Vision and Language Representation Learning with Momentum Distillation 作者&#xff1a; Salesforce Research 代码&#xff1a; ALBEF 特点&#xff1a; 该方法使用ViT进行图像特征提取&#xff0c;提出将BERT分两部分&am…

解密阿里大神写的天书般的Tree工具类,轻松搞定树结构!

首发公众号&#xff1a;赵侠客 一、引言 最近公司新进了不少新人&#xff0c;包括一些来自阿里、网易等大型企业的资深工程师。我们组的一位新同事是阿里来的专家&#xff0c;我在CR&#xff08;Code Review, 简称CR&#xff09;时看到了他编写的一个关于树操作的工具类&#…

用qt调试can通信,波特率如何设置

硬件环境介绍&#xff1a; 1、usb转can通信模块型号为创芯科技的USB-CAN适配器&#xff0c;厂家提供的测试软件和demo程序&#xff0c;如下图所示&#xff1b; 2、下位单片机STM32&#xff0c;can通信参数如下图&#xff0c;该测试程序时单片机一直在发送数据&#xff1b; 测试…

STM32F103 RT-thread配置LCD的FMC

使用的正点原子F103ZET6开发板&#xff0c;屏幕是一块4.3寸的TFTLCD&#xff0c;接下来直接讲配置流程 参考文章&#xff1a;基于正点原子F103精英板和CubeIDE的Hal库LCD驱动移植&#xff08;从零开始&#xff09;_正点原子 cubeide-CSDN博客 1&#xff0c;使用RT_Thread Stu…

最新版Bertom降噪,压缩,均衡,简单好用有效,win和mac,支持Intel和M芯片

一。Denoiser Classic 3.07 win&mac 1&#xff09; Denoiser Classic是一个零延迟降噪插件&#xff0c;用于音乐&#xff0c;后期制作和现场使用。 2&#xff09;产品特点&#xff1a; Bertom Denoiser是一个专为音乐和后期制作/对话设计的降噪插件。 一个简单的用户界面&…

深入理解计算机系统 CSAPP 家庭作业11.8

回收子进程是书本537页的内容 在tiny.c文件加以下代码,记得重新编译哦 书中提到CGI是在动态内容中的,所以题目的意思应该是在动态内容里面回收 void handler1(int sig) {int olderrno errno;while (waitpid(-1,NULL,0)>0){Sio_puts("Handler reaped child\n");…

光伏电站气象站:现代光伏系统的重要组成部分

光伏电站气象站&#xff0c;作为现代光伏系统的重要组成部分&#xff0c;集成了气象学、电子信息技术、数据处理与分析等多学科技术于一体&#xff0c;能够实时监测并记录包括温度、湿度、风速、风向、太阳辐射强度、降雨量在内的多种气象参数。这些数据不仅是评估光伏板发电效…

基于粒子群优化算法(PSO)永磁同步电机电流环多参数辨识MATLAB仿真模型

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 仿真模型简介 在同步旋转dq 轴坐标系下建立PMSM 数学模型&#xff0c;将定子dq 轴电压设为辨识模型和实际测量值的输入&#xff0c;设计了PSO 辨识PMSM 参数的适应度函数。该辨识方法不需推导复杂的电机数学…

动态开辟字符串—malloc

该函数包含在头文件<stdlib.h>中. 函数原型 void * malloc (size_t size) ——分配所需的内存空间&#xff0c;并返回一个指向它的指针 size_t size, 该参数的类型是size_t(无符号整型),它表示要开辟的内存块的大小(以字节为单位),它的作用是告诉函数需要动态开辟多少个…

从代码层面熟悉UniAD,开始学习了解端到端整体架构

0. 简介 最近端到端已经是越来越火了&#xff0c;以UniAD为代表的很多工作不断地在不断刷新端到端的指标&#xff0c;比如最近SparseDrive又重新刷新了所有任务的指标。在端到端火热起来之前&#xff0c;成熟的模块化自动驾驶系统被分解为不同的独立任务&#xff0c;例如感知、…

USB 2.0 协议专栏之 USB 2.0 概述(一)

前言&#xff1a;本篇博客为手把手教学的 USB 2.0 协议栈类精品博客&#xff0c;该专栏博客侧重针对 USB 2.0 协议进行讲解。Universal Serial Bus 作为如今最常见的通信接口&#xff0c;被广泛应用于&#xff1a;Keyboard、Mouse、Communication Device Class 和 Mass Storage…

Scrapy + Django爬虫可视化项目实战(一)

目录 一、项目介绍 (一) 项目背景 (二) 项目介绍 二、系统实现 (一) 爬虫 1. 实现步骤 一、爬取字段 二、分析页面 三、具体实现 2. 爬虫结果 系列文章 Python升级打怪—Django入门 Python升级打怪—Scrapy零基础小白入门 实现技术 ScrapyDjangoEcharts 一、项目…

物联网精密空调监控指标解读:松越_TCP7022EX_精密空调

监控易是一款专业的IT和物联网设备监控软件&#xff0c;能够实时监控各类IT资源和物联网设备的运行状态&#xff0c;确保系统的稳定运行。在物联网精密空调领域&#xff0c;监控易对松越_TCP7022EX_精密空调进行了全面的监控&#xff0c;以下是对其监控指标的详细解读。 监控指…

2. Class 文件的组成

16 进制打开class文件 可以通过Notepad下载一个HexEditor插件&#xff0c;下载好该插件后可以以16进制的方式打开class看&#xff0c;打开后我们可以看到如下所示的图片&#xff1a; class 文件的组成 class 文件的组成部分为&#xff1a;魔数&#xff0c;版本号&#xff0c;…

Springboot与SpringSecurity使用(1):介绍、登录验证

一、介绍 Spring 是非常流行和成功的 Java 应用开发框架&#xff0c;Spring Security 正是 Spring 家族中的成员。Spring Security 基于 Spring 框架&#xff0c;提供了一套 Web 应用安全性的完整解决方案。Web 应用的安全性包括用户认证&#xff08;Authentication&#xff09…

Linux网络:传输层协议TCP(三)滑动窗口及流量控制

目录 一、关于滑动窗口在TCP中的应用 1.1什么是滑动窗口&#xff0c;为什么要有滑动窗口 1.2滑动窗口的实现 1.3滑动窗口针对丢包重传的处理机制 二、流量控制 一、关于滑动窗口在TCP中的应用 1.1什么是滑动窗口&#xff0c;为什么要有滑动窗口 在上一篇博文中博主阐述了…

植物神经紊乱拜拜啦! 6招让你心情美美哒,放松到飞起~

Hey宝贝们&#xff0c;是不是有时候觉得心里的小宇宙&#x1f30c;乱糟糟的&#xff0c;像是有一群小精灵&#x1f9da;‍♀️在跳舞&#xff0c;却偏偏踩不到点上&#xff1f;没错&#xff0c;这可能就是植物神经紊乱在作祟啦&#xff01;别怕&#xff0c;我这就给你支几招&am…

Nginx系列-12 Nginx使用Lua脚本进行JWT校验

背景 本文介绍Nginx中Lua模块使用方式&#xff0c;并结合案例进行介绍。案例介绍通过lua脚本提取HTTP请求头中的token字段&#xff0c;经过JWT校验并提取id和name信息&#xff0c;设置到http请求头中发向后段服务器。 默认情况下&#xff0c;Nginx自身不携带lua模块&#xff0…

Transformer中的Multi-head Attention机制解析——从单一到多元的关注效益最大化

Transformer中的Multi-head Attention机制解析——从单一到多元的关注效益最大化 Multi-head Attention的核心作用 组件/步骤描述多头注意力机制&#xff08;Multi-head Attention&#xff09;Transformer模型中的关键组件&#xff0c;用于处理序列数据功能允许模型同时关注到…