USB学习(2):USB端点和传输协议(数据包、事物)详解

接着上一篇文章USB学习(1):USB基础之接口类型、协议标准、引脚分布、架构、时序和数据格式,继续介绍一下USB的相关知识。

文章目录

  • 1 USB端点(Endpoints)
    • 1.1 基本知识
    • 1.2 四种端点
  • 2 传输协议
    • 2.1 数据包类型
      • 2.1.1 令牌数据包(Token packets)
      • 2.1.2 数据数据包(Data packets)
      • 2.1.3 握手数据包(Handshake packets)
      • 2.1.4 特殊数据包(Special packets)
    • 2.2 事务类型
      • 2.2.1 IN/Read/Upstream事务
      • 2.2.2 OUT/Write/Downstream事务
      • 2.2.3 控制事务

1 USB端点(Endpoints)

1.1 基本知识

在USB规范中,设备端点是USB设备的一个可以唯一寻址的部分,它是在主机和设备之间的通信流中信息的源或接收点。USB设备的枚举过程是设备与主机建立通信连接并进行初始化的过程,在这个过程中,主机需要了解设备的性能和功能,以正确配置和控制它。但在主机获取完整的设备信息之前,还需要建立初始连接并执行一些必要的控制操作。
(1)端点0
在这一步骤中,控制端点或端点0用于与设备进行通信,它由端点0 IN和端点0 OUT组成。USB规范要求每个USB设备都必须支持 端点0,因为它是用于设备枚举和基本通信的必要组成部分。
(2)端点个数
除了端点0,特定设备支持的端点数量基于其设计要求。像鼠标这样的简单设计可能只需要一个输入端点,更复杂的设计可能需要多个数据端点。USB规范为每个方向(16个输入/16个输出,总共32个)的高速和全速设备设置了端点数量上限(不包括控制端点0)。低速设备限制为两个端点,USB类设备的端点数量则更多。例如,低速的人机界面设备(HID)可能只有两个数据端点:一个输入和一个输出端点。
(3)端点方向
数据端点本质上是双向的,但我们可以配置它们为单向。例如,端点1可以是输入端点或输出端点,在设备描述符中,会有一些参数或标志来明确指定端点1是用于接收数据(输入端点)还是用于发送数据(输出端点)。
(4)端点错误检测
端点使用CRC来检测事务中的错误。计算方式请参考USB规范,这些计算的处理由USB硬件负责,以便可以发出适当的响应。事务的接收方会将CRC与数据进行比对。如果两者匹配,那么接收方会发送一个ACK。否则,发送方将进行重试。

1.2 四种端点

USB规范进一步定义了四种类型的端点,并基于类型和支持的设备速度设置了最大数据包大小。开发者使用端点描述符根据其设计需求来识别端点类型和最大数据包大小。这四种类型的端点及其特性包括:
(1)控制端点(Control Endpoint)
用于控制传输,所有设备都必须支持。控制传输在总线上发送和接收设备信息。它的优点是能够保证准确性,发生的错误会被正确检测,数据将被重新发送。在低速和全速设备上,控制传输在总线上有10%的保留带宽(高速设备为20%),并提供USB系统级的控制。

(2)中断端点(Interrupt Endpoints)
主要用于需要使用高可靠性方法传输少量数据的设备,通常在人机界面设备(HID)中常见。它不是真正的中断,而是使用轮询,它可以保证主机以可预测的间隔检查数据。中断传输提供了准确性保证,因为错误会被正确检测,并在下一个事务中进行重试。在低速和全速设备上,中断传输具有90%的保证带宽,而在高速设备上为80%。这个带宽与等时端点共享。

中断端点的最大数据包大小取决于设备的速度。高速设备支持最大数据包大小为1024字节。全速设备支持最大数据包大小为64字节。低速设备支持最大数据包大小为8字节。

(3)批量端点(Bulk Endpoints)
用于批量传输,通常用于需要在不定的时间内传输相对大量数据的设备,其中传输可以使用任何可用的带宽空间。它是USB设备最常见的传输类型。批量传输的时间是可变的,取决于总线上有多少可用带宽,因为没有为传输设置预留的带宽。批量传输提供了准确性保证,因为错误会被正确检测,事务会被重新发送。批量传输在传输大量数据,但对传输时间不敏感的情况下非常有用。

批量端点的最大数据包大小取决于设备速度。高速设备支持的最大BULK数据包大小为512字节。全速设备支持的最大数据包大小为64字节。低速设备不支持批量传输类型。

(4)等时端点(Isochronous Endpoints)
用于等时传输,这是连续的、实时的传输,具有主机和设备事先协商好的带宽。等时传输必须支持容忍错误数据流,因为它们没有错误恢复机制或握手。错误通过CRC字段检测,但不会被更正。在等时传输中,需要权衡保证交付与保证准确性。音乐流或视频流是使用等时端点的应用示例,因为偶尔丢失的数据会被人类的耳朵和眼睛忽略。等时传输在低速和全速设备上有90%的保证带宽(高速设备为80%),并与中断端点共享。

高速设备支持的最大数据包大小为1024字节。全速设备支持的最大数据包大小为1023字节。低速设备不支持等时传输类型。在等时传输中有特殊考虑因素。通常需要使用3倍的缓冲来确保数据准备就绪,包括一个正在主动传输的缓冲区,一个已加载并准备传输的缓冲区和一个正在主动加载的缓冲区。

传输类型控制端点中断端点批量端点等时端点
典型用例设备初始化和管理鼠标和键盘打印机和大容量存储音频流和视频流
低速支持YesYesNoNo
差错检验YesYesYesNo
保证数据交付率NoNoNoYes
保证带宽Yes(10%)Yes(90%)NoYes(90%)
保证延迟NoYesNoYes
最大传输大小64bytes64bytes64bytes1023bytes(Full-Speed)
1024bytes(High-Speed)
最大传输速率823KB/s1.216MB/s1.216MB/s1.023MB/s

2 传输协议

USB通信包含一系列的帧。每一帧包含一个起始帧(Start of Frame,SOF),然后是一个或多个事务(transaction)。每个事务由一系列数据包(packet)组成。每个数据包以一个同步模式(SYNC)开始,并以“数据包结束”(End of Packet,EOP)模式结束。在最基本的情况下,一个事务包括一个令牌数据包(token packet)。根据具体的事务类型,可能还会有一个或多个数据数据包,而有些事务还可能有握手数据包。如下图所示:
在这里插入图片描述
事务是数据包的交互过程,它由三种不同类型的数据包组成:令牌数据包数据数据包(可选)和握手数据包。事务被放置在帧内,不会被拆分到不同帧中(除非是高速等时传输的情况),也不会在其他事务中间中断。下图显示了一个事务的块状图示:
在这里插入图片描述
不同类型的数据包包含不同的信息,以下是可能包含在数据包中的信息:

  • 数据包标识(PID) :(8位:4位类型标识位和4位错误检查位)。这些位声明了一个事务是IN(输入)/OUT(输出)/SETUP(设置)/SOF(帧起始)之一。
  • 设备地址(可选):(7位:最多127个设备)。
  • 端点地址(可选) :(4位:最多16个端点)。USB规范支持最多32个端点。虽然4位能提供最大值为16,但我们可以通过使用一个IN PID、一个介于1到16之间的端点地址一个OUT PID和一个介于1到16之间的端点地址,实现16+16=32个端点。
    • 注意:端点地址(实际用于数据传输的端点的地址标识)和端点编号(端点编号是用于在设备描述和配置中进行标识的逻辑标识符)的区别。
  • 有效数据(可选) :(0到1023字节)。
  • CRC(可选):(5位或16位)。

下图显示了数据包的可能构成,可视为一个数据包模板,根据需要可以添加或删除字段。
在这里插入图片描述

2.1 数据包类型

除了PID(数据包标识)之外,数据包中的所有内容都是可选的。上图可以代表四种数据包类型,

2.1.1 令牌数据包(Token packets)

  • 用于启动事务、识别参与事务的设备、始终由主机发出

令牌数据包始终来自主机,用于指导总线上的数据流向。令牌数据包的功能取决于执行的活动。

  • IN令牌:用于请求设备将数据发送到主机
  • OUT令牌:用于发送主机的数据
  • SETUP令牌:用于发送主机的命令
  • SOF令牌:用于标记时间帧

对于IN、OUT和SETUP令牌数据包,有一个7位的设备地址、4位的端点ID和5位的CRC。
在这里插入图片描述
SOF提供了设备识别帧的开始并与主机同步的方式,它们还用于防止设备进入挂起模式(如果3毫秒没有SOF,设备必须进入挂起模式)。SOF数据包只在全速和高速设备上可见,而且每毫秒发送一次。
在这里插入图片描述
SOF数据包包含一个8位SOF PID、11位帧计数值,以及一个5位CRC。

  • SOF数据包不会触发握手数据包的发送
  • High-Speed USB引入了微帧,每125微秒发送一个SOF,而帧计数仅在每1毫秒递增一次。

2.1.2 数据数据包(Data packets)

  • 用于传递有效载荷(payload)数据、由主机或设备发送

在IN、OUT和SETUP令牌数据包后,紧着着就是数据数据包。有效载荷数据的大小取决于传输类型,范围从0到1024字节不等。在成功地传输数据包后,数据包标识(Packet ID)会在DATA0和DATA1之间来回切换。
在这里插入图片描述
在每次成功的数据包传输后会在主机和设备上切换DATA0和DATA1。这样切换的好处是它可以用于错误检测。如果接收到的数据包标识与预期的不同,设备将能够知道传输中出现了错误,并可以适当地处理。

举个例子,如果发送了ACK但未收到。在这种情况下,发送方将数据切换从DATA1更新为DATA0,但接收方没有这样做,它仍然保持在DATA1。这会导致主机和设备在下一个数据阶段不同步,表明出现了错误。USB传输中数据切换的示例如下图所示,白色方框代表事务来自主机,黑色方框代表事务来自设备。
在这里插入图片描述

2.1.3 握手数据包(Handshake packets)

  • 用于确认接收到无错误的数据

握手数据包意味着每个事务的结束。每个握手数据包包括一个8位数据包标识,并由事务的接收方发送。不同的USB速度所支持的握手数据包不同:

  • ACK(低速/全速/高速):确认成功完成
  • NAK(低速/全速/高速):否定确认
  • STALL(低速/全速/高速):由设备发送的错误指示
  • NYET(仅高速):表示设备尚未准备好接收另一个数据包
    在这里插入图片描述

2.1.4 特殊数据包(Special packets)

  • 有助于处理不同的传输速度差异(如主机是USB3.0,设备为USB2.0)、由主机发送到USB集线器

USB规范定义了四种特殊数据包:

  • PRE:由主机发送给集线器,表示接下来的数据包是低速的
  • SPLIT(仅高速):在令牌数据包之前,用于指示分裂事务
  • ERR(仅高速):由集线器返回,用于报告分裂事务(一种特殊的USB传输方式:将一个USB事务分成两个独立的部分,其中一个部分在主机和集线器之间进行,而另一个部分在集线器和设备之间进行)中的错误
  • PING(仅高速):在收到NYET握手后,用于检查Bulk OUT(大容量数据传输)或Control Write(发送命令或配置参数到USB设备的一种传输类型)的状态
    在这里插入图片描述

2.2 事务类型

USB转换是数据从主机到设备或从设备到主机的方式。有几种不同的事务类型,它们通常使用不同的名称来表示相同的概念。这三种不同的事务类型如下:

2.2.1 IN/Read/Upstream事务

IN、Read和Upstream都是从设备发送到主机的事务。这些事务由主机通过发送一个IN令牌包来启动。目标设备会通过发送一个或多个数据包进行响应,而主机则会以握手包作出回应。如下图所示,主机的事务为白色方框,来自设备的事务为黑色方框。
在这里插入图片描述
在下图中,当主机发出请求时,设备会用NAK(Negative Acknowledgment)来表示它尚未准备好发送数据。主机会持续重试,而设备在准备好时会以数据包作出响应。主机随后通过ACK握手来确认已接收数据。
在这里插入图片描述

2.2.2 OUT/Write/Downstream事务

OUT、Write和Downstream都是从主机到设备的事务。在这种类型的事务中,主机发送适当的令牌包(OUTSETUP),然后跟随一个或多个数据包。接收设备通过发送适当的握手包来结束事务。如下图所示,主机的事务为白色方框,来自设备的事务为黑色方框。

在这里插入图片描述

如下图所示,主机发送了OUT令牌包和一个DATA0数据包,但从设备接收到NAK。主机随后重试发送数据。注意,从握手收到NAK以来,数据切换位未发生变化。在下一次尝试发送数据时,设备以ACK确认,表示OUT事务成功完成。

在这里插入图片描述

2.2.3 控制事务

控制传输用于识别、配置和控制设备。它们使主机能够读取有关设备的信息、设置设备地址、建立配置并发出某些命令。控制传输总是针对 USB 设备的控制端点进行的。控制传输分为三个阶段:设置阶段、数据阶段(可选)和状态阶段。下图显示了主机传输的三个阶段,虚线表示它是一个可选的事务。
在这里插入图片描述
设置阶段(设置包)仅在控制传输中使用,该包从主机发送USB请求到设备,要求数据包包含一个8字节的USB请求。设备必须始终使用ACK响应设置阶段,不能使用NAK来响应设置阶段。
在这里插入图片描述
在控制传输中,数据阶段是可选的。这个阶段可以由多个数据事务组成,只有在主机和设备之间传输数据Payload时才需要。通常,与控制传输相关的数据可以在设置阶段传输。
在这里插入图片描述
最后一个阶段,状态阶段,包括一个单一的INOUT事务,用于报告前面阶段的成功或失败。数据包始终是DATA1(不像正常的INOUT事务那样在DATA0DATA1之间切换),并包含一个长度为零的数据包。状态阶段以由前一个数据包的接收方发送的握手事务结束。
在这里插入图片描述
USB通信有三种类型的控制传输:控制写(control write)、控制读(control read)和无数据的控制(control no data)。下面三张图展示了这些事务的示例。
在这里插入图片描述

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

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

相关文章

【机器学习合集】激活函数合集 ->(个人学习记录笔记)

文章目录 综述1. S激活函数(sigmoid&Tanh)2. ReLU激活函数3. ReLU激活函数的改进4. 近似ReLU激活函数5. Maxout激活函数6. 自动搜索的激活函数Swish 综述 这些都是神经网络中常用的激活函数,它们在非线性变换方面有不同的特点。以下是这些激活函数的主要区别&am…

学习笔记二十三:Deployment入门到企业实战应用

Deployment入门到企业实战应用 Deployment控制器:概念、原理解读Deployment概述Deployment工作原理:如何管理rs和Pod?什么叫做更新节奏和更新逻辑呢 Deployment使用案例:创建一个web站点,2个副本deploy-demo详细解读 通过k8s实现滚…

分布式:一文搞定Redis/Zookeeper/MySQL实现分布式锁

目录 一、项目准备spring项目数据库 二、传统锁演示超卖现象使用JVM锁解决超卖解决方案JVM失效场景 使用一个SQL解决超卖使用mysql悲观锁解决超卖使用mysql乐观锁解决超卖四种锁比较Redis乐观锁集成Redis超卖现象redis乐观锁解决超卖 三、分布式锁概述四、Redis分布式锁实现方案…

Ubuntu 命令行设置静态IP地址方法

一、先ifconfig查看电脑的网卡信息 找到有线网络或WiFi网络的网卡名称,我这里是eno1 二、输入route -n命令,打印路由表,这里主要是为了查看网关地址 我这里网关地址是192.168.10.1 三、更改配置文件 输入 vim /etc/network/interfaces&am…

禾匠旧版对接微信小程序发货系统(发货信息管理 接口)

最近小程序如果是商家交易需要再小程序后台点击一下发货,特别麻烦,但是旧版的禾匠又没有这个功能,所以只能手动增加这个功能,但是每一个版本发货逻辑都不一样,大家只能自己手动去兼容一下,下面只是写了一个…

uniapp 单选框以及多选框样式更改

radio以及checkbox默认样式不符合自身需求时,根据自身需求更改样式,以下是自身的示例: 单选: 多选: 由于uniapp自身包含了一套默认的样式,所以如果不想全局更改只想在某个单据页面使用的话,就…

Mysql,SqlServer,Oracle获取库名 表名 列名

先看下需求背景: 获取某个数据源连接下所有库名,库下所有表名,表中所有字段 1.MySql 先说MySql吧,最简单 1.1获得所有数据库库名 这是一个mysql和sqlserver公用的方法,这里url不用担心数据库问题,他其实…

程序的编译和链接

目录 翻译环境 linux下的测试 ​编辑 预定义符号 执行环境 #define定义宏 #和## # ## 宏参数的副作用 宏和函数对比 优点 缺点 #undef 条件编译 头文件包含 在标准c的任何实现中,存在两种环境——翻译环境和执行环境 翻译环境 翻译环境生成目标文件…

2023年中国磷酸一铵行业产能、产量及发展趋势分析:农业需求稳定增长[图]

磷酸一铵是一种重要的氮磷复合肥料,在农业生产中广泛应用。亚洲地区尤其是中国、印度等国家是磷酸一铵的主要消费市场。近年来,中国磷酸一铵产能呈现下降趋势,2022年开始恢复增长。2022年中国磷酸一铵产能达1945万吨,同比增长5.4%…

linux工具篇

文章目录 linux工具篇1. linux 软件包管理器-yum1.1 什么是软件包1.2 yum的使用1.3 yum源 2. linux编辑器-vim2.1 vim概念2.2 vim各个模式切换2.3 vim正常模式命令汇总2.4 vim底行模式各命令汇总2.5 vim的简单配置 3. Linux编译器-gcc/g使用3.1 复习程序编译过程(1) 预处理(2) …

二进制安装k8s

192.168.11.12 master01 192.168.11.12 y4 node01 192.168.11.14 y5 node02 192.168.11.15 对环境进行初始化,主机192.168.11.12、主机y4、主机y5,三台主机都要做以下操作,唯一不同的就是修改主…

04.Finetune vs. Prompt

目录 语言模型回顾大模型的两种路线专才通才二者的比较 专才养成记通才养成记Instruction LearningIn-context Learning 自动Prompt 部分截图来自原课程视频《2023李宏毅最新生成式AI教程》,B站自行搜索 语言模型回顾 GPT:文字接龙 How are __. Bert&a…

如何为3D模型设置自发光材质?

1、自发光贴图的原理 自发光贴图是一种纹理贴图,用于模拟物体自发光的效果。其原理基于光的发射和反射过程。 在真实世界中,物体自发光通常是由于其本身具有能够产生光的属性,如荧光物质、发光材料或光源本身。为了在计算机图形中模拟这种效…

应急响应-网站入侵篡改指南_Webshell内存马查杀_漏洞排查_时间分析

1. 前言 一般安服在做项目的时候,经常会遇到需要做应急响应的工作,所谓应急响应就是当网站出现异常的时候,根据相关的问题对其进行溯源分析,发现问题,解决问题。 2. 网络安全异常特征 这里大概汇总一下网络安全异常的…

RustDay06------Exercise[91-100]

91.将指针还原成指定类型 因为指针不知道里面具体有什么,所以一般约定打上unsafe 申明开发者自己对该部分可用性负责,且在调试的时候也能起强调作用 // tests6.rs // // In this example we take a shallow dive into the Rust standard librarys // unsafe functions. Fix …

c语言从入门到实战——分支和循环

分支和循环 前言1. if语句1.1 if1.2 else1.3 分支中包含多条语句1.4 嵌套if1.5 悬空else问题 2. 关系操作符3. 条件操作符4. 逻辑操作符:&& , || , !4.1 逻辑取反运算符4.2 与运算符4.3 或运算符4.4 练习:闰年的判断4.5 短路 5. swit…

鸡尾酒学习——长岛冰茶

长岛冰茶 1、材料:冰块(或者雪莲)、白朗姆、伏特加、龙舌兰、金酒、柠檬、君度或者白兰地、可乐; 2、口感:酸甜苦口味,酒的苦涩较为明显(怀疑是自己放了过多的柠檬汁导致苦涩感明显&#xff09…

Sui提供dApp Kit 助力快速构建React Apps和dApps

近日,Mysten Labs推出了dApp Kit,这是一个全新的解决方案,可用于在Sui上开发React应用程序和去中心化应用程序(dApps)。mysten/dapp-kit是专门为React定制的全新SDK,旨在简化诸如连接钱包、签署交易和从RPC…

若依微服务上传图片文件代理配置

在使用若依微服务文件上传时候,文件上传成功会上传到D:/ruoyi/uploadPath目录下。默认使用9300端口进行访问图片文件,现在我想把它代理到80端口应该怎么做呢? 配置前:http://localhost:9300/statics/2023/09/24/test.jpg 配置后:http://localhost/statics/2023/09/24/test…

JWT的登录认证与自校验原理分析

目录 一、JWT的概述 1.什么是JWT? 2.JWT的用户认证 3.JWT解决了什么问题? 4.关于JWT中的签名如何理解? 5.JWT的优势 二、JWT的结构 1.令牌的组成: 2.JWT的工具类 3.JWT所需的依赖 4.JWT登录生成Token的原理 三、JWT的自…