USB 模块 全面解析(二)

本文是我整理的一些 USB 的学习心得,希望能对大家有所帮助。

文章目录

  • 前言
  • 🍍USB 协议层数据格式
      • 🍇包格式
          • 🍓 PID 域
          • 🍓 令牌包
          • 🍓 数据包
          • 🍓 握手包
      • 🍇传输类型
          • 🍓 批量传输
          • 🍓 中断传输
          • 🍓 实时传输
          • 🍓 控制传输
  • 🍍USB 描述符
  • 总结


前言

这篇文章为大家介绍 USB协议层数据格式 以及 USB描述符 。

USB 模块 全面解析(一)

🍍USB 协议层数据格式

在USB设备中,数据传输的基本单位是 “ 包 ” 。数据先传输最低位(LSB)。那 USB “包” 里面具体包含哪些内容(“域”)?

🍇包格式

在这里插入图片描述

至于SOP, SYNC, EOP 具体的电平状态,在上篇文章中都已详细介绍了 : USB 模块 全面解析(一)

  • SOP : “包” 的开始。
  • SYNC : 用来同步时钟。
  • Packet Content : PID(包类型) + 地址/帧号/数据 + CRC(校验)。
    地址 :确定 包 要发给哪个 USB 设备。
  • EOP : “包” 的结束。

下面主要介绍 包格式里 “Packet Content” 部分 的 PID。

🍓 PID 域

在 USB 协议中, PID 是用来标识 USB 数据包类型的关键字段。用于指示 数据包的类型 和 方向

在 USB 包中,PID域 使用 8 位来表示,格式如下:

在这里插入图片描述

  • 前 4 位 : 标识数据包的类型。
  • 后 4 位:是前 4 位的取反,用于校验 PID 类型的正确性。如果接收方发现 后 4 位不是 前 4 位的取反,就认为发生了错误。
“ 包 ” 可以分为 4 种类型:
① 令牌包(Token):指示数据传输的开始 和 方向。 (最低 2 位是 01 B)
② 数据包(Data):用于实际传输的数据部分。( 11 B)
③ 握手包(Handshake):确认数据包的接收状态。( 10 B)
④ 特殊包(Special):用于特殊用途的包。( 00 B)

下面是根据 4 位的 PID 分为 16 种具体的 “包”类型:
在这里插入图片描述


🍓 令牌包

这里需要注意一点,有 4 种令牌包,其中 SOF 用于通知所有的设备,而 OUT, IN, SETUP 用来通知某个设备。下面是对于 OUT, IN, SETUP 令牌包的结构。

由于 令牌包 起通知作用,要通知某个具体的USB 设备,所以要知道 USB设备的地址(7位)USB设备的端点号(4位)

在这里插入图片描述
在这里插入图片描述

所以一个完整的令牌包如下:
在这里插入图片描述

首先 发送 SOP 表示包的开始 ->  SYNC 进行信号的同步 -> 根据 PID 的类型决定是 读/写数据 -> 11 位的帧号确定USB设备 -> CRC 校验 -> EOP 表示包的结束。

🍓 数据包

Host 使用 OUT、IN、SETUP 来通知设备:我要传输数据了。数据通过"数据包"进行传输。数据包也有 4 种类型:DATA0、DATA1、DATA2、MDATA。我们只需了解 DATA0、DATA1。

为什么要 引入不同类型的数据包?

Host 和设备都会维护自己的数据包切换机制,当数据包成功发送或者接收时,数据包类型切换。当检测到对方使用的数据包类型不对时,USB 系统认为发生了错误。

比如:
① Host 发送 DATA0 给设备,设备返回 ACK 表示成功接收,设备期待下一个数据是 DATA1
② 但是 Host 没有接收到 ACK,Host 认为数据没有发送成功,Host 继续使用 DATA0 发送上一次的数据
③ 设备再次接收到 DATA0 数据包,它就知道:哦,这是重传的数据包

一个完整的数据包如下:

在这里插入图片描述


🍓 握手包

握手包有 4 类:ACK、NAK、STALL、NYET。

  • ACK : 数据接收方用来回复发送方,表示正确接收到了数据并且有足够的空间保存数据。
  • NACK : Host 发送数据给设备时,设备可以回应 NAK 表示"我还没准备好,没办法接收数据";Host 想读取设备的数据时,设备可以回复 NAK 表示"我没有数据给你"。
  • STALL : 表示发生了错误,比如设备无法执行这个请求(不支持该断点等待)、断点已经挂起。设备返回 STALL 后,需要主机进行干预才能接触 STALL 状态。
  • NYET : 仅适用于高速设备。Host 可以发出 PING 包用来确认设备有数据,设备可以回应NYET 表示"还没呢"。Hub 也可以回应 NYET 表示低速/全速传输还没完结

一个完整的握手包如下:

在这里插入图片描述


🍇传输类型

USB 设备支持 4 种不同的传输类型,每种不同的传输类型使用不同的场景和需求。

在介绍这 4 种传输类型之前,先来了解几个概念:

  • 事务:完整的数据传输,需要涉及多个包 令牌包、数据包、握手包。这个完整的数据传输过程,被称为事务(Transaction)。
  • 传输:由一个 或者多个事务组成,完成一次完整的通信。

有些事务需要握手包,有些事务不需要握手包,有些事务可以传输很大的数据,有些事务只能传输小量数据。

有四类事务:

① 批量事务:用来传输大量的数据,数据的正确性有保证,时效没有保证。
② 中断事务:用来传输周期性的、小量的数据,数据的正确性和时效都有保证。
③ 实时事务:用来传输实时数据,数据的正确性没有保证,时效有保证。
④ 建立事务:跟批量事务类似,只不过令牌包是 SETUP 令牌包。

有四类传输(Transfer):

① 批量传输:就是使用批量事务实现数据传输,比如 U 盘。
② 中断传输:就是使用中断事务实现数据传输,比如鼠标。
③ 实时传输:就是使用实时事务实现数据传输,比如摄像头。
④ 控制传输:由建立事务、批量事务组成,所有的 USB 设备都必须支持控制传输,用于"识别/枚举"。

  • 过程 :
    对于 批量,中断,实时传输 都是由一个 事务组成,不再划分为多个阶段。
    对于 控制传输 由多个 事务组成,这些事务分别处于 多个过程:建立过程,数据过程,状态过程。

  • 阶段 :
    事务由 包 组成,这些 包 处于 3 个阶段:令牌阶段,数据阶段,握手阶段。令牌阶段(Token phase):由令牌包实现。 数据阶段(Data phase):由数据包实现。握手阶段(Handshake phase):由握手包实现

① BIT 组成域(Field)
② 域组成包(Packet)
包组成事务(Transaction)
事务组成传输(Transfer)


🍓 批量传输
  • 批量传输用批量事务来实现,用于传输大量的数据,数据的正确性有保证,时效没有保证。

  • 批量事务由 3 个阶段(phase)组成:令牌阶段、数据阶段、握手阶段。每个阶段都是一个完整的包,含有 SOP、SYNC、PID、EOP。(下图中各个矩形框就对应一个完整的包)

在这里插入图片描述
在这里插入图片描述


🍓 中断传输
  • 中断传输用中断事务来实现,用于传输小量的、周期性的数据。数据的正确性和时效都有保证。

  • 中断事务由 3 个阶段(phase)组成:令牌阶段、数据阶段、握手阶段。每个阶段都是一个完整的包,含有 SOP、SYNC、PID、EOP。中断事务的优先级比批量事务更高,它要求实时性,而批量事务不要求实时性。

中断传输 要求实时性,由于 USB 协议中没有 中断的功能,所以,它使用"周期性的读、写"来实现及时性。具体过程如下:

① Host 每隔 n 毫秒发出一个 IN 令牌包
② 鼠标有数据的话,发出 DATA0 或 DATA1 数据包给 Host;鼠标没有数据的话,发出 NAK 给Host。从下图中可以看到没有 NYET 延时等待

在这里插入图片描述


🍓 实时传输
  • 实时传输用实时事务来实现,用于传输实时数据,对数据的正确性没有要求。
  • 实时事务由 2 个阶段(phase)组成:令牌阶段、数据阶段。每个阶段都是一个完整的包,含有 SOP、SYNC、PID、EOP。实时事务不需要握手阶段。

实时传输 不要求数据的准确性,没有握手阶段。(适用场景:视频通话等)
在这里插入图片描述


🍓 控制传输

控制传输由多个事务组成,这些事务分别处于 3 个过程:建立过程(stage)、数据过程(stage)、状态过程(stage)。

① 建立过程(stage),使用 SETUP 事务:Host 发出 SETUP 令牌包、DATA0 数据包、得到 ACK握手包。

② 数据过程(stage),使用批量事务

a. 对于输出:Host 发出OUT 令牌包,发出 DATA0、DATA1 数据包、得到 ACK 握手包
b. 对于输入:Host 发出 IN 令牌包,读到 DATA0、DATA1 数据包、发出 ACK 握手包

③ 状态过程(stage),使用批量事务:

a. 对于输出:Host 发出IN 令牌包,读到 DATA1 数据包,发出 ACK 握手包
b. 对于输入:Host 发出 OUT 令牌包,发出 DATA1 数据包,等待 ACK 握手包

在这里插入图片描述

上图的 每一个方框,都是一个完整的事务,含有:Token Packet、Data Packet、Handshake Packet。

例如,对于一个 SETUP 事务,下面是它的组成包 :

在这里插入图片描述

在"setup 事务"中:

① SETUP 令牌包:用来通知设备,“要开始传输了”
② DATA0 数据包 ( 8 字节数据 ):它含有固定的格式,用来告诉设备"是读还是写"、“读什么”、“写什么”。


🍍USB 描述符

设备/配置/接口/端点 :

  • 对于一个 USB设备,它可以有多种配置 (Configuration)。
  • 一个配置下 可以有 多个接口 (Interface), 接口等同于 功能。 比如 USB 耳机有 2 个接口(功能):声音收发,按键控制。
  • 一个接口 可以有 多个设置(Setting),比如 默认设置下 它使用较低的带宽,也可以选择其他设置去使用更高的带宽。
  • 一个接口 由 一个/ 多个 端点(Endpoint)组成。端点0 属于整个设备,是双向的。

怎么描述 设备,配置,端点,接口?

使用描述符(Descriptors)。有设备描述符、配置描述符、接口描述符、端点描述符。所谓描述符,就是一些格式化的数据,用来描述信息。

一个 USB 设备:
① 只有一个设备描述符:用来表示设备的 ID、它有多少个配置、它的端点 0 一次最大能传
输多少字节数据
② 可能有多个配置描述符:用来表示它有多少个接口、供电方式、最大电流
③ 一个配置描述符下面,可能有多个接口描述符:用来表示它是哪类接口、有几个设置
(Setting)、有几个端点
③ 一个接口描述符符下面,可能有多个端点描述符:用来表示端点号、方向(IN/OUT)、类
型(批量/中断/同步)

在这里插入图片描述

还有 一些字符串描述符(String descriptors),它用可读的文字来描述设备,是可选的。


总结

下篇文章为大家介绍 工业控制中经常用到的 Modbus 通信协议。

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

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

相关文章

从基础到实践(十):MOS管的全面解析与实际应用

MOS管(金属-氧化物半导体场效应晶体管)是现代电子技术的基石,凭借高输入阻抗、低功耗和易集成特性,成为数字电路、电源管理和信号处理的核心元件。从微处理器到新能源汽车电驱系统,其高效开关与放大功能支撑了计算机、…

AES/CBC/PKCS5Padding加密

1、加密代码如下 public static String encryptAEs_CBC(String data,String key,byte[] iv) {Cipher cipher = null;try {cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");//位数不够,自动补一个长度int blocksize = cipher.getBlockSize();byte[] dataBytes …

指纹细节提取(Matlab实现)

指纹细节提取概述指纹作为人体生物特征识别领域中应用最为广泛的特征之一,具有独特性、稳定性和便利性。指纹细节特征对于指纹识别的准确性和可靠性起着关键作用。指纹细节提取,即从指纹图像中精确地提取出能够表征指纹唯一性的关键特征点,是…

Python 图像处理之 Pillow 库:玩转图片

哈喽,大家好,我是木头左! Pillow 库作为 Python 图像处理的重要工具之一,为提供了便捷且功能丰富的接口,让能够轻松地对图像进行各种操作,从简单的裁剪、旋转到复杂的滤镜应用、图像合成等,几乎无所不能。接下来,就让一起深入探索如何使用 Pillow 库来处理图片,开启一…

Android Flow 示例

在Android开发的世界里,处理异步数据流一直是一个挑战。随着Kotlin的流行,Flow作为Kotlin协程库的一部分,为开发者提供了一种全新的方式来处理这些问题。今天,我将深入探讨Flow的设计理念,并通过具体的例子展示如何在实…

记录uniapp小程序对接腾讯IM即时通讯无ui集成(2)

完成以上步骤之后开始进行登录,登陆就需要账号。这个账号我们可以在腾讯云中创建。 有了账号之后开始去小程序进行登陆操作。腾讯云接口文档 这里除了帐号还需要一个校验值userSig正常项目开发这个字段可以在登陆后让后端返回,现在是测试我们直接去控制…

北京航空航天大学计算机复试上机真题

北京航空航天大学计算机复试上机真题 2023北京航空航天大学计算机复试上机真题 在线评测&#xff1a;https://app2098.acapp.acwing.com.cn/ 阶乘和 题目描述 求Sn1!2!3!4!5!…n!之值&#xff0c;其中n是一个数字。 输入格式 输入一个n&#xff08;n<20&#xff09; …

阿里万相,正式开源

大家好&#xff0c;我是小悟。 阿里万相正式开源啦。这就像是AI界突然开启了一扇通往宝藏的大门&#xff0c;而且还是免费向所有人敞开的那种。 你想想看&#xff0c;在这个科技飞速发展的时代&#xff0c;AI就像是拥有神奇魔法的魔法师&#xff0c;不断地给我们带来各种意想…

算法之数据结构

目录 数据结构 数据结构与算法面试题 数据结构 《倚天村 • 图解数据结构》 | 小傅哥 bugstack 虫洞栈 ♥数据结构基础知识体系详解♥ | Java 全栈知识体系 线性数据结构 | JavaGuide 数据结构与算法面试题 数据结构与算法面试题 | 小林coding

零基础学习之——深度学习算法介绍01

第一节.基础骨干网络 物体分类是计算机视觉&#xff08;computer vision&#xff0c;CV&#xff09;中最经典的、也是目前研究得最为透彻的一 个领域&#xff0c;该领域的开创者也是深度学习领域的“名人”级别的人物&#xff0c;例如 Geoffrey Hinton、Yoshua Bengio 等。物…

弧度与角度之间的转换公式

Radian 弧度的英语 简称 Rad Degree 角度的英语 简称 Deg 角度转弧度 RadDeg*180/π CogMuisc.DegToRad(double degress) DegRad/180*π CogMuisc.RadToDeg(double radians) 总结: 角度大 弧度小 弧度转角度 肯定要乘以一个大于1的数 那就是…

css之英文换行样式

在 CSS 中&#xff0c;要实现英文文本自动换行但不从单词中间断开的效果&#xff0c;可以使用 word-wrap 或 overflow-wrap 属性。以下是相关的 CSS 属性和它们的配置&#xff1a; 使用 overflow-wrap 或 word-wrap /* This property is used to handle word breaking */ .wo…

40岁开始学Java:Java中单例模式(Singleton Pattern),适用场景有哪些?

在Java中&#xff0c;单例模式&#xff08;Singleton Pattern&#xff09;用于确保一个类只有一个实例&#xff0c;并提供全局访问点。以下是详细的实现方式、适用场景及注意事项&#xff1a; 一、单例模式的实现方式 1. 饿汉式&#xff08;Eager Initialization&#xff09; …

【前端基础】3、HTML的常用元素(h、p、img、a、iframe、div、span)、不常用元素(strong、i、code、br)

HTML结构 一个HTML包含以下部分&#xff1a; 文档类型声明html元素 head元素body元素 例&#xff08;CSDN&#xff09;&#xff1a; 一、文档类型声明 HTML最一方的文档称为&#xff1a;文档类型声明&#xff0c;用于声明文档类型。即&#xff1a;<!DOCTYPE html>…

文本挖掘+情感分析+主题建模+K-Meas聚类+词频统计+词云(景区游客评论情感分析)

本文通过情感分析技术对景区游客评论进行深入挖掘,结合数据预处理、情感分类和文本挖掘,分析游客评价与情感倾向。利用朴素贝叶斯和SVM等模型进行情感预测,探讨满意度与情感的关系。通过KMeans聚类和LDA主题分析,提取游客关心的话题,提供优化建议,为未来研究提供方向。 …

【实战 ES】实战 Elasticsearch:快速上手与深度实践-2.2.2线程池配置与写入限流

&#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 文章大纲 Elasticsearch批量写入性能调优&#xff1a;2.2.2 线程池配置与写入限流深度实践1. 线程池核心机制解析1.1 Elasticsearch线程池架构1.2 Bulk线程池工作模型 2. 写入场景线程…

VSCode 与 Vim 插件 的 复制粘贴等快捷键冲突,优先使用 VSCode 的快捷键

VSCode 与 Vim 插件 的 复制粘贴等快捷键冲突&#xff0c;优先使用 VSCode 的快捷键 在 VSCode 中&#xff0c;如果你发现 Vim 插件&#xff08;如 VSCodeVim 扩展&#xff09;与 VSCode 的默认复制粘贴快捷键&#xff08;CtrlC / CtrlV&#xff09;冲突&#xff0c;并且你想优…

tsconfig.json 配置清单

tsconfig.json 配置清单 基础结构 {"compilerOptions": {// 编译选项},"include": [// 指定需要编译的文件或目录],"exclude": [// 指定不需要编译的文件或目录],"extends": "./base-tsconfig.json","files": […

springboot可以同时处理多少个请求

源码 ServerProperties Tomcat 配置 参数解析 必须要先建立连接&#xff0c;再用线程处理。 比如max-connection最大连接数&#xff0c;accept-count相当于队列容量。总连接数二者和 min-spare-treads 核心线程数默认10&#xff0c;max-threads最大线程数默认200。 正常…

Spring 三级缓存 vs 二级缓存:深度解析循环依赖的终极解决方案

目录 一. 循环依赖的本质矛盾 1. 什么是循环依赖&#xff1f; 2. 矛盾的核心 二. 三级缓存架构解析 三级缓存工作流程图​编辑 三、为什么必须三级缓存&#xff1f; 1. 二级缓存的致命缺陷 2. 三级缓存的精妙设计 四、场景推演&#xff1a;三级缓存如何解决代理问题 …