USB包的结构

本文章主要来自《圈圈教你玩USB》的学习笔记

USB包的结构

USB是串行总线,所以数据是一位位的在数据总线上传输,采用LSB在前的方式。

USB数据需要经过位填充和NRZI编码。在这里讨论时,所用的数据都是原始数据,即没有经过位填充和NRZI编码的原始数据。

USB总线上传输数据是以包为单位的,一个包分为不同的域。根据不同类型的包,所包含的域是不一样的。

包格式:同步域+包标示符PID+...+包结束符EOP

同步域用于告诉USB的串行接口引擎,数据要开始传输了。同时还可以同步主机端和设备端的数据时钟,因为同步域是一串0开始的,而0在USB总线上就是被编码为电平翻转。全速设备和低速设备同步使用的是00000001;对于高速设备使用的是31个0,后面跟着1个1。

包结束符EOP,对于高速设备和全速/低速设备也是不一样的。全速/低速设备的EOP是一个大约为2个数据位宽度的单端0(SE0)信号,SE0的意思就是,D+,D-同时保持为低电平。由于USB使用差分数据线,通常是一高一低。SE0是一种都为低的特殊状态。SE0用来表示一些特殊含义,例如包结束,复位信号等,前面提到USB集线器对USB设备进行复位的操作,就是通过将总线设置为SE0状态大约10ms来实现的。对于高速设备的EOP使用故意的位填充来表示。

包标示符PID用来标示一个包的类型,它总共8位,其中USB协议使用的只有4位(PID0~PID3),另外4位((PID4~PID7))是(PID0~PID3)的取反,用来校验PID。

USB协议规定了4类包:

  • 令牌包
  • 数据包
  • 特殊包
  • 握手包

不同类的包又分成几种具体的包。

令牌包

所有的数据都是主机发起的,发送一个令牌包来通知哪个进行响应如何响应。

令牌包有4种:

>  输出令牌包用来通知设备要输出一个数据包

>  输入令牌包用来通知设备返回一个数据包

建立令牌包只用在控制传输中,它跟输出令牌包的作用一样,也是通知设备将要输出一个数据包,两者的区别在于:SETUP令牌包后只使用DATA0数据包。且只能发到设备的控制端点,并且设备必须要接收,而OUT令牌包没有这些限制。

>  帧起始包在每帧(或微帧)开始时发送,它已广播的形式发送,所有USB全速设备和高速设备都可以接收SOF包。USB全速设备每毫秒产生一个帧,而高速设备每125us产生一个微帧。USB主机会对当前帧号进行计数,在每帧开始时(或者微帧开始时,每毫秒有8个微帧,这8个微帧帧号是一样的,即相同的SOF)通过SOF包发送帧号。在4个令牌包之后不跟随数据传输。

SOF包的作用和使用场景?可以参考下面的文章

USB协议详解第20讲(USB包-帧首包SOF) - yooooooo - 博客园

SOF包的发送时间:

USB总线包组成:

 

数据包

数据包用来传输数据

在USB1.1协议中,只有DATA0包和DATA1包。在USB2.0中又增加了DATA2和MDATA包,主要用在高速分裂事务和高速高带宽同步传输中。

数据包结构:

之所以有不同的数据包,是用在握手包出错时纠错。

主机和设备都会维护自己的一个数据包切换机制:当数据包成功发送或者接收时,数据包类型切换。

当检测到对方使用的数据包类型不对时,USB系统认为这发生了一个错误,并试图从错误中恢复。

数据包类型不匹配主要发生在握手包被损坏的情形。当一端已经正确接收到数据并返回确认信号时,确认信号却在传输过程中被损坏。这时另一端无法知道刚刚发生的数据是否已经成功,这时候它只好保持自己的数据包类型不变。

如果对方下一次使用的数据包类型跟自己的不一致,则说明它刚刚已经成功接收到数据包了(只有正确接收才会如此);如果对方下一次使用的数据包类型跟自己的一致,则说明对方没有切换数据包类型,也就是说刚刚的数据没有发送成功,这是上一次的重试操作。

握手包

用来表示一个传输是否被对方确认

握手包只有同步域,PID和EOP。格式如下:

握手包类型有:ACKNAKSTALLNYET

>  ACK表示正确接收数据,并且有足够的空间来容纳数据。主机和设备都可以用ACK来确认。(NAK、STALL、NYET只有设备能够返回)

>  NAK表示没有数据需要返回,或者数据接收正确但没有足够的空间来容纳它们。当主机接收到NAK时,知道设备还未准备好,主机会在以后合适的时机进行重试传输。

>  表示设备无法执行这个请求或者端点已经被挂起,它表示一种错误的状态。

>  NYET只在USB2.0的高速设备输出事务中使用,它表示设备本次数据成功接收,但没有足够的空间来接收下一次数据。主机在下一次输出数据时,将先使用PING令牌包来试探设备是否有空间接收数据,以避免不必要的带宽浪费。

当USB主机或者设备检测到数据出错时(如CRC检验错,PID检验错,位填充错等),将什么都不返回。这是等待握手包的一方就会收不到握手包从而等待超时。

特殊包

在一些在特殊场合使用的包,有四种类型:PRE、ERR、SPLIT、PING。其中PRE、SPLIT、PING是令牌包,ERR是握手包。ERR、SPLIT、PING三个是在USB2.0中新增的。

> PRE通知集线器打开其低速端口的一种前导包。PRE只使用在全速模式中。平时为了防止全速信号使低速设备误动作;集线器没有将全速信号传递给低速设备的。只有当收到PRE令牌包时,才打开其低速端口。PRE令牌包与握手包的结构一样,只有同步域、PID、EOP。当需要传递低速事务时,主机首先发送一个PRE令牌包(以全速模式发送)。对于全速设备,将会忽略这个令牌包。集线器收到这个令牌包后,打开其连接了低速设备的端口。接着主机就会以低速模式给低速设备发送令牌包、数据包。

> PING令牌包与OUT令牌包具有一样的结构,但是PING令牌包后并不发送数据,而是等待设备返回ACK或着NAK,以判断设备是否能够传送数据。USB1.1没有PING令牌包。只有在USB2.0高速环境中才会使用PING令牌包,它只被使用在批量传输和控制传输的输出事务中。

> SPLIT是高速事务分裂令牌包,通知集线器将高速数据包转化为全速或者低速数据包发送给其下面的端口。

ERR握手包是在分裂事务中表示错误使用。

如何处理数据包

一般的USB接口芯片会完成如CRC校验、位填充、PID识别、数据包切换、握手等协议的处理。

当USB接口芯片正确接收到数据时,如果有空间保存,则它将数据保存并返回ACK,同时,设置一个标志表示已正确接收到数据;如果没有空间保存数据,则自动返回NAK。

收到输入请求时,如果有数据需要发送,则发送数据,并等待接收ACK。只有当数据成功发送出去(即接收到应答信号ACK)之后,它才设置标志,表示数据已成功发送;如果无数据需要发送,则它自动返回NAK。

通常只需要根据芯片提供的一些标志,准备要发送的数据到端点,或者从端点读取接收到的数据即可。所要发送和接收的数据是指数据包中的数据,至于同步域、包标示、地址、端点、CRC等是看不到的。在

BUS Hound中抓到的数据也是如此,仅是数据包;并且,BUS Hound中只能看到成功传输的数据,即只有ACK确认过的数据包。

在USB接口芯片中,通过一些标志可以知道哪个端点接收或者成功发送了数据。另外,由于控制传输比较特殊,SETUP包也会有相应的标志提供我们使用。

例如D12有如下寄存器,提供标志,表示当前包是否为setup包:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

让redis一直开启服务/自动启动

文章目录 你的redis是怎么打开的黑窗不能关?必须要自动启动吗?再说说mysql 本文的所有指令都建议在管理员权限下打开cmd控制台 推荐的以管理员身份打开控制台的方式 Win R 打开运行 输入cmdShift Ctrl Enter 你的redis是怎么打开的 安装过redis的朋友都知道, redis的安…

吴恩达深度学习笔记:卷积神经网络(Foundations of Convolutional Neural Networks)4.11

目录 第四门课 卷积神经网络(Convolutional Neural Networks)第四周 特殊应用:人脸识别和神经风格转换(Special applications: Face recognition &Neural style transfer)4.11 一维到三维推广(1D and 3…

基于图的去中心化社会推荐过滤器

🏡作者主页:点击! 🤖编程探索专栏:点击! ⏰️创作时间:2024年11月11日19点20分 点击开启你的论文编程之旅https://www.aspiringcode.com/content?id17176636216843&uideba758a1550b46bb…

云计算在教育领域的应用

💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 云计算在教育领域的应用 云计算在教育领域的应用 云计算在教育领域的应用 引言 云计算概述 定义与原理 发展历程 云计算的关键技…

开始使用 Elastic AI Assistant 进行可观察性和 Microsoft Azure OpenAI

作者:Jonathan Simon 按照此分步过程开始使用 Elastic AI Assistant for Observability 和 Microsoft Azure OpenAI。 最近,Elastic 宣布,AI Assistant for Observability 现已面向所有 Elastic 用户开放。AI Assistant 为 Elastic Observabi…

uniapp—android原生插件开发(1环境准备)

本篇文章从实战角度出发,将UniApp集成新大陆PDA设备RFID的全过程分为四部曲,涵盖环境搭建、插件开发、AAR打包、项目引入和功能调试。通过这份教程,轻松应对安卓原生插件开发与打包需求! 项目背景: UniApp集成新大陆P…

git新手使用教程

git新手使用教程 一、安装和初始化配置2、新建仓库3.工作区域和文件状态4.添加和提交文件5 git reset回退版本6 使用git diff查看差异7 使用git rm删除文件8 .gitignore忽略文件9 注册GitHub账号10 SSH配置和克隆仓库11 关联本地仓库和远程仓库12 Gitee的使用 由B站视频教程整理…

java程序优化二

接触渲染也有一段时间了,发现还有很多优化的空间,今天时间比较有限就提一点 一:从参数接口方面,例如提交渲染接口参数有大量的浮点数据,小数位过多,其实四舍五入保留4位也没什么影响,这样大小接…

分布式----Ceph部署(上)

目录 一、存储基础 1.1 单机存储设备 1.2 单机存储的问题 1.3 商业存储解决方案 1.4 分布式存储(软件定义的存储 SDS) 1.5 分布式存储的类型 二、Ceph 简介 三、Ceph 优势 四、Ceph 架构 五、Ceph 核心组件 #Pool中数据保存方式支持两种类型&…

在SpringBoot3中启用HTTP2

为什么要在SpringBoot中启用HTTP2 启用HTTP2可以带来更高效的数据传输、更优的性能表现以及更好的用户体验。 二进制格式传输数据:HTTP2采用二进制格式传输数据,而非HTTP1.x的文本格式,这使得协议解析更高效,且便于扩展。 头部压…

HCIP(核心技术篇)—RSTP实验配置

一、回顾STP和STP的缺点和不足 1.STP的概述: STP(生成树协议)是一种用于在网络中防止产生环路的链路管理协议。 2.STP的作用: 解决二层环路,防止广播报文产生。但是网络拓扑收敛较慢,影响通信质量。 3…

【数据库实验一】数据库及数据库中表的建立实验

目录 实验1 学习RDBMS的使用和创建数据库 一、 实验目的 二、实验内容 三、实验环境 四、实验前准备 五、实验步骤 六、实验结果 七、评价分析及心得体会 实验2 定义表和数据库完整性 一、 实验目的 二、实验内容 三、实验环境 四、实验前准备 五、实验步骤 六…

在线绘制cancer cell同款双向条形图展示富集结果

导读:将上调和下调pathway富集结果以双向条形图的形式在一张图中展示,不仅优化了绘图空间,还通过对称布局增强了图片的美观性。 《Cancer cell》文章“Cross-tissue human fibroblast atlas reveals myofibroblast subtypes with distinct ro…

Linux(文件特殊属性 + FACL 图片+大白话)

后面也会持续更新,学到新东西会在其中补充。 建议按顺序食用,欢迎批评或者交流! 缺什么东西欢迎评论!我都会及时修改的! 在这里真的很感谢这位老师的教学视频让迷茫的我找到了很好的学习视频 王晓春老师的个人空间…

json转excel,读取json文件写入到excel中【rust语言】

一、rust代码 将json文件写入到 excel中。(保持json :key原始顺序) use indexmap::IndexMap; use serde::Deserialize; use serde_json::{Value, from_str}; use std::error::Error; use std::io::{self, Write}; use std::path::{Path}; u…

理想火车站定位(字节青训)

题目 小F是A市的市长,正在计划在A市新建一个火车站以方便市民的日常出行。市区内的街道布局十分规整,形成网格状。从一个位置[x1, y1]到另一个位置[x2, y2]的距离计算方法为 |x1 - x2| |y1 - y2|,即曼哈顿距离。 在初步考察后,…

5位机械工程师如何共享一台工作站的算力?

在现代化的工程领域中,算力已成为推动创新与技术进步的关键因素之一。对于机械工程师而言,强大的计算资源意味着能够更快地进行复杂设计、模拟分析以及优化工作,从而明显提升工作效率与项目质量。然而,资源总是有限的,…

使用微信云开发,实现链接激活微信小程序(微信内部和外部H5访问)

首先小程序项目开发,需得支持云开发如何开通云开发?(网上教程很多,也很全面,这里仅带过) 配置云函数在项目根目录找到 project.config.json 文件,新增 cloudfunctionRoot 字段,指定本…

NVM 介绍及使用指南

在日常的开发工作中,我们往往会遇到需要在同一台机器上同时管理多个版本的 Node.js 的情况。为了解决这个问题,我一个同事推荐了NVM(Node Version Manager)。NVM 是一个用于管理 Node.js 版本的工具,可以方便地在不同的…

vscode 全局搜索的用法:

搜索栏最右边功能是区分大小写,全字匹配(比如搜索abc,就不会显示abcd或者ab这些内容),使用正则表达式。变成高亮就是开启对应功能。包含的文件:这栏里如果最右边高亮填入带路径的文件,指的是在文…