USB协议传输结构

2023-05-16

  USB作为数据通信标准,固件可分为枚举配置和类协议部分,枚举配置实现USB主机对设备的枚举和配置,类协议实现设备各自的数据传输。
  usb2.0协议chapter8 protocol layer

1 USB协议传输结构

  • 集合关系:传输类型 -> 事务 -> 包 -> 域
    • 传输类型: 控制、中断、同步、批量
    • 事务: IN、OUT、SETUP
    • 包: 令牌包、数据包、握手包
    • 域: 同步序列域、包标识域、地址域、端点域、帧号域、数据域、CRC校验域

注:
1、 USB基本数据结构是包,而包由不同的域构成,而不同的包又组成不同的传输类型。
2、 USB总线发送是LSB在前,MSB最后。

1.1

1.1.1
同步序列域(SYNC):

位于一个包的最开始处,8bit,固定0000 0001
这里写图片描述

1.1.2
标识域(PID):

  在同步域之后,标明包类型。8bit,LSB四位为标识码,MSB四位为标识码的反码。类型见下图。
这里写图片描述
  USB 协议1 .1 中, 定义了10 种不同类型的包。USB 协议2 .0 中则定义了全部16 种标识域。如下图所示,标橙色为2.0所有。
这里写图片描述

1.1.3
地址域(ADDR)

  由主机分配唯一地址,7bit,由于地址0保留用作初始化,因此地址最多有127个,也是usb结构中最大127个设备的原因。
这里写图片描述

1.1.4
端点域(ENDP):

  4bit,端点0必须作为控制端点,端点可被定义为IN、SETUP、OUT、PING端点,所有设备必须支持端点0作为默认的控制管道。低速设备最大支持3个管道,1个0端点和2个其他端点(可以是都是控制,一个控制一个中断也可以是两个中断)。高速全速支持最大16个输入输出管道。
这里写图片描述

1.1.5
帧号域(FRAM)

  11bit,每个帧都有一个特定帧号,帧号域最大容量为0x7FF
这里写图片描述

1.1.6
数据域(DATA)

  在不同的传输类型中,数据域的长度不同(0到1024Byte),但是必须为整数个字节的长度。
这里写图片描述

1.1.7
校验域(CRC)

  对令牌包和数据包中非PID域进行校验,令牌包使用CRC5(5bit),数据包使用CRC16(16bit)。

1.2
包(Packet)

  包( Packet )是最基本的USB 的数据单元, 由一系列的域组成。如前PID域所述, USB 中定义了4 种类型的包, 即令牌包、数据包、握手包和特殊包。
包是USB总线上数据传输的最小单位,不能被打断或干扰,否则会引发错误。若干个数据包组成一次事务传输,一次事务传输也不能打断,属于一次事务传输的几个包必须连续,不能跨帧完成。一次传输由一次到多次事务传输构成,可以跨帧完成。

1.2.1
令牌包( Token Packet )

IN、OUT、SETUP包结构是一样的,如下图
这里写图片描述
帧起始包机构,如下图
- frame:全速设备一帧1.00 ms ±0.0005 ms
- microframe:高速设备一帧125 μs ±0.0625 μs。
帧的起始由一个特定的包(SOF 包)表示,所有高速和全速还有hub都会收到SOF包,但是不会引起任何作用
这里写图片描述

split传输特殊令牌包(Split Token)

  在主机控制器和 HUB之间执行,通过分离传输,可以允许全速/低速设备连接到高速主机。分为start-split transaction (SSPLIT)和complete-split transaction (CSPLIT)。具体可看USB2.0协议8.4.2。

1.2.2
数据包(Data Packets)

  USB 发送数据包的时候, 如果一次发送数据长度大于端点容量时候, 就要把数据分成几个包, 分批发送。如果第一个数据包被确定为DATA0 , 那么第二个发送的数据包就应该是DATA1⋯⋯如此交替下去。而数据的接收方在接收数据时检查其类型是否是DA TA0、DATA1 交替的, 这是保证数据交换正确的机制之一。
但是当处于同步传输中,所有的数据包都是DATA0。
这里写图片描述
  所有的四个数据包用于高带宽高速同步端点,三个数据包(MDATA DATA0,DATA1)用于split事务传输。
所有数据包都是整数发送,CRC校验不包括PID域。允许数据包最大大小为低速8Byte,全速1023Byte,高速1024Byte。

1.2.3
握手包(Handshake Packets)

这里写图片描述

ACK

  • 标识域PID 被正确接收;
  • 并且没有发生数据位错误;
  • 没有发生数据域的CRC 校验错误等。
    一般由接收到数据的一方发出,主机和设备都可以发送
    ACK。

NACK

  • 在接到主机发来的OU T 命令后, 设备无法接收数据;
  • 接到主机的IN 命令, 但是设备没有数据发送给主机。
    NAK 只能由设备发送, 而不能由主机发送。

STALL

  • 设备无法发送数据;
  • 设备无法接收数据;
  • 不支持某一种控制管道的命令
    STALL 也只能是由设备来发送,NAK 是USB 的一种暂时状态, 当设备处于“ 忙”的工作状态时, 就会发送NAK。等到设备处于空闲状态。这时, 如果主机再要求设备发送或接收数据时, 设备不再返回NAK, 而是进行正常的数据传输。而STALL 与NAK 不同, STALL所表示的传送失败的意义更加严重。当在控制传输中出现STALL 后, 主机就会丢弃所有发给设备的控制命令, 而且要重新进行控制传输后, 才能停止STALL 状态。

NYET

ERR

1.3
事务

  事务分为IN,OUT,SETUP3个事务。每个事务由令牌包,数据包,握手包3个阶段构成。事务3个阶段如下:
  1)令牌包阶段:启动一个输入,输出或设置的事务。
  2)数据包阶段:按输入,输出发送相应的数据。
  3)握手包阶段:返回数据接收情况,在同步传输的IN事务和OUT事务中没有这个阶段。

1.3.1 事务的3种类型

IN事务:

  令牌包阶段–主机发送一个PID为IN的输入包给设备,通知设备要往主机发送数据。
  数据包阶段–设备根据情况会做出3种反应:
  a. 设备端点正常,设备往主机内发出数据,DATA0和DATA1交替发送。
  b. 设备正在繁忙,无法往主机发出数据包,此时发送NAK无效包,IN事务提前结束,到了下一个IN事务才继续。
  c. 相应设备端点被禁止,此时发送STALL错误包,事务提前结束,总线进入空闲状态。
  握手包阶段–主机在正确接收到数据后,就会向设备发送ACK包。

OUT事务:

  令牌包阶段–主机发送一个PID为OUT的输出包给设备,通知设备要接收主机数据。
  数据包阶段–主机交替发送数据DATA0和DATA1。
  握手包阶段–设备根据情况做出3种反应:
  a. 设备端点接收正确,设备向主机返回ACK包,通知主机可以发送新的数据,如果数据包发送了CRC校验数据,将不返回任何握手信息。
  b. 设备正在忙碌,无法从主机接收数据包就发送NAK无效包,通知主机再次发送数据。
  c. 相应设备端点被禁止,发送错误STALL包,事务提前结束,总线直接进入空闲状态。

SETUP事务:

  令牌包阶段–主机发送一个PID为SETUP的输出包给设备,通知设备要接收数据。
  数据包阶段–主机设备发送数据,注意这里只有一个固定为8个字节的DATA0包,其中就是标准的USB设备请求指令。
  握手包阶段–设备接收到主机的命令信息后,返回ACK包,此后总线进入空闲状态,并准备下一个传输。一般来说,在SETUP事务后面通常是一个IN或OUT事务构成的传输。

1.4
传输类型

USB 定义了4 种数据传输的类型:控制传输、中断传输、批量传输和同步传输。任何一种传输都是由上面的3 种事务所组成的,传输类型由一笔或者多笔事务完成。
USB 把事务分为IN、OU T 和SET UP 3 种类型, 但在每一种传输类型中, 这些相同事务结果并不是完全一样。比如,同步传输IN 事务和中断传输IN事务就有差别。

1.4.1
批量传输(Bulk Transactions)

  • 由IN 事务或OU T 事务构成
  • 翻转同步:发送端按DATA0-DATA1-DATA0-…顺序发送数据包,只有成功的事务传输才会导致 PID 翻转,发送端只有在接收到 ACK 后才会翻转 PID,发送下一个数据包,否则会重试本次事务传输。同样,若在接收端发现接收到到的数据包不是按照此顺序翻转的,比如连续收到两个 DATA0,那么接收端认为第二个 DATA0 是前一个 DATA0 的重传。
  • 没有固定传输速率,不占固定带宽
  • PING事务是USB2.0高速模式特有的,全速模式和低速模式没有
  • 全速和高速设备支持批量传输, 而低速设备不支持
    这里写图片描述

数据包大小

  • 数据包大小可设定为8、16、32、64字节,高速设备必须设定为512字节除了最后一个包

1.4.2
中断传输(Inte r rupt T ransfer)

  • IN 事务或OU T 事务组成。
  • 除了不支持PING之外与批量传输一致
  • 主机根据中断端点描述符指定查询间隔发起中断传输。中断传输有较高的优先级,仅次于同步传输。
  • 没有固定传输速率,不占固定带宽
  • 全速设备可选轮询周期是1~255 ms , 低速设备轮询周期10~255 ms
    这里写图片描述

数据包大小

低速设备数据包大学1-8字节,全速1-64字节,高速1-1024字节

1.4.3
同步传输(Isochronous Transfer)

  • 只有IN和OUT事务
  • 没有握手包,总线优先保证占用带宽
  • 只使用DATA0
  • 数据包大小全速1-1023字节,高速1024字节
  • 低速设备不支持
    这里写图片描述
    全速设备的同步传输, 在1 个帧内, 可以包含1 笔IN 事务或OUT 事务, 而高速设备可以包含3 笔事务。总线将会优先保证同步传输的带宽, 甚至会因此而暂时中止批量传输的进行。

数据包大小

全速设备数据包的大小为0~1 023 字节, 而高速设备为1 024 字节

1.4.4
控制传输(Control Transfer)

  • 枚举阶段最主要的数据交换方式

结构

  • 初始设置阶段;
  • 可选数据阶段;
  • 状态信息阶段。

(1)初始设置阶段

这里写图片描述
上图可知,初始设置阶段也分为
令牌包阶段: 主机发送SETUP令牌包。
数据包阶段: 主机发送固定为8 个字节的DATA0 包, 并且有确定的结构, 将这8 个字节分配给5 种命令信息, 即bmRequestType、bRequest、wValue、wIndex 和wLength。具体看标准命令

这里写图片描述

(2)可选数据阶段

如果在上一步骤中的命令要求读/ 写数据的话, 就由这一步骤来具体交换数据。如果没有数据交换要求的, 这个步骤就可以省去。(由SETUP事务的数据包阶段发送的标准请求命令决定),当一个数据包阶段发送不了时候,就分多个数据包发送。
根据数据阶段的数据传输的方向,控制传输又可分为3种类型:
1) 控制读取(读取USB描述符)
2) 控制写入(配置USB设备)
3) 无数据控制

(3)状态信息阶段

  • 获取状态信息,由IN或OUT事务构成的传输
  • 传输方向相反,这里IN表示向设备里面传送数据,OUT表示数据向主机里送数据,这是为了和可选数据阶段向结合。
  • 数据包都是0长度

数据包大小

初始设置中, 1 个固定为8 字节大小的DATA0 包。可选数据步骤中, 低速设备,则数据包为8 字节; 全速设备数据包大小可以是8、16、32 和64 字节; 高速设备的数据包大小必须为64 字节。

2 数据流模型

2.1
端点( Endpoint )

  • 设备硬件上具有一定大小的数据缓冲区
  • 有惟一的地址和端点号
  • 端点0是设备的默认控制端点
  • 端点描述符中规定了端点所能支持的最大包长。
    控制传输:高速模式的最大包长固定为64个字节;全速模式可在8、16、32、64字节中选择;低速模式的最大包长固定为8个字节。
    批量传输:高速模式固定为512个字节;全速模式最大包长可在8、16、32、64字节中选择;低速模式不支持批量传输。
    同步传输:高速模式的最大包长上限为1024个字节;全速模式的最大包长上限为1023个字节;低速模式不支持同步传输。
    中断传输:告诉模式的最大包长上限为1024个字节;全速模式最大包长上限为64个字节;低速模式最大最大包长上限为8个字节。

2.2
管道( Pipe)

  • 管道就是主机与设备端点之间逻辑上的的连接
  • 管道的概念主要用于PC 上驱动程序和用户程序的编写

2.3
USB 数据传输过程

这里写图片描述
完整的数据传输过程: PC 上, 设备驱动程序通过调用USB 驱动程序接口USBD( USB Drive r Inter face) , 发出输入输出请求包IRP; 在USB 驱动程序接到请求之后, 调用主控制器驱动程序接口HCD( Host Cont roller Drive r Inte rface ) , 将IRP 转化为USB的传输。一个IRP 可以包含一个或多个USB 传输; 接着, 主控制器驱动程序将USB 传输分解为总线事务, 主控制器以包的形式发送给设备。这里各种驱动程序和IRP的概念, 都是基于PC 和其操作系统的, 当在设计嵌入式USB 主机的时候, 完全可以摆脱这种框架, 而仅以最简单的能够实现USB 各种类传输为目标即可。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

USB协议传输结构 的相关文章

随机推荐

  • 【死磕 Java 集合】— ConcurrentSkipListMap源码分析

    转自 xff1a http cmsblogs com p 61 4773 隐藏目录 前情提要简介存储结构源码分析 主要内部类构造方法添加元素添加元素举例删除元素删除元素举例查找元素查找元素举例彩蛋 作者 xff1a 彤哥 出处 xff1a
  • STL-set (集合)之删除元素

    set概述 和vector list不同 xff0c set map都是关联式容器 set内部是基于红黑树实现的 插入和删除操作效率较高 xff0c 因为只需要修改相关指针而不用进行数据的移动 在进行数据删除操作后 xff0c 迭代器会不会
  • 经典算法之一:快速排序

    快速排序由于排序效率在同为O N logN 的几种排序方法中效率较高 xff0c 因此经常被采用 xff0c 再加上快速排序思想 分治法也确实实用 xff0c 因此很多软件公司的笔试面试 xff0c 包括像腾讯 xff0c 微软等知名IT公
  • 矩阵乘法测试

    对于时间的函数 gettimeofday 函数使用方法 xff1a http blog csdn net hurmishine article details 60326345 矩阵乘法测试 xff1a 代码 xff1a 1 为了试验简单
  • Python爬虫自动获取CSDN博客收藏文章

    CSDN的Python创意编程活动开始第一天就看到了 xff0c 但是认为自己是菜鸟 xff0c 就向当 吃瓜群众 xff0c 后来看到有好多人的代码是关于爬虫的 xff0c 当初我就是由于对爬虫 感兴趣才自学的Python 现在也打算参加
  • 全网最!详!细!Tarjan算法讲解。

    Tarjan算法讲解的博客网上找到三篇比较好的 现在都转载了 个人只研究了第一篇 正如博主所说 讲的标比较详细 清晰 剩下两篇也可以看一下 卿学姐视频讲解 https www bilibili com video av7330663 以下内
  • MFC计算机图形学(1)

    这学期上了计算机图形学 xff0c 用MFC来绘制简单的图形 下面就简单介绍一下用cv 43 43 来绘制图形 VC 43 43 安装 VC 43 43 我基本不用的 xff0c 平时写C C 43 43 的代码都用Code Blocks
  • MFC计算机图形学(2)

    这里呢 xff0c 先把上一讲的联系讲一下 一般人都用是一个一个的去画 xff0c 但是那样好麻烦 xff0c 计算机的有点就是容易处理重复的事情 xff0c 那就定义成一个画正方形函数吧 xff0c 每次调用就可以了 怎么自定义函数呢 x
  • MFC计算机图形学(3)

    之前我们已经可以画出直线和曲线了 但是算法虽容易理解 xff0c 但是复杂度高 xff0c 今天就介绍比较流行的DDA画线法 xff0c 还有 xff0c 对鼠标进行事件有所响应 xff0c 即 xff0c 在画板上 xff0c 鼠标左键单
  • Ubuntu18.04安装realsense viewer

    一 下载realsense安装包 mkdir p librealsense install cd librealsense install git clone b v2 31 0 https github com IntelRealSens
  • 用D435i录制自己的数据集运行ORBslam2并构建稠密点云

    一 录制rosbag 二 播放rosbag并用rviz查看topic xff0c 记下rgb和depth流话题名 三 用如下脚本 xff08 python2而不是3 xff09 保存rgb和depth图片同时生成rgb txt depth
  • Unrecoverable error: corrupted cluster config file.

    from https www cnblogs com topicjie p 7603227 html 缘起 正在欢乐的逗着孩子玩耍 xff0c 突然间来了一通电话 xff0c 值班人员告诉我误重启了一台服务器 xff0c 是我负责的服务 x
  • 树莓派3B+无屏幕和键盘配置树莓派WiFi和SSH

    前言 树莓派3B 43 安装系统Raspbian xff0c 默认的SSH是关闭的 xff0c 如何在无屏幕和键盘的情况下 xff0c 让笔记本通过WIFI访问树莓派 树莓派3B 43 发布后不久 xff0c 树莓派官方 Raspbian
  • ubuntu分区设置

    ubuntu分区设置 swap区 xff1a 逻辑分区 xff0c 虚拟内存类似 xff0c 大小和电脑内存一样大 xff1b boot区 xff1a 主分区 xff0c 引导系统的 xff0c 分配200M 500M xff0c 条件好些
  • 图像系统概述和名词解析

    图像系统组成 光源 xff08 包含人造光 自然光 闪光灯 xff09 照到物体上 xff0c 光线反射进入成像系统 xff0c 经过镜头 xff08 对于变焦镜头有驱动马达调整镜片位置 xff0c 实现变焦 xff09 光圈 滤光片 快门
  • 海思IQ图像清晰度调试策略

    总策略 影响清晰度的关键指标 xff1a 锐度 噪点和gamma Gamma调试步骤 YUVsharpen锐度调试 LDCI局部对比度调节 Dehaze调节 去雾算法主要用在有场景中做处理 xff0c 调整图像的对比度使更加清 去雾算法主要
  • 海思ISP曝光调整策略

    AE曝光调整 Exposure Attr 影响参数 xff1a ExpTimeRange Min Max 曝光时间Gain 各种增益控制Speed 曝光速度 xff08 影响到曝光收敛 xff0c AE闪烁 xff09 Compensati
  • ADS(ARM Developer Suite)安装与卸载中的问题(转)

    ADS用来对ARM的裸机代码进行编辑和调试 我在安装ADS1 2的过程中 xff0c 遇到了一个小问题 xff0c 写下来和大家分享一下解决方法 1 在安装程序 xff0c 进度条到100 时 xff0c 会一直停在那 xff0c 十几分钟
  • ucosIII 学习资料汇总

    网站 书籍 1 嵌入式实时操作系统uc OS III 邵贝贝译 这本书其实就是一本工具书 xff0c 我参考了官方的说明文档 xff0c 发现雷同很高 感觉就是官方说明文档翻译的 xff0c 用来应用查查接口还有点用 xff0c 不是十分推
  • USB协议传输结构

    USB作为数据通信标准 xff0c 固件可分为枚举配置和类协议部分 xff0c 枚举配置实现USB主机对设备的枚举和配置 xff0c 类协议实现设备各自的数据传输 usb2 0协议chapter8 protocol layer 1 USB协