USB2.0学习4--USB包结构和包类型

目录

1. USB包基本结构

1.1 SOP域(Start Of Packet)

1.2 SYNC域(同步域)

1.3 PID域(标识域)

1.4 地址域(ADDR)

1.5 帧号域(Fram)

1.6 数据域(DATA)

1.7 校验域(CRC)

1.8 EOP域(End Of Packet)

2. USB包类型

2.1 令牌包

2.2 数据包

2.3 握手包

2.4 特殊包

3. USB事务处理时序

3.1 IN事务处理时序

3.2 OUT事务处理时序

3.3 SETUP事务处理时序


上一篇讲了USB帧、微帧、传输、事务、包的关系,本章重点讲USB包的基本结构和包类型。

1. USB包基本结构

包是USB总线上数据传输的最小单位,USB所有的传输最终都会被分成包进行传输,不同类型的包里面包含着不同的域,包的基本结构如下图所示:

 

由上图可知,一个包由SOP、SYNC、Packet Content、EOP四部分组成,其中SOPSYNCEOP为所有包共有的域,Packet Content是整个包的核心,Packet ContentPID、地址、帧号、数据、CRC组成,不同类型的包由不同的Packet Content组成。USB包的域段可分为8种:

  1. SOP域(Start Of Packet
  2. SYNC域(同步域)
  3. PID域(标识域)
  4. 地址域(ADDR
  5. 帧号域(Fram
  6. 数据域(DATA
  7. 校验域(CRC
  8. EOP(End Of Packet)

1.1 SOP域(Start Of Packet)

SOP表示包传输开始。通过将D +和D-线从空闲状态驱动到相反的逻辑电平(K状态),由始发端口发信号通知包传输开始(SOP)。这种电平切换表示SYNC字段的第一个bit,当发起新的传输时,集线器必须将SOP的第一bit宽度的变化限制在±5 ns以内。

低速设备SOP信号:总线从IDLE状态(J状态:差分0)切到K状态(差分1),即可完成低速SOP信号的发送。

全速设备SOP信号:总线从IDLE状态(J状态:差分1)切到K状态(差分0),即可完成全速SOP信号的发送。

1.2 SYNC域(同步域)

USB以异步传输的方式,USB主机和设备的时钟频率都分别由自身提供,虽然在USB设备枚举时,会共同确定USB版本,以确定数据传输速率,但是仅仅如此的话,USB主机和USB设备在运行一段时间后,时钟频率上还是会有累积误差,这会造成数据解读出错,所以USB的包有一个SYNC域段,它被用于本地时钟与输入信号的同步,以减小USB主机和设备的时钟频率误差。

  1. 高速包的SYNC宽度为32bit(15对KJ信号+2个K信号,编码前:0000 0000 0000 0000 0000 0000 0000 0001)
  2. 全速/低速包的SYNC宽度为8bit(3对KJ信号+2个K信号,编码前:0000 0001),如下图所示。

 

 下图是协议分析仪抓包解析的SYNC域。

1.3 PID域(标识域)

对于每个包,PID都是紧跟着SYNC的,PID域共8bit,由4位类型字段和4位校验字段组成。类型字段主要是标识包的类型,校验字段主要是对类型字段进行校验。PID的4位校验字段可以确保PID的可靠解码,以便包被正确解析。PID校验字段是对数据包类型字段取补码生成的,如果4个PID校验位不是它们各自的补码,则产生PID错误标识符位。

 下图是协议分析仪抓包解析的PID域。 

主机和所有的外设都必须对接收到的PID域进行解码,如果出现错误或者解码为未定义的值 那么这个包就会被接收者忽略,如果外设接收到一个PID,它所指明的操作类型或者方向不被支持,外设将不做出响应。

PID 表征了包的类型,分为令牌( Token)、 数据( Data)、 握手( Handshacke)以及特殊包 4 大类,共 16 种类型的 PID。如下表所示。

 注:PERERRPID是一样的,但因ERR是高速模式下的包,PER是全速模式下的包,所以并不冲突。

1.4 地址域(ADDR)

设备端点都是由地址域指明的,它包括两个子域:7bit的设备地址和4bit端点地址,如下图所示。设备需要对这2个地址进行完全解码,当解析出不允许的或者不匹配的地址时,这个包将会被忽略,访问未初始化的端点也会导致包被忽略。

 下图是协议分析仪抓包解析的地址域。 

设备地址域(ADDR)指明此次通信的外设,ADDR共7位,因此最多可以有128个地址,因为0地址用于枚举,所以最多可以支持127个设备。

端点地址(ENDP)有4位,它表明设备可以拥有几个通信端点,低速设备最多支持 3个端点, 高速和全速设备最多支持 16个端点。

1.5 帧号域(Fram)

帧号是一个11bit字段,指明目前帧的排号,由主机在每帧的基础上递增,即发送一帧,这个域段的值加1。帧号在达到其最大值0x7FFH时翻转,并且这个域只存在于每帧开始时的SOF令牌中。

 

1.6 数据域(DATA)

数据字段的范围可以从0到1024字节,并且必须是整数字节。

1.7 校验域(CRC)

CRC校验不包含PID字段,令牌包是5位的CRC校验位,数据包是16位的CRC校验位。

 

1.8 EOP域(End Of Packet)

EOP表示包传输结束。通过将D +和D-驱动到SE0状态并维持2bit时间(SE0的意思是D+和D-都表示为低电平),然后将线路驱动到J状态并维持1bit时间表示EOP。从SE0到J状态的转换定义了接收器处的分组的结束。 J状态被置位1bit时间,然后D +和D-输出驱动器都处于高阻态,总线终端电阻将总线保持在空闲状态。

低速设备EOP信号:总线持续2位时间的SE0(单端0)状态,后跟随1位时间的J状态(差分0),即可完成低速EOP信号的发送。

全速设备EOP信号:总线持续2位时间的SE0(单端0)状态,后跟随1位时间的J状态(差分1),即可完成全速EOP信号的发送。

2. USB包类型

前面的传输类型和事务类型都是从功能角度来讲的,在实际的USB传输中,所有的数据都是经过打包(packet)后发送出去的,包是USB传输的最小单位,不能被打断或干扰,否则会引发错误,包(packet)根据功能可以分为3种:

  1. 令牌包(Token Packets):由主机发出,用来启动一次通信,内容有目标地址、传输方向和交互性质等。
  2. 数据包(Data Packets):交互的数据,内容为应用信息或控制/状态信息。
  3. 握手包(Handshake Packets):由数据信包接收方发出,说明对数据信包或令信包的接收情况。

 

2.1 令牌包

令牌包用于表明要开启一次USB数据传输。由于USB总线系统是主从结构的,所以无论是数据输入还是数据输出,都是由USB主机向USB从机发送令牌包,表明要进行数据传输。令牌包有以下4种:

  1. IN令牌包
  2. OUT令牌包
  3. SETUP(设置) 令牌包
  4. SOF(Start of Frame 帧起始) 令牌包

(1)IN令牌包

IN令牌包用于主机读取数据,即通知哪一个设备(ADDR)的哪一个端点(ENDP)接下来要发送一包数据给主机。当设备收到主机发送的IN令牌包,就会发送数据包给主机。

(2)OUT令牌包

OUT令牌包用于主机发送数据,即通知哪一个设备(ADDR)的哪一个端点(ENDP)接下来要接收主机传过来的数据。当设备的端点在收到OUT令牌包后,接下来会等待接收主机发来的数据

(3)SETUP令牌包

用于告知设备,主机将要发送一个数据包。当设备的端点在收到SETUP令牌包后,接下来会等待接收主机发来的数据。

与OUT令牌包不同的是,SETUP令牌包只能用在控制传输,USB主机之后将向从机发送一个DATA0类型(只能为此类型)数据包,数据包的目的地是USB设备的控制端点,此端点地址为0,USB从机必须接受此数据包,OUT令牌包没有这些限制。

IN、OUT、SETUP令牌包结构是一样的,它们的格式如下所示。

(4)SOF令牌包

对于SOF包,主机在每帧(或微帧)开始时以广播的形式发送(全速、低速设备1ms,高速设备125us),所有USB全速设备和高速设备都可以接收到SOF包,SOF不引起任何操作。它的格式如下所示。

2.2 数据包

数据包有4种,分别为:

  1. DATA0此时数据包为偶数据包
  2. DATA1此时数据包为奇数据包
  3. DATA2此时为一个高速同步事务的专用数据包。
  4. MDATA时为一个SPLIT(分裂)事务的专用数据包。

DATA0,DATA1这两种类型数据包通过包类型切换机制可以加强数据包连续传输的可靠性, 其原理是,假设当前传输数据包的包类型为DATA0,USB主机和从机都会通过自身的数据包标记记录当前的包类型为DATA0,当前数据包如果传输成功,那么USB主机和从机都会将标记切换为DATA1,但是一旦当前数据包传输失败,例如USB从机接收到的数据不完整,那么USB从机中的数据包标记会保持DATA0不变,而USB主机由于已经完成数据发送操作,会将下次要发送的数据包以DATA1类型进行发送,USB从机匹配DATA1数据包标记发现和自身的DATA0数据包标记不匹配,会要求USB主机将上次的数据重新再发送,USB主机收到信号后会执行重传操作,以确保之前的DATA0数据包被正确传输。

所有的连续数据包的类型都会在DATA0和DATA1之间不断翻转,以确保数据包准确传输。

DATA2,MDATA两种类型,这两种类型的数据包主要用在高速分裂(SPLIT)事务和高速高带宽同步传输中。

除了SOP、SYNC、EOP公共域段,数据包由PID和DATA字段组成。低速设备允许的最大传输数据量为8字节,全速设备最大传输数据量1023字节,高速设备的最大传输数据量为1024字节。它的格式如下所示。

2.3 握手包

握手包是接收方给发送方返回的状态,这样发送方可以知道接收方的当前状态。握手包有4种类型:

  1. ACK
  2. NAK
  3. STALL
  4. NYET

1ACK

  • 表示肯定的应答,由数据接收方发出,主机和设备都可以发送。
  • 表示数据传输成功,PID 被正确接收,发生数据域的CRC 校验错误等。

2NAK

  • 只能由设备发出,主机不能发出。
  • 表示设备没有准备好发送数据或者没有准备好接收数据。
  • NAK USB 的一种暂时状态, 当设备处于“ 忙”的工作状态时, 就会发送NAK;等到设备处于空闲状态时, 如果主机再要求设备发送或接收数据时, 设备不再返回NAK, 而是进行正常的数据传输。

3STALL

  • 由设备发出,主机不能发起。
  • 表示设备出错,设备不支持某个请求、无法传输或接收数据。

4NYET

  • 仅用于高速设备的数据传输,特别是USB集线器设备中。USB集线器在处理SPLIT令牌包事务处理中,如果USB集线器无法正常处理SPLIT请求,则USB集线器向USB主机返回NYET握手包。
  • 表示设备没有准备好或者出错。

除了SOP、SYNC、EOP公共域段,握手包仅由PID组成。握手数据包用于报告传输的状态。它的格式如下所示。

2.4 特殊包

特殊包主要指的是一些在特殊场合才会使用的包,分为4种:

  1. PER
  2. ERR
  3. SPLIT
  4. PING

(1)PER包(令牌包)

  • 是通知集线器打开其低速端口的前导令牌包,由主机发送给集线器,表示接是开启一个USB低速数据传输。
  • PRE只能用于全速传输模式中,平常为了防止全速信号使低速设备误动作,集线器是不会将全速信号传送给低速从机的,当集线器接收到此信号时,会将信号通过低速模式传给低速设备。
  • PRE事务处理只在USB主机和USB集线器之间进行,即只有USB集线器才可以响应PRE事务处。在全速模式下,假如需要处理低速事务,主机会发送一个PRE包,全速端口接收到此包会直接忽略,但当集线器接收到时,会打开其低速端口,然后主机就以低速模式给低速设备发送一系列令牌包、数据包等。

(2)ERR包(握手包)

  • 用于高速传输
  • 在高速USB设备传输事务中,USB总线数据传输发生错误,则会给主机发送ERR握手包。

(3)SPLIT包(令牌包)

  • 是高速事务分裂令牌包,可以将只有在高速模式下才能处理的数据包转化为低速或者全速数据包发送给相应的端口。

(4)PING包(令牌包)

  • 仅用于高速传输,用于探测设备当前的状态。PING令牌包后面是不接数据包的,只有当收到了设备发回来的ACK或者NAK应答才会开始发数据包,这就是为什么在收到NYET握手包的时候,主机会先发一个PING令牌包,确定设备有足够空间了才发送数据包,这就避免了浪费资源。
  • 发送PING包后,如果设备正确接收数据,则会给主机发送ACK握手包。如果设备没有准备好接收主机的数据或者没有准备好给主机发送数据,则会给主机发送NAK握手包。如果设备不能进行传输,则会给主机发送STALL握手包。

3. USB事务处理时序

了解了包的基本结构和分类,下面看下基本的事务处理时序,主要是理解令牌包和数据包、握手包的各种组合关系。

3.1 IN事务处理时序

IN事务处理:表示USB主机从总线上的某个USB设备接收数据包的过程。

(1)正常的输入事务处理时序

(2)设备忙时的输入事务处理时序 

 

(3)设备出错时的输入事务处理时序

 

3.2 OUT事务处理时序

事务处理:表示USB主机把一个数据包输出到总线上的某个USB设备接收的过程。

(1)正常的输出事务处理时序

(2)设备忙时的输出事务处理时序 

 

(3)设备出错的输出事务处理时序

3.3 SETUP事务处理时序

(1)正常的设置事务处理时序

(2)设备忙时的设置事务处理时序

(3) 设备出错的设置事务处理时序

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

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

相关文章

jeecg 框架的excel导入 含图片(嵌入式,浮动式)

jeecg 框架的excel导入 含图片(嵌入式,浮动式) 一、啰嗦二、准备三、 代码1、代码(修改覆写的ExcelImportServer)2、代码(修改覆写的PoiPublicUtil)3、代码(新增类SAXParserHandler&…

根据正则表达式查找字符串中第一次出现的一个或多个连续数字并返回起止位置re.rearch

【小白从小学Python、C、Java】 【考研初试复试毕业设计】 【Python基础AI数据分析】 根据正则表达式 查找字符串中 第一次出现的 一个或多个连续数字 并返回起止位置 re.rearch [太阳]选择题 根据给定的Python代码,哪个选项是正确的? import re patte…

基于Java图书馆管理系统详细设计和实现(源码+LW+调试文档+讲解等)

💗博主介绍:✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者,博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌💗 🌟文末获取源码数据库🌟 感兴趣的可以先收藏起来,…

“明天下班以后请假了,孩子中考“

「作者简介」:冬奥会网络安全中国代表队,CSDN Top100,就职奇安信多年,以实战工作为基础著作 《网络安全自学教程》,适合基础薄弱的同学系统化的学习网络安全,用最短的时间掌握最核心的技术。 前几天约服务器…

让在制品管理更有效

徐总的工厂生产线非常繁忙,每天都在不停地运转。但在制品的流转和存储也非常混乱,导致了很多问题的出现。 一方面,由于缺乏有效的管理,在制品的库存不断增加,占用了大量的资金和空间资源。这些库存不仅增加了库存成本&…

几何内核开发-实现自己的NURBS曲线生成API

我去年有一篇帖子,介绍了NURBS曲线生成与显示的实现代码。 https://blog.csdn.net/stonewu/article/details/133387469?spm1001.2014.3001.5501文章浏览阅读323次,点赞4次,收藏2次。搞3D几何内核算法研究,必须学习NURBS样条曲线…

Java医院绩效考核系统源码:关于医院绩效考核系统的技术架构、系统功能、如何选择医院绩效考核管理系统

Java医院绩效考核系统源码:关于医院绩效考核系统的技术架构、系统功能、如何选择医院绩效考核管理系统 随着医疗技术的不断发展,医院绩效管理系统已经成为提升医疗服务质量和效率的关键技术之一。本文将介绍医院绩效管理系统的概念、开发环境、功能应用…

三维点云目标识别对抗攻击研究综述

源自:电子与信息学报 作者:刘伟权 郑世均 郭宇 王程 注:若出现无法显示完全的情况,可 V 搜索“人工智能技术与咨询”查看完整文章 摘 要 当前,人工智能系统在诸多领域都取得了巨大的成功,其中深度学…

Tailwindcss 提取组件

背景 随着项目的发展&#xff0c;您不可避免地会发现自己需要重复使用常用样式&#xff0c;以便在许多不同的地方重新创建相同的组件。这在小组件&#xff08;如按钮、表单元素、徽章等&#xff09;中最为明显。在我的项目中是图表标题样式如下&#xff1a; <div class&qu…

TensorFlow高阶API使用与PyTorch的安装

欢迎来到 Papicatch的博客 文章目录 &#x1f349;TensorFlow高阶API使用 &#x1f348;示例1&#xff1a;使用tf.keras构建模型 &#x1f34d;通过“序贯式”方法构建模型 &#x1f34d;通过“函数式”方法构建模型 &#x1f348;示例2&#xff1a;编译模型关键代码 &am…

新手(初学者)学R语言第一课,从学正确导入数据开始

初看题目好像我在教你怎么导入数据&#xff0c;不不不&#xff0c;我是在教你正确的导入数据&#xff0c;不是说数据导入R就叫正确导入数据了。本章为新手教程&#xff0c;老手可以跳过。 这个内容早就想写了&#xff0c;今天有点空和大家聊一下。为什么R语言对于新手而言不太友…

建议收藏!100款宝藏级AIGC工具分享,70款ChatGPT插件惊艳的开发过程与宏大的商业化愿景

建议收藏&#xff01;100款宝藏级AIGC工具分享&#xff0c;70款ChatGPT插件惊艳的开发过程与宏大的商业化愿景。 不输ChatGPT&#xff1f;整理了100款AIGC神器&#xff0c;打工人速进。 说到AIGC工具&#xff0c;你还是只知道ChatGPT&#xff1f; 实际上&#xff0c;越来越多…

【机器学习】自然语言处理的新前沿:GPT-4与Beyond

&#x1f4dd;个人主页&#xff1a;哈__ 期待您的关注 目录 &#x1f525;引言 背景介绍 文章目的 一、GPT-4简介 GPT-4概述 主要特性 局限性和挑战 二、自监督学习的新进展 自监督学习的原理 代表性模型和技术 三、少样本学习和零样本学习 少样本学习的挑战 先…

使用kibana创建索引的时候报错处理

报错信息&#xff1a;The index pattern youve entered doesnt match any indices. You can match your 1 index, below. 使用kibana创建索引的时候&#xff0c;无法进行下一步创建操作&#xff0c;出现这种情况有很多种情况&#xff0c;每个人遇到的问题会不一样。 第一种&am…

Linux系统本地部署Android模拟器并实现无公网IP远程访问开发测试

文章目录 前言1. 虚拟化环境检查2. Android 模拟器部署3. Ubuntu安装Cpolar4. 配置公网地址5. 远程访问小结 6. 固定Cpolar公网地址7. 固定地址访问 前言 本文主要介绍如何在Linux Ubuntu系统使用Docker部署docker-android安卓模拟器&#xff0c;并结合cpolar内网穿透工具实现…

已成功见刊检索的国际学术会议论文海报展示(2)

【先投稿先送审】第四届计算机、物联网与控制工程国际学术会议&#xff08;CITCE 2024) 大会官网&#xff1a;www.citce.org 时间地点&#xff1a;2024年11月1-3日&#xff0c;中国-武汉 收录检索&#xff1a;EI Compendex&#xff0c;Scopus 主办单位&#xff1a;四川师范…

Springboot整合阿里云ONS RocketMq(4.0 http)

1. 引入依赖 <!--阿里云ons&#xff0c;方便的接入到云服务--> <dependency><groupId>com.aliyun.openservices</groupId><artifactId>ons-client</artifactId><version>1.8.4.Final</version> </dependency>2. 配置 配…

项目五 OpenStack镜像管理与制作

任务一 理解OpenStack镜像服务 1.1 •什么是镜像 • 镜像通常是指一系列文件或一个磁盘驱动器的精确副本。 • 虚拟机 所使用的 虚拟磁盘 &#xff0c; 实际上是 一种 特殊格式的镜像文件 。 • 云 环境下尤其需要 镜像。 • 镜像 就是一个模板&#xff0c;类似于 VMware 的虚…

Windwos +vs 2022 编译openssl 1.0.2 库

一 前言 先说 结论&#xff0c;编译64位报错&#xff0c;查了一圈没找到解决方案&#xff0c;最后换了32位的。 使用qt访问web接口&#xff0c;因为是https&#xff0c;没有openssl库会报错 QNetworkReply* reply qobject_cast<QNetworkReply*>(sender());if (reply){…

C语言入门系列:探秘二级指针与多级指针的奇妙世界

文章目录 一&#xff0c;指针的回忆杀1&#xff0c;指针的概念2&#xff0c;指针的声明和赋值3&#xff0c;指针的使用3.1 直接给指针变量赋值3.2 通过*运算符读写指针指向的内存3.2.1 读3.2.2 写 二&#xff0c;二级指针详解1&#xff0c;定义2&#xff0c;示例说明3&#xff…