USB之基础知识

2023-11-17

1. USB概述

        USB,Universal Serial Bus(通用串行总线),是一个外部总线标准,用于规范电脑与外部设备的连接和通讯,USB接口支持设备的即插即用和热插拔功能。

        USB接口有4个pin脚,分别为VCC、GND、Data+、Data-四个pin脚,常见的接口类型有A型、B型和C型。

2. USB标准

usb1.0   低速(Low speed)         1.5Mbit/s
usb1.0   全速(Full speed)        12Mbit/s
usb2.0   高速(High speed)        480Mbit/s
usb3.0   超高速(Super speed)     5Gbit/s

3. 总线拓扑结构

        USB主机控制器(USB Host Controller)通过根集线器(Root Hub)与其他USB设备相连。集线器也属于USB设备,通过它可以在一个USB接口上扩展出多个接口。除根集线器外,最多可以层叠5个根集线器。整个结构图是一个星型结构,一条USB总线上所有设备共享一条通往主机的数据通道,同一时刻只能有一个设备与主机通讯。 

4. USB热插拔之硬件实现

        USB集线器的每个下游端口的D+和D-上分别接了一个15K欧姆的下拉电阻到GND,在集线器的端口悬空时,这两个pin脚的电平会一直都是低电平;而USB设备端的D+或者D-上接了1.5K欧姆上拉电阻。

        当USB设备插入集线器端口时,由1.5K的上拉电阻和15K的下拉电阻分压,结果将差分数据线中的一条拉高了,集线器检测到这个状态后就会报告给USB主控制器(或者通过它上一层的集线器报告给USB主控制器)。

        USB高速设备先是被识别为全速设备,然后通过HOST和DEVICE两者之间的确认,再切换到高速模式。

4.1 Hub监测它各个端口数据线上(D+/D-)的电压

        在hub端,数据线D+和D-都有一个阻值在14.25k到24.8k的下拉电阻Rpd,而在设备端,D+(全速,高速)和D-(低速)上有一个1.5k的上拉电阻Rpu。当设备插入到hub端口时,有上拉电阻的一根数据线被拉高到幅值的90%的电压(大致是3V)。hub检测到它的一根数据线是高电平,就认为是有设备插入,并能根据是D+还是D-被拉高来判断到底是什么设备(全速/低速)插入端口。

4.2 Host检测所连接的全速设备是否是支持高速模式

        因为根据USB 2.0协议,高速(High Speed)设备在初始时是默认全速(Full Speed )状态运行,所以对于一个支持USB 2.0的高速hub,当它发现它的端口连接的是一个全速设备时,会进行高速检测,看看目前这个设备是否还支持高速传输,如果是,那就切到高速信号模式,否则就一直在全速状态下工作。

        同样的,从设备的角度来看,如果是一个高速设备,在刚连接bub或上电时只能用全速信号模式运行(根据USB 2.0协议,高速设备必须向下兼容USB 1.1的全速模式)。随后hub会进行高速检测,之后这个设备才会切换到高速模式下工作。假如所连接的hub不支持USB 2.0,即不是高速hub,不能进行高速检测,设备将一直以全速工作。

5. 高速设备识别

        USB全速/低速识别相当简单,但USB2.0,USB1.x就一对数据线,不能像全速/低速那样仅依靠数据线上拉电阻位置就能识别USB第三种速度:高速。因此对于高速设备的识别就显得稍微复杂些。

  高速设备初始是以一个全速设备的身份出现的,即和全速设备一样,D+线上有一个1.5k的上拉电阻。USB2.0的hub把它当作一个全速设备,之后,hub和设备通过一系列握手信号确认双方的身份。在这里对速度的检测是双向的,比如高速的hub需要检测所挂上来的设备是高速、全速还是低速,高速的设备需要检测所连上的hub是USB2.0的还是1.x的,如果是前者,就进行一系列动作切到高速模式工作,如果是后者,就以全速模式工作。

        下图展示了一个高速设备连到USB2.0 hub上的情形:

         hub检测到有设备插入/上电时,向主机通报,主机发送Set_Port_Feature请求让hub复位新插入的设备。设备复位操作是hub通过驱动数据线到复位状态SE0(Single-ended 0,即D+和D-全为低电平),并持续至少10ms。

        高速设备看到复位信号后,通过内部的电流源向D-线持续灌大小为17.78mA电流。因为此时高速设备的1.5k上拉电阻还未撤销,在hub端,全速/低速驱动器形成一个阻抗为45欧姆(Ohm)的终端电阻,2电阻并联后仍是45欧姆左右的阻抗,所以在hub端看到一个约800mV的电压(45欧姆*17.78mA),这就是Chirp K信号。Chirp K信号的持续时间是1ms~7ms。

        在hub端,虽然下达了复位信号,并一直驱动着SE0,但USB2.0的高速接收器一直在检测Chirp K信号,如果没有Chirp K信号看到,就继续复位操作,直到复位结束,之后就在全速模式下操作。如果只是一个全速的hub,不支持高速操作,那么该hub不理会设备发送的Chirp K信号,之后设备也不会切换到高速模式。

        设备发送的Chirp K信号结束后100us内,hub必须开始回复一连串的KJKJKJ....序列,向设备表明这是一个USB2.0的hub。这里的KJ序列是连续的,中间不能间断,而且每个K或J的持续时间在40us~60us之间。KJ序列停止后的100~500us内结束复位操作。hub发送Chirp KJ序列的方式和设备一样,通过电流源向差分数据线交替灌17.78mA的电流实现。

        再回到设备端来。设备检测到6个hub发出的Chirp 信号后(3对KJ序列),它必须在500us内切换到高速模式。切换动作有:

1. 断开1.5k的上拉电阻。
2. 连接D+/D-上的高速终端电阻(high-speed termination),实际上就是全速/低速差分驱动器。
3. 进入默认的高速状态。

        执行1,2两步后,USB信号线上看到的现象就发生变化了:hub发送出来的Chirp KJ序列幅值降到了原先的一半,400mV。这是因为设备端挂载新的终端电阻后,配上原先hub端的终端电阻,并联后的阻抗是22.5欧姆。400mV就是由17.78mA*22.5Ohm得来。以后高速操作的信号幅值就是400mV而不像全速/低速那样的3V。

        至此,高速设备与USB2.0 hub握手完毕,进行后续的480Mbps高速信号通信。

6. USB Core

        USB Core这个模块是纯软件部分,并不代表一个设备,是独立于硬件的协议栈,它是所有USB设备赖以生存的模块,即USB子系统的核心。代码位于kernel/drivers/usb/core目录下。

7. 拓展

        USB驱动本身是很复杂的,下面博客有详细介绍,以后有需要可以再研究

https://blog.csdn.net/aaronychen/category_430182.html

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

USB之基础知识 的相关文章

  • USB 传输数据

    我正在尝试通过 USB 发送和接收数据 我的设备 Acer Iconia A500 拥有连接到设备所需的一切 一切都很好并且工作正常 但是当我尝试发送和接收数据时 它的行为并不像预期的 这是我的代码 for this is the main
  • 如何在 OSX Catalina (10.15) 中使用 Wireshark 捕获 USB 流量

    我正在尝试让 Wireshark USB 捕获工作 显然 Catalina 之前的技巧就是调出界面 以便 Wireshark 可以看到它 https forums developer apple com thread 95380 https
  • 通过 USB 记忆棒携带和操作整个开发盒。可行的?

    最近我一直在考虑投资一个有价值的 USB 笔式驱动器 类似于 并在虚拟机上安装操作系统并开始在其上进行开发 我的想法是 我希望能够携带我的开 发箱 成为一名Windows 发行版用于 Net 开发和Linux发行版像 RoR Perl 之类
  • 在 Mac 上通过 USB 访问 iOS 设备

    我有一个移动应用程序需要将文件传输到数据库 然而 其规范之一是 如果用户没有设置无线网络 则应该能够将其插入 Mac 并将文件传输到数据库 然而 我遇到的问题是如何将上述文件从 iPad 上通过 USB 传输到计算机上 上周我研究了各种解决
  • 使用 adb 连接到 LG 手机时出现问题 (Mac OS X 10.7.5)

    当我跑步时adb devices没有设备显示为已连接 我的设备是运行 4 4 2 的 LG Optimus Exceed 2 周围有很多这样的帖子 所以这就是我所做的 我正在使用电话附带的数据线 它会充电并尝试同步照片 因此这不是问题 切换
  • 如何枚举 USB 设备*并*对其进行读/写?

    我需要与一个自定义 USB 设备进行通信 它没有特定的驱动程序 该设备不显示为 dev tty I 发现 http www signal11 us oss udev 我该如何使用libudev枚举 USB 设备 假设我设法获得相应的stru
  • 使用Python直接向USB发送信号

    如何使用 Python 将 USB 端口连接设置为高或低 这可用于定制 USB 设备 例如 假设我有一个 LED 连接到 USB 端口 数据线 现在通过代码我想闪烁它或控制它 现在 这可以通过使用任何微控制器 Arduino Raspber
  • Android 版 usbmon

    我想分析我的设备的 USB 通信 SGS4 我到处都看到需要配置 usbmon 并将其编译到内核中 Afaik 这个模块没有内置在android linux系统中 我在编译内核方面没有太多经验 但如果有必要 我会这样做 您能说出这样做的步骤
  • 在 Linux (libusb-1.0) 上访问 USB 设备?

    我正在编写一个小程序 使用 Linux 上的 libusb 1 0 与特定 USB HID 产品 由供应商和产品 ID 标识 进行通信 现在 我必须以 root 身份运行该程序 因为 libusb 需要对 USB 设备节点的写访问权限 有没
  • LibUsb 声明接口访问被拒绝 Java

    我希望能够从 USB 计步器读取数据 我正在 Java 中尝试此操作 并且使用 LibUsb 和 Usb4Java 库 我似乎无法认领 USB 管道或类似的东西 我正在使用的代码 final Context context new Cont
  • STM32 传输结束时,循环 DMA 外设到存储器的行为如何?

    我想问一下 在以下情况下 STM32 中的 DMA SPI rx 会如何表现 我有一个指定的 例如 96 字节数组 名为 A 用于存储从 SPI 接收到的数据 我打开循环 SPI DMA 它对每个字节进行操作 配置为 96 字节 是否有可能
  • 获取已连接 USB 设备的端口名称

    当USB设备连接到计算机时 如何使用C 代码获取它所连接的端口名称 我找到了很多方法来查找 USB 何时连接 断开 驱动器号 路径 设备 ID 等 但没有找到任何明确的示例来说明如何知道它连接到哪个端口 我看到了一种可能的解释 但这涉及很多
  • Android 两次请求 USB 许可

    我有一个运行 Android 4 0 4 的开发板 并将其用作 USB 配件 当我关闭板上的应用程序然后通过 USB 插入 Android 手机时 板会提示 连接此 USB 设备时打开 AppName 当我触摸 确定 时 应用程序启动并再次
  • Python:获取USB闪存驱动器设备的名称[windows]

    我正在尝试编写一个小程序 它将能够读取有关 REMOVEABLE DEVICE USB 的一些信息 我试过了pyusb https github com walac pyusb但我无法提取我需要的数据 我想从系统中读取 USB 设备的名称
  • 我的 Android 设备需要安装哪个驱动程序才能运行我的应用程序?

    我购买了 intex mobile 来在真实设备中测试我的 Android 应用程序 然而 该设备不存在于 OEM USB 驱动程序列表中 android 提供的设备列表中 我检查了 intex 官方网站 但不确定到底需要安装哪个驱动程序
  • 虚拟USB设备的安装与仿真

    我已经读过创建虚拟USB设备 https stackoverflow com questions 5016363 creating a virtual usb device and 虚拟USB设备 https stackoverflow c
  • 通过 USB 将原始文本发送到打印机

    我正在尝试将 ZPL 命令发送到 Zebra ZT230 打印机 打印机和驱动程序已安装 打印机端口为 USB003 PC 通过 Zebra 打印机设置实用程序或 ZebraDesign 与打印机完美通信 我尝试了以下代码 Private
  • Linux中根据USB VID:PID获取设备路径

    如果我插入一个设备 比如说 dev ttyUSB0我想知道号码0基于其 VID PID 通过lsusb 我怎样才能在 C Linux 中做到这一点 我有这个代码来查找一台打印机设备 如果有帮助的话 int printer open void
  • 未找到 Chrome 应用 USB DigitalPersona 指纹识别器

    我正在尝试开发 Google Chrome 应用程序 或扩展程序 不确定 以在 Windows 上使用 DigitalPersona 指纹识别器 下列的 https developer chrome com apps usb https d
  • cdc_acm:无法设置 dtr/rts - 无法与 USB cdc 设备通信

    我试图使用 pic24fj128gb206 枚举 usb cdc 设备 设备似乎已正确枚举 但是当我将设备连接到 Linux PC 时 我从内核收到以下警告消息 cdc acm 1 8 1 6 7 1 0 failed to set dtr

随机推荐

  • [Error] 'else' without a previous 'if'

    使用if语句这样写 DevC 会报错 if语句后面如果有两条语句或者更多 要加上大括号 使之成为语句块 这样改之后 就可以正常编译运行
  • .NET发送请求(get/post/http/https),携带json数据,接收json数据

    C 发送https请求有一点要注意 ServicePointManager ServerCertificateValidationCallback new RemoteCertificateValidationCallback CheckV
  • C++面向对象特性之继承

    一 继承的概念 继承是一种机制 目的是实现代码复用的同时减少重复代码量 它允许程序员在保持原有类特性的基础上进行功能的拓展 这样产生的新类叫做派生类 被继承的类叫做基类 下面可以看一个实例 class Animal int age clas
  • 遇见未来

    互联网及其延伸 正在导向我们走向一个新的时代 软件技术在新一轮革命技术中毫无疑问是核心竞争力之一 C 语言发明人Biarne Stroustrup说 人类文明运行在软件之上 也突出了软件技术的重要地位 什么是软件定义 软件定义在企业的数据中
  • 利用ESP定律的upx脱壳实践

    背景 除了命令行upx d脱壳 还有手动脱壳 ESP定律的本质是堆栈平衡 又称堆栈平衡定律 是应用频率最高的脱壳方法之一 脱壳的目的就是找到真正的OEP 源文件的EP代码 方法 从pushad到popad是一段解压缩代码 解压UPX壳 这段
  • C++数组越界访问测试

    对int nums 10 进行数组越界测试 文件test cpp 第一次测试 include
  • MySQL实战45讲

    目录 前言 一 连接器 查询缓存 分析器 词法分析 语法分析 优化器 执行器 二 redo log bin log 三 读未提交 read uncommitted 读提交 read committed 可重复读 repeatable rea
  • linux 报错:telnet Connection closed by foreign host

    0 美图 1 背景 链接kudu 报错 telnet samba xx com 7051 Trying 172 xx1 xx 33 Connected to samba example com Escape character is Con
  • java 本地图片压缩 转base64并限制文件大小

    本地图片转base64并限制文件大小 param imagePath 图片全路径 param sizeLimit 大小 整数 限制的大小 KB 1024 return 返回值为0 imageurl为空 返回值为1 imageurl路径不可访
  • 如何更改鼠标右键菜单(转载)

    复制下面的信息到记事本中 然后另存为 reg格式的文件 Windows Registry Editor Version 5 00 HKEY CLASSES ROOT doc Word Document 8 Content Type appl
  • React技巧1(状态组件与无状态组件的使用)

    本教程总共5篇 每日更新一篇 请关注我们 你可以进入历史消息查看以往文章 也敬请期待我们的新文章 1 React 技巧1 状态组件与无状态组件的使用 2018 01 04 2 React 技巧2 避免无意义的父节点 2018 01 05 3
  • Qt4软键盘源码分享

    简述 基于Qt4的软键盘 支持中文 字母 数字 特殊字符输入 开发环境为qt4 8 7 msvc2008 提供了 软键盘动态库源码 和相应的 demo源码 自己编译时记得修改代码中qss 中文字库的路径 源码路径 https downloa
  • IDEA(最新版)导入Myeclipse/eclipse的web项目并运行(全) Windows或者Mac系统

    一 前言 最近在做毕业设计 没想到现在的大学中还是使用的Myeclipse比较多 这个工具逐渐被IDEA工具所代替 因为IDEA的性能和使用更加优秀 或者我们在工作中遇到Myeclipse项目导入IDEA中的情形 怎么将Myeclipse开
  • 西瓜小说(安卓)

    软件名叫西瓜阅读 是吾爱上的大佬根据开源阅读APP魔改之后的版本 内置了超多书源 大家下载安装直接使用 无需再进行任何其他额外的一些操作或者设置 作者魔改之后还给软件添加了推荐 榜单 书架之类的一些很不错的界面 大家都知道 阅读APP最大的
  • SpringCluod深入教程

    1 Nacos配置管理 Nacos除了可以做注册中心 同样可以做配置管理来使用 1 1 统一配置管理 当微服务部署的实例越来越多 达到数十 数百时 逐个修改微服务配置就会让人抓狂 而且很容易出错 我们需要一种统一配置管理方案 可以集中管理所
  • DeFi终极指南【以太坊去中心化金融】

    DeFi De centralized Fi nance 即去中心化金融 是2019年区块链应用发展最迅猛的一个领域 在以太坊区块链上那些最成功的DApp 例如MakerDAO DAI Compound 0x以及下面我们要介绍的那些 其目标
  • 关于matlab中矩阵取值的方法

    在matlab中 取出矩阵中某一个值的方法如下 1 对于二维数组 a i j 表示取出二维数组a的第 i 行 第 j 列的数据 a j 表示取出二维数组a的第 j 列的所有数据 a i 表示取出二维数组a的第 i 行的所有数据 2 多维数组
  • Aviator 表达式的使用

    1 使用Aviator 需要导入包
  • 计算机视觉人体骨骼点动作识别-1.训练自己的关键点检测模型

    人体关键点检测算法 关键点并不特指人体骨骼关键点 还有人脸关键点 物体的关键点 其中人体的关键点 也叫作pose Estimation 是最热门 也是最有难度 应用最广的 应用可以包括 行为识别 人机交互 智能家居 虚拟现实 具体细分下来可
  • USB之基础知识

    1 USB概述 USB Universal Serial Bus 通用串行总线 是一个外部总线标准 用于规范电脑与外部设备的连接和通讯 USB接口支持设备的即插即用和热插拔功能 USB接口有4个pin脚 分别为VCC GND Data Da