USB 概述及协议基础

news/2024/10/10 13:07:35

《圈圈教你学 USB》第 1 章学习笔记

1 USB 是什么?

  • 1)USB(Universal Serial Bus,通用串行总线)

2 USB 的特点

  • 1)USB 协议版本与速度:

来源:https://www.usbzh.com/article/detail-199.html

  • 2)开发 USB 常用网站: https://www.usb.org

3 USB 的拓扑结构

USB 是主从结构,主机为 Host,从机为 Device。

  • 1)主从结构:主机 Host,从机 Device

  • 2)通常 PC 上有一个或多个 USB 主控制器(host controller,如下图的 USB Composite Device);每个主控制器下有一个根集线器(root hub,如下图的 USB 根集线器);而根集线器通常有一个或多个 USB 口:

当我将一个 USB 一拖四扩展坞插入电脑时,多出了一个 “通用 USB” 集线器(集线器只能扩展接口,不能扩展带宽),如下图所示:

  • 3)USB 数据交换只能在主机与设备之间。USB OTG 中一个设备可在从机与主机间切换。

关于 USB 集线器的层数,USB1.1 中最多 4 层,USB2.0 中最多 6 层。

4 电气特性

  • 1)连接线:

    • 4 线:电源 VBUS、GND,D- 和 D+ 差分数据线
    • 5 线:MINI USB 中添加身份识别(ID)线
    • 9 线:USB 3.0 时代,全新设计的 USB Type-A、Type-B 和Micro-B,但没有普及
    • 24 线:Type C
  • 2)NRZI 编码与位填充:数据为 0 时翻转电平,为 1 时不翻转;连续 6 个 1 时填充数据 0。

5 USB 的线缆、插头及插座

  • 1)Type A 型、Type B 型、MINI USB、Type C 型

6 插入检测机制

  • 1)集线器的 D+ 和 D- 分别接一个 15k 下拉电阻到地;USB 设备端则在 D+ 或 D- 上接一个 1.5k 上拉电阻到 3.3V:
    • (1)低速设备上拉电阻接 D-;
    • (2)全速与高速设备则接 D+。

设备插入到集线器时,数据线的分压大概在 15 / (15 * 1.5) * 3.3V = 3V,对集线器的接收端来说是一个高电平。

根据被拉高的数据线是 D+ 或 D- 来判断设备的速度类型。
高速设备会先识别为全速设备,然后两者再通信确认后切换到高速模式。(高速模式下为电流传输,要断开 D+ 的上拉电阻)

如果 USB 外设或芯片没有内部 1.5k 上拉电阻,则可以通过以下电路实现:

实验:在 USB 的 D+ 或 D- 上接一个 10k 上拉电阻,则 Windows 会提示发现新硬件,但无法找到驱动。

7 描述符

USB 是一条协议总线,而 USB 描述符则会记录设备的类型、厂商和产品 ID(加载驱动)、端点情况、版本号等内容。

描述符 说明
设备描述符 设备唯一,向主机说明设备类型、端点 0 最大包长、设备版本、配置数量等
配置描述符 至少一个,主机只能选择一个,向主机说明配置包含的接口数、配置编号、供电方式、所需电流 等
接口描述符 至少一个,向主机说明接口编号、端点数(不包括端点0)、接口所使用的类、子类、协议等。通过接口来实现功能,固所需端点数不确定
端点描述符 可为0个,说明端点的端点号及方向、端点传输类型、最大包长度、查寻时间间隔 等
字符串描述符 提供一些方便人们阅读的信息,非必需。

主机首先获取 “设备描述符”,然后获取 “标准配置描述符”,根据其内部的配置描述符集合长度值,一次性将配置描述符、接口描述符、类特殊描述符(如果有)、端点描述符读回;字符串描述符是单独获取的。

端点:实现 USB 设备功能的物理缓冲区实体,USB 主机和设备通过端点进行数据交互。

8 枚举过程

枚举,主机从设备读取各种描述符信息,并根据这些信息来加载合适的驱动程序,从而知道设备类型、如何通信等。

控制传输:是 USB 传输模式的一种,它保证数据正确性,是设备枚举过程中采用的传输方式

  • 1)控制传输的过程:

    • (1)建立过程:由 USB 主机发起;由 SETUP 令牌包 + DATA0 数据包 构成; 建立过程中指定数据长度为 0,则没有数据过程。
    • (2)数据过程(可选):控制读则输入数据;控制写则输出数据;
    • (3)状态过程:与数据过程传输方向相反;用来确认数据是否正确传输完成。
  • 2)枚举的详细过程:

    • (1)获取描述符:

        1. 主机检测到设备插入则对设备复位,复位后设备地址为 0。主机向地址 0 的设备的端点 0 发送获取设备描述符的标准请求(仅一次请求)(控制传输的建立过程)
        1. 设备收到请求后,将设备描述符返回主机(控制传输的数据过程)
        1. 主机接收到设备描述符,并确认无误后,返回 0 长度的确认数据包(控制传输的状态过程)
    • (2)设置地址。

        1. 主机向地址 0 的设备的端点 0 发出设置地址请求(控制传输的建立过程,该过程数据包中包含新的设备地址)
        1. USB 设备进入状态过程(因为该控制传输无数据过程),并等待主机请求状态返回(设备无法主动向主机返回)
        1. 设备收到主机输入的令牌包后,返回 0 长度的状态数据包。
        1. 主机发送应答包 ACK 给设备,设备收到后启用新的设备地址
    • (3)主机再次获取设备描述符:使用新的设备地址;获取全部 18 字节(可多次请求);

    • (4)主机获取配置描述符:共 9 字节;根据所描述的配置集体总长度获取配置集合;

    • (5)获取字符串描述符(可选):HID 设备还会获取报告描述符等;单独获取;

  • 可参考:https://www.usbzh.com/article/detail-110.html

9 USB 的包结构与传输过程

9.1 USB的包结构及包的分类

  • 1)USB 以包为基本单位进行数据传输,一个包被分成不同的域,域使用 LSB 方式。

  • 2)包虽然由不同的域组成,但共同点为:同步域 + 包标识符(PID,Packet Identifier) + [域] + 包结束符 EOP(End Of Packet)

    • (1)同步域:

        1. 用来通知 USB 串行接口引擎准备好开始传输;还可以用来同步时钟(其由多个 0 组成,而 0 需要进行电平翻转)
        1. 发送端:低速、全速设备同步域为 0000_0001;高速设备使用 31 个 0,后面跟 1 个 1

      NRZI 编码后的低速或全速 USB 数据包(如下图)。当最后数据未翻转时,认为接收到包标识符 PID。

    • (2)包标识符:共 8 位,USB 协议只使用其中 4 位(PID0~PID3),而高 4 位是低 4 位的取反。

      • 0bxxxx_xx00:特殊包,special packet
      • 0bxxxx_xx01:令牌包,token packet
      • 0bxxxx_xx10:握手包,handshake packet
      • 0bxxxx_xx11:数据包,data packet

    每个包又可以分为几种类型:

    • (3)包结束符 EOP:
        1. 全速或低速设备为 SE0(D+、D- 同时为低)
        1. 高速设备为故意的位填充错误来表示。(即 CRC 正确,但位填充错误)

9.2 令牌包

令牌包用来启动一次 USB 传输;

  • 1)令牌包有 4 种:输出(OUT)、输入(IN)、建立(SETUP)、帧起始(SOF,Start of Frame)

OUT、IN、SETUP 令牌包结构图:

SOF 令牌包结构图:

建立令牌包与输出令牌包的区别:
作用相同,都是通知设备要输出一个数据包;
不同的是,SETUP 包后只使用 DATA0 数据包,且只能发送到设备控制端点,并且设备必须接收,而 OUT 包没有这些限制。

9.3 数据包

数据包用来传输数据。所有数据包有相同的结构:

设计不同类型的数据包,是用来在握手包出错时纠错。

9.4 握手包

握手包用来表示一个传输是否被对方确认。结构只有 同步域、PID、EOP。

  • 握手包有 4 种:ACK、NAK、STALL、NYET
    • ACK:数据正确接收。主机只能使用 ACK 握手包。设备则可以使用所有。
    • NAK:没有数据需要返回,或数据正确接收但没有跑空间存储。主机接收到 NAK 时,便知设备未准备好。
    • STALL:设备无法执行该请求,或端点已经挂起。表示错误状态,需主机干预来解除该状态
    • NYET:表示本次数据成功接收,但没有足够空间来接收下次数据,只有 USB2.0 高速设备输出事务中使用。主机在下次输出数据时,将先使用 PING 令牌包来试探。

9.5 特殊包

特殊包指在特殊场合使用的包。

特殊包有 4 种,PRE、ERR、SPLIT、PING。其中除 ERR 是握手包外,其余均是令牌包且是 USB2.0新增。

  • PRE:与握手包结构一致。全速模式中,需要传输低速事务时,发送 PRE 包通知集线器打开其连接的低速设备端口(因为平时为避免低速设备误动作,低速设备端口是关闭的)
  • PING:与 OUT 令牌包结构一致。但其不发送数据,而是等待设备返回 ACK 或 NAK,以判断设备是否能够传送数据。
  • SPLIT:高速事务分裂令牌包。
  • ERR:高速事务中表示错误使用。

9.6 如何处理数据包

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

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

USB 接口芯片收到输入请求时,如果有数据需要发送,则发送数据,并等待接收 ACK,收到 ACK 设置成功发送标志;
如果无数据发送,则自动返回 NAK。

通常要做的事是 根据 USB 接口芯片提供的标志,准备要发送的数据到端点,或者从端点读取接收到的数据即可。
而所谓数据,是指数据包中的数据,至于同步域、包标识、地址、端点、CRC 等由接口芯片处理。

10 USB 四种传输类型

USB 总线上传输的基本单位是包,但需要将包组织成事务(Transaction)才能传输数据。

USB 协议规定 4 种传输类型:批量传输、等时(也作同步)传输、中断传输、控制传输。
控制传输包括 3 个过程,建立过程、状态过程分别是一个事务,数据过程则可能包含多个事务;
其余 3 种传输方式则每传输一次是一个事务。

10.1 USB 事务

事务通常由 2 个或 3 个包组成:令牌包、数据包、握手包

  • 令牌包:启动一个事务,由主机发送
  • 数据包:传送数据,方向由令牌包指定
  • 握手包:数据接收方接收正确后,发送握手包;设备也可使用 NAK 握手包来表示数据未准备好。

10.2 批量传输

批量传输使得批量事务传输数据。
一次批量事务有 3 个阶段:令牌包阶段、数据包阶段、握手包阶段(下图中两行虚线隔开了三个阶段)。
应用场景:数据量大、对数据的实时性要求不高的场合,如大容量存储设备(Mass Storage Device,MSD)、USB 打印机、扫描仪等

批量传输(Bulk)分为批量输出事务(主机写)批量输入事务(主机读)

批量输入事务的数据包如下:

批量输出事务的数据包如下:

10.3 中断传输

中断传输是一种保证查询频率的传输。中断端点在端点描述符中报告查询间隔,主机保证在间隔内进行一次轮值。(此中断非单片机中断,而是主机 Host 保证在某个时间间隔内进行一次传输)

中断传输也可以不断地检测状态,然后使用批量传输来传送大量数据。

应用场景:适合数据量小,但时间要求严格的设备,如从机接口设备(Human Interface Device,HID)中的鼠标、键盘等设备。

中断传输事务流程如下:

10.4 等时(同步)传输

等时传输使用等时事务(Isochronous Transaction)来传输数据,不保证数据 100% 正确,但支持数据量大且实时性高。

应用场景:数据量大,实时性要求高,如音视频设备等。(与批量传输场景区别是等时传输可容忍少量数据错误,但保证不能停顿。)

等时事务流程图:

10.5 控制传输

控制传输分为三个过程:建立过程、数据过程(可选)、状态过程

1)建立过程:使用建立事务。该过程中的令牌包(SETUP)、数据包(DATA0)、握手包(ACK)是固定的。

2)数据过程(可选):批量事务

3)状态过程:批量事务,只使用 DATA1 包。

控制传输要保证数据传输过程中的数据完整性,如枚举过程中各种描述符的获取以及设置地址、设置配置等。控制传输的实例如下:

10.6 端点类型与传输类型的关系

一个具体的端点,只能工作在一种传输模式下。通常把工作在什么模式下的端点,就叫做什么端点,如控制端点、批量端点。

如,端点 0 是每个 USB 设备都必须具备的默认控制端点,它一上电就存在并可用。还记得枚举过程就是通过控制传输来进行的。

10.7 传输类型与端点最大包长

每个端点描述符都规定了端点所支持的最大数据包长。

传输 低速最大包长 全速最大包长 高速最大包长
控制传输 8字节 可选 8、16、32、64 字节 64字节
等时传输 不支持 1023 字节 1024 字节
中断传输 8字节 64 字节 1024 字节
批量传输 不支持 可选 8、16、32、64 字节 512 字节

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

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

相关文章

AI云平台介绍

AI云平台是基于云计算基础设施,集成机器学习、深度学习、自然语言处理、计算机视觉等先进AI技术,通过云端服务的形式,向用户提供数据预处理、模型训练、模型部署、预测推理等一系列AI开发与应用服务的平台。AI云平台是基于云计算基础设施,集成机器学习、深度学习、自然语言…

无人直播自动化回复客户咨询

我们插件是根据页面元素变动进行自动化操作的,想要实现网页版自动化,必须了解html以及dom结构,还有xpath定位方法。 各大直播后台页面结构不一样,所以要进行兼容处理,我们一个插件支持以下直播或客服平台 唯一客服浏览器插件 十年开发经验程序员,离职全心创业中,历时三年…

【日记】生巧好好吃!(701 字)

正文今天才发现昨天寒露。不过昨天很冷,今天倒挺暖和,太阳很好。下午上班,觉得这么好的太阳不做点什么很亏,于是转身回去拿了被子。晚上下班去收,被子上面落的全是桂花。那时候天色已暗,天边有一种低沉但通透的蓝。一般这种时候温度都很低了。秋天真的到了啊……主管买的…

UE4.26 Emissive Decal(发光贴花)模拟Light Function

【USparkle专栏】如果你深怀绝技,爱“搞点研究”,乐于分享也博采众长,我们期待你的加入,让智慧的火花碰撞交织,让知识的传递生生不息!主要是想用Emissive Decal(发光贴花)来模拟出SpotLight的Light Function效果。 原因是SpotLight的Light Function依赖于阴影,而SpotL…

APP上架大陆应用商店记录

重点自己的手机APP想要上架到国内的应用市场必须要进行ICP备案 部分平台需要电子软著信息 大部分应用商店上架需要准备好合规的隐私政策电子软著 其中包含【APP电子版权认证证书】、【计算机软件著作权登记证书】两个证书 最便捷的方式是找专业人士带跑流程,根据时长分为不同的…

搭建Redis哨兵集群并使用RedisTemplate实现读写分离

一、理论相关通过上篇博客:搭建Redis“主-从-从”模式集群并使用 RedisTemplate 实现读写分离,我们已经搭建好了Redis“主-从-从”模式集群并且实现读写分离,这里会出现几个问题:如果主库宕机了,我们就需要运行一个新主库,比如说把一个从库切换为主库,把它当成主库。这就…

唯一客服浏览器插件: 视频号直播自动回复与循环发送话术-自动化插件

唯一客服浏览器插件 gofly.v1kf.com 我们在做视频号直播的时候,会有这种自动回复咨询问题的功能唯一客服浏览器插件现在就支持,在视频号直播后台,自动化回复用户问题,以及循环发送我们的介绍话术 十年开发经验程序员,离职全心创业中,历时三年开发出的产品《唯一客服系统》…

[编程笔记] 当前上下文中不存在名称ViewBag

当前上下文中不存在名称"ViewBag",很多ViewBag、@Html.Partial、@Html.FunctionBar() 等这些地方都报波浪线了,提示不存在这个名称,但是代码是可以运行的最近在弄另外一个项目,很长一段时间没接触MVC了,Visual Studio 2022识别cshtml文件的时候,出了一点故障!…