USB协议层数据格式

news2024/9/29 9:27:35

USB协议

  • 1. 硬件拓扑结构
  • 2. 协议层
    • 2.1 字节/位传输顺序
    • 2.2 SYNC域
    • 2.3 包格式
      • 2.3.1 PID域
      • 2.3.2 令牌包(Token)
      • 2.3.3 数据包
      • 2.3.4 握手包
    • 2.4 传输细节
        • 2.4.1 传输(Transfer)和事务(Transaction)
        • 2.4.2 过程(stage)和阶段(phase)
        • 2.4.3 批量传输
        • 2.4.4 中断传输
        • 2.4.5 实时传输
        • 2.4.6 控制传输

参考资料:韦东山usb驱动
usb手册

1. 硬件拓扑结构

在这里插入图片描述

  • compound device :多个设备组合起来,通过HUB跟Host相连
  • composite device :一个物理设备有多个逻辑设备(multiple interfaces)

在软件开发过程中,我们可以忽略Hub的存在,硬件拓扑图简化如下:
在这里插入图片描述

一个物理设备里面可能有多个逻辑设备,Hos可以外接多个逻辑设备,硬件拓扑图如下:
在这里插入图片描述

2. 协议层

要理解协议层、理解数据如何传输,带着这几个问题去看文档、看视频:

  • 如何寻址设备?
  • 如何表示数据方向(读、还是写)
  • 如何确认结果?

提前罗列出来:

  • USB系统是一个Host对应多个设备,要传输数据首先要通知设备:
    • 发出IN令牌包:表示想读数据,里面含有设备地址
    • 发出OUT令牌包:表示想写数据,里面含有设备地址
  • 数据阶段:
    • Host想读数据:前面发出IN令牌包后,现在读取数据包
    • Host想发出数据:前面发出OUT令牌包后,现在发出数据包
  • 结果如何?有握手包
    • Host想读数据,设备可能未就绪,就会回应NAK包
    • Host想写数据,它发出数据后,设备正确接收了,就回复ACK包

2.1 字节/位传输顺序

先传输最低位(LSB)。

2.2 SYNC域

Host发出SOP信号后,就会发出SYNC信号:它是一系列的、最大传输频率的脉冲,接收方使用它来同步数据。对于低速/全速设备,SYNC信号是8位数据(从做到右是00000001);对于高速设备,SYNC信号是32位数据(从左到右是00000000000000000000000000000001)。使用NRZI编码时,前面每个"0"都对应一个跳变。

在很多文档里,把SOP和SYNC统一称为"SYNC",它的意思是"SYNC"中含有"SOP"。

2.3 包格式

在这里插入图片描述
USB总线上传输的数据以包为单位。USB包里含有哪些内容(“域”)?

  • SOP:用来表示包的起始
  • SYNC:用来同步时钟
  • PID:表示包的类型
  • 地址:在USB硬件体系中,一个Host对应多个Logical Device,那么Host发出的包,如何确定发给谁?
    • 发给所有设备:包里不含有设备地址
    • 发给某个设备:包里含有设备地址、端点号
  • 帧号、数据等跟PID相关的内容
  • CRC校验码

发起一次完整的传输,可能涉及多个包。那么,第1个包里含有设备地址、端点号,后续的包就没必要包含设备地址、端点号。

2.3.1 PID域

注意:所有的USB文档提到的"输入"、“输出”,都是基于Host的角度,"输出"表示从Host输出到设备,"输入"表示Host从设备得到数据。
有哪些USB包?根据包数据里的PID的bit1, bit0可以分为4类:

  • 令牌包(Token):01B
  • 数据包(Data):11B
  • 握手包(Handshake):10B
  • 特殊包(Special):00B

PID有4位,使用bit1,bit0确定分类,使用bit3,bit2进一步细分。如下表(来自《圈圈教你玩USB》)所示:

在这里插入图片描述
在USB包中,PID域使用8位来表示,格式如下:
在这里插入图片描述
前4位表示PID,后4位是对应位的取反。接收方发现后4位不是前4位的取反的话,就认为发生了错误。

2.3.2 令牌包(Token)

令牌类的PID,起"通知作用",通知谁?SOF令牌包被用来通知所有设备,OUT/IN/SETUP令牌包被用来通知某个设备。

对于OUT、IN、SETUP令牌包,它们都是要通知到具体的设备,格式如下:
在这里插入图片描述
USB设备的地址有7位,格式如下:
在这里插入图片描述
USB设备的端点号有4位,格式如下:
在这里插入图片描述
对于SOF包,英文名为"Start-of-Frame marker and frame number"。对于USB全速设备,Host每1ms产生一个帧;对于高速设备,每125us产生一个微帧,1帧里有8个微帧。Host会对当前帧号进行累加计数,在每帧或每微帧开始时,通过SOF令牌包发送帧号。对于高速设备,每1毫秒里有8个微帧,这8个微帧的帧号是一样的,每125us发送一个SOF令牌包。

SOF令牌包格式如下:
在这里插入图片描述

2.3.3 数据包

Host使用OUT、IN、SETUP来通知设备:我要传输数据了。数据通过"数据包"进行传输。

数据包也有4种类型:DATA0、DATA1、DATA2、MDATA。其中DATA2、MDATA在高速设备中使用。对软件开发人员来说,我们暂时仅需了解DATA0、DATA1。

为什么要引入DATA0、DATA1这些不同类型的数据包?为了纠错。

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

比如:

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

数据包格式如下:
在这里插入图片描述
对于全速设备,数据包中的数据做大是1023字节;对于全速设备,数据包中的数据做大是1024字节。

2.3.4 握手包

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

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

2.4 传输细节

2.4.1 传输(Transfer)和事务(Transaction)

USB传输的基本单位是包(Packet),包的类型由PID表示。一个单纯的包,是无法传输完整的数据。

为什么?比如想输出数据,可以发出OUT令牌包,OUT令牌包可以指定目的地。但是数据如何传输呢?还需要发出DATA0或DATA1数据包。设备收到数据后,还要回复一个ACK握手包。

所以,完整的数据传输,需要涉及多个包:令牌包、数据包、握手包。这个完整的数据传输过程,被称为事务(Transaction)。

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

有四类事务:

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

有四类传输(Transfer):

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

暂时记住这个关系:

  • BIT组成域(Field)
  • 域组成包(Packet)
  • 包组成事务(Transaction)
  • 事务组成传输(Transfer)
2.4.2 过程(stage)和阶段(phase)

事务由多个包组成,比如Host要发送数据给设备,这就会涉及很多个包:

  • Host发出OUT令牌包,表示要发数据给哪个设备
  • Host发出DATA0数据包
  • 设备收到数据后,回应ACK包

这个完整的事务涉及3个包(Packet),分为3个阶段(Phase):

  • 令牌阶段(Token phase):由令牌包实现
  • 数据阶段(Data phase):由数据包实现
  • 握手阶段(Handshake phase):由握手包实现

事务由包组成,这些包分别处于3个阶段(phase):令牌阶段,数据阶段,握手阶段。

对于批量传输、中断传输、实时传输,它们分别由一个事务组成,不再细分为若干个过程。

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

总结起来就是:

  • 控制传输由多个过程(stage)组成,每个过程由一个事务来实现
  • 每个事务由多个阶段(phase)组成,每个阶段有一个包来实现
2.4.3 批量传输

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

批量事务由3个阶段(phase)组成:令牌阶段、数据阶段、握手阶段。每个阶段都是一个完整的包,含有SOP、SYNC、PID、EOP。

下图中各个矩形框就对应一个完整的包。
在这里插入图片描述
《圈圈教你玩USB》中有详细的示例:
在这里插入图片描述

2.4.4 中断传输

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

中断事务由3个阶段(phase)组成:令牌阶段、数据阶段、握手阶段。每个阶段都是一个完整的包,含有SOP、SYNC、PID、EOP。

下图中各个矩形框就对应一个完整的包。
在这里插入图片描述
中断事务跟批量事务非常类似,Host使用它来周期性地读数据、写数据。

以鼠标为例,我们需要及时获得鼠标的数据,不及时的话你会感觉鼠标很迟钝。但是USB协议中并没有中断功能,它使用"周期性的读、写"来实现及时性。具体过程如下:

  • Host每隔n毫秒发出一个IN令牌包
  • 鼠标有数据的话,发出DATA0或DATA1数据包给Host;鼠标没有数据的话,发出NAK给Host。

中断事务的优先级比批量事务更高,它要求实时性,而批量事务不要求实时性。

2.4.5 实时传输

实时传输用实时事务来实现,用于传输实时数据,对数据的正确性没有要求。

实时事务由2个阶段(phase)组成:令牌阶段、数据阶段。每个阶段都是一个完整的包,含有SOP、SYNC、PID、EOP。

实时事务不需要握手阶段,一个示例的场景是:为了传输摄像头的实时数据,偶尔的数据错误是可以忍受的,大不了出现短暂的花屏。如果为了解决花屏而重传数据,那就会导致后续画面被推迟,实时性无法得到保证。

下图中各个矩形框就对应一个完整的包。
在这里插入图片描述
实时事务跟中断事务非常类似,Host也会周期性的发起实时事务,主要区别在于:

  • 实时事务不要求准确性,没有握手阶段
  • 实时事务传输的数据量比较大,中断事务传输的数据量比较小
2.4.6 控制传输

在使用批量传输时,使用IN令牌包或OUT令牌包表示数据传输方向。

控制传输的令牌包永远是SETUP,怎么分辨是读数据,还是写数据?发出SETUP令牌包后,还要发出DATA0数据包,根据数据的内容来确定后续是读数据,还是写数据。这个过程称为"建立事务"(SETUP Transaction)

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

  • 建立过程(stage),使用SETUP事务:Host发出SETUP令牌包、DATA0数据包、得到ACK握手包
  • 数据过程(stage),使用批量事务:
    • 对于输出:Host发出OUT令牌包,发出DATA0、DATA1数据包、得到ACK握手包
    • 对于输入:Host发出IN令牌包,读到DATA0、DATA1数据包、发出ACK握手包
  • 状态过程(stage),使用批量事务:
    • 对于输出:Host发出IN令牌包,读到DATA1数据包,发出ACK握手包
    • 对于输入:Host发出OUT令牌包,发出DATA1数据包,等待ACK握手包

在这里插入图片描述
上图中的每一个方框,都是一个完整的事务,含有:Token Packet、Data Packet、Handshake Packet。

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

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

相关文章

点云采样方法

随机采样,网格采样,均匀采样,集合采样。 网格采样:用规则的网格对点进行采样,不能精确的控制采样点的数量 均匀采样:均匀的采样点云中的点,由于其鲁棒性(系统的健壮性)而更受欢迎 点云降采样…

Jetpack:004-如何使用文本组件

文章目录 1. 概念介绍2. 使用方法2.1 通用参数2.2 专用参数 3. 示例代码4. 内容总结 我们在上一章回中介绍了Jetpack组件在布局中的对齐方式,本章回中主要介绍文 本组件的使用方法。闲话休提,让我们一起Talk Android Jetpack吧 1. 概念介绍 我们在本章…

分库分表(3)——ShardingJDBC实践

一、ShardingSphere产品介绍 Apache ShardingSphere 是一套开源的分布式数据库中间件解决方案组成的生态圈,它由 JDBC、Proxy 和 Sidecar(规划中)这 3 款相互独立,却又能够混合部署配合使用的产品组成。 它们均提供标准化的数据分…

【Java 进阶篇】CSS盒子模型详解

CSS盒子模型是网页布局的基础之一,它定义了HTML元素在页面上的占用空间和相互关系。理解CSS盒子模型对于构建各种类型的网页布局至关重要。在本文中,我们将深入探讨CSS盒子模型的各个方面,包括盒子模型的概念、属性和如何使用它们来控制元素的…

S7-1200与力控通过S7协议通讯

测试环境:Win10、力控7.2SP3、1214DCDCDC 博途工控人平时在哪里技术交流博途工控人社群 博途工控人平时在哪里技术交流博途工控人社群 在画面管理中,有种弹出画面,也就是窗口提示画面, 1-PLC端配置 PLC IP设置为192.168.2.10 …

从0开始学go第六天

方法一:gin获取querystring参数 package main//querystring import ("net/http""github.com/gin-gonic/gin" )func main() {r : gin.Default()r.GET("/web", func(c *gin.Context) {//获取浏览器那边发请求携带的query String参数//…

linux中安装RocketMQ以及dashboard

前提: 需要安装jdk8 上传下面的文件到服务器中 新建目录 mkdir rocketmq 将下载后的压缩包上传到阿里云服务器或者虚拟机中去,并解压 unzip rocketmq-all-4.9.2-bin-release.zip 配置环境变量 vim /etc/profile 配置内容: export NAM…

解决方案|法大大电子签助力食品行业打通内外部高效协作链路

对食品行业来说,技术是保证食品安全的重要前提和基础。数字化转型就是要将传统的食品行业与新技术相结合,从而达到改善传统食品生产模式、提高传统食品生产效率的目的。通过数字化技术来推动企业从原材料采购、产品设计、生产、营销、物流、合同管理等全…

代码随想录算法训练营第四十九天 | 139.单词拆分、关于多重背包,你该了解这些!

139.单词拆分 视频讲解:动态规划之完全背包,你的背包如何装满?| LeetCode:139.单词拆分_哔哩哔哩_bilibili 代码随想录 (1)代码 关于多重背包,你该了解这些! 链接: 代码…

浏览器详解(四) 渲染

大家好,我是半虹,这篇文章来讲浏览器渲染 1、基本介绍 浏览器是多进程多线程的架构,包括有浏览器进程、渲染器进程、GPU 进程、插件进程等 在上篇文章中我们介绍过浏览器进程,作为浏览器主进程,负责浏览器基本界面的…

【轻松玩转MacOS】指引篇:这9篇指南助你轻松上手

引言 亲爱的读者,欢迎来到《轻松玩转MacOS》!这里是专为MacOS新手打造的使用教学专栏,无论您是从Windows转投Mac的初学者,还是对MacOS操作略知一二但希望更进一步的朋友,都能在这里找到您需要的答案。 正文 1、基本…

xshell环境配置

如何下载以及安装xshellxftp教育优惠版本及配置anaconda环境 下载教育优惠版本 下载网址:https://www.xshell.com/zh/free-for-home-school/ 注意安装路径,可以更改,但是不可以新建文件夹,如果有想建在别的地方的可以提前建好 …

安装libX11过程记录

目录 编译平台 准备工作 参考信息源 安装步骤 1 建立文件夹/opt/libX11target 2 定义环境变量PKG_CONFIG_PATH 3 安装xproto-7.0.31 3.1 下载xproto-7.0.31 3.2 解压 3.3 进入解压后的文件夹 3.4 建立build文件夹 3.5 cd build 3.6 配置 3.7 make 3.8 sudo ma…

vcf 文件如何修改染色体修改样本名称提取样本

大家好,我是邓飞。 对于vcf文件和plink文件是经常用的文件,对于基因型数据的处理,一般分为: 数据质控数据提取染色体修改名称样本修改名称 今天介绍一下vcf文件的三个处理方法: 1,染色体修改2&#xff…

Spring源码解析(十二):TransactionInterceptor事务拦截器

Spring源码系列文章 Spring源码解析(一):环境搭建 Spring源码解析(二):bean容器的创建、默认后置处理器、扫描包路径bean Spring源码解析(三):bean容器的刷新 Spring源码解析(四):单例bean的创建流程 Spring源码解析(五)&…

[MySQL]基础篇

文章目录 1. MySQL基本使用1.1 MySQL的启动和登录1.1.1 MySQL的启动1.1.2 MySQL的客户端连接 1.2 数据模型 2. SQL2.1 SQL类型2.1.1 数值类型2.1.2 字符串类型2.1.3 日期类型 2.2 DDL2.2.1 数据库操作2.2.2 表操作 - 查询2.2.3 表操作 - 创建表2.2.4 表操作 - 修改 2.3 DML2.3.…

配电室管理系统:现代化电力分配的重要工具

随着科技的发展和工业化进程的加速,电力已经成为现代社会运行的基础。配电室作为电力供应系统的重要组成部分,其管理效率直接影响到人们的生产、生活。为此,配电室管理系统应运而生,这是一种集信息化、自动化、网络化于一体的电力…

实现Promise所有核心功能和方法

一直以来对Promise只是会用简单的方法,例如then,catch等,对于其余各种方法也只是简单了解,这次想要通过实现Promise来加深对Promise的使用 话不多说,直接开始,简单粗暴一步步来 一:了解Promise …

Go 复合类型之字典类型介绍

Go 复合类型之字典类型介绍 文章目录 Go 复合类型之字典类型介绍一、map类型介绍1.1 什么是 map 类型?1.2 map 类型特性 二.map 变量的声明和初始化2.1 方法一:使用 make 函数声明和初始化(推荐)2.2 方法二:使用复合字…