USB子系统学习(一)USB电气信号

文章目录

  • 1、声明
  • 2、USB协议概述
  • 3、USB电气信号
    • 3.1、USB基础概念
      • 3.1.1、低速/全速信号电平
      • 3.1.2、高速信号电平
    • 3.2、学习目标
    • 3.3、设备断开与连接
      • 3.3.1、连接
      • 3.3.2、断开
    • 3.4、复位
    • 3.5、设备速率识别
      • 3.5.1、低速/全速
      • 3.5.2、高速
    • 3.6、数据信号
      • 3.6.1、低速/全速的SOP和EOP
      • 3.6.2、高速的SOP和EOP
      • 3.6.3、NRZI与位填充

1、声明

本文是在学习韦东山《驱动大全》USB子系统时,为梳理知识点和自己回看而记录,全部内容高度复制粘贴。

韦老师的《驱动大全》:商品详情

其对应的讲义资料:https://e.coding.net/weidongshan/linux/doc_and_source_for_drivers.git

2、USB协议概述

USB(Universal Serial Bus)即通用串行总线,是一种广泛应用于计算机和外部设备之间的通信协议,旨在简化设备之间的连接和数据传输。它允许各种设备(如键盘、鼠标、打印机、存储设备、摄像头等)通过统一的接口与计算机进行连接和通信。

3、USB电气信号

3.1、USB基础概念

  1. USB有四条线,分别是5V、D+、D-、GND。
  2. USB 2.0协议支持3种速率:低速(Low Speed,1.5Mbps)、全速(Full Speed, 12Mbps)、高速(High Speed, 480Mbps)。
  3. 一个USB设备,可能兼容低速、全速,可能兼容全速、高速,但是不会同时兼容低速、高速。

3.1.1、低速/全速信号电平

这里列出几个主要的名词:

  • Differential “1”和 Differential “0”
  • Data J state 和 Data K state
  • Idle state

3.1.2、高速信号电平

这里列出几个主要的名词:

  • Differential “1”和 Differential “0”
  • Data J state 和 Data K state
  • Idle state
  • Chirp J state 和 Chirp K state

3.2、学习目标

下图是USB设备状态切换图,我们将按顺序理解红框里的内容:

Attached -> Powered -> Default -> Address -> Configured:

  • Attached -> Powered:Hub监测到设备插入后,Hub会给设备上电。【在这个阶段,主要学习USB设备的连接与断开】
  • Powered -> Default:设备上电后,Hub会向设备发出Reset信号,让设备工作在默认状态或者与设备协商是否工作于高速模式。【在这个阶段,主要学习USB Hub的复位信号】
  • Default -> Address:Hub会为设备分配出一个地址。【在这个阶段,主要学习USB Hub和USB设备之间是如何传输数据的】
  • Address -> Configured

3.3、设备断开与连接

USB Hub如何监测设备的连接与断开呢?

3.3.1、连接

Hub端口的D+、D-都有15K的下拉电阻,平时为低电平。

高速设备,全速设备内部的D+有1.5K的上拉电阻。低速设备内部的D-有1.5K的上拉电阻。

连接到Hub后会导致Hub的D+或D-电平变化,Hub根据变化的引脚分辨接进来的是高速/全速设备还是低速设备。(那Hub如何区分高速设备还是全速设备呢?这里先不讨论。)

高速设备、全速设备连接时,Hub端口的D+引脚的电平由低变高:

低速设备连接时,Hub端口的D-引脚的电平由低变高:

3.3.2、断开

前面说到,当低速设备、全速设备接到Hub时,会导致Hub的D-或D+引脚电平由低变高。所以反过来,当低速设备,全速设备拔出时,D-或D+引脚电平由高变低:

对于高速设备,它先作为全速设备被识别出来,然后再被识别为高速设备。工作于高速模式时,D+的上拉电阻是断开的,所以对于工作于高速模式的USB设备,无法通过D+的引脚电平变化监测到它已经断开。

工作于高速模式的设备,Hub和USB设备的D+、D-引脚各有45欧姆的下拉电阻,用来消除反射信号:

当高速设备拔出后,Hub发出信号,得到的反射信号无法衰减,Hub监测到这些信号后就知道高速设备已经断开,内部电路图如下:

3.4、复位

从状态切换图上看,一个USB设备连接后,它将会被供电,然后被复位。当软件出错时,我们也可以发出复位信号重新驱动设备。那么,USB Hub端口或USB控制器端口如何发出复位信号?发出SE0信号,并维持至少10ms。USB设备看到Reset信号后,需要准备接收"SetAddress()“请求;如果它不能回应这个请求,就是"不能识别的设备”。

3.5、设备速率识别

3.5.1、低速/全速

Hub端口的D+、D-都有15K的下拉电阻,平时为低电平。全速设备内部的D+有1.5K的上拉电阻,低速设备内部的D-有1.5K的上拉电阻,连接到Hub后会导致Hub的D+或D-电平变化,Hub根据变化的引脚分辨接进来的是全速设备还是低速设备。

3.5.2、高速

高速设备必定兼容全速模式,所以高速设备内部D+也有1.5K的上拉电阻,只不过这个电阻是可以断开的:工作于高速模式时要断开它。

高速设备首先作为全速设备被识别出来,然后Hub如何确定它是否支持高速模式?

Hub端口如何监测一个新插入的USB设备能否工作于高速模式?流程如下:

  • 对于低速设备,Hub端口不会监测它能否工作于高速模式。低速设备不能兼容高速模式。
  • Hub端口发出SE0信号,这就是复位信号。
  • USB设备监测到SE0信号后,会发出"a high-speed detection handshake"信号表示自己能支持高速模式,这可以细分为以下3种情景:
    • 如果USB设备原来处于"suspend"状态,它检测到SE0信号后,就发出"a high-speed detection handshake"信号。
    • 如果USB设备原来处于"non-suspend"状态,并且处于全速模式,它检测到SE0信号后,就发出"a high-speed detection handshake"信号。这个情景,就是一个设备刚插到Hub端口时的情况,它一开始工作于全速模式。
    • 如果USB设备原来处于"non-suspend"状态,并且处于高速模式,它会切换回到全速模式(重新连接D+的上拉电阻),然后发出"a high-speed detection handshake"信号。

“a high-speed detection handshake"信号,就是"高速设备监测握手信号”,既然是握手信号,自然是有来有回:

  • USB设备维持D+的上拉电阻,发出"Chirp K "信号,表示自己能支持高速模式。
  • 如果Hub没监测到"Chirp K "信号,它就知道这个设备不支持高速模式。
  • 如果Hub监测到"Chirp K “信号后,如果Hub能支持高速模式,就发出一系列的"Chirp K”、“Chirp J"信号,这是用来通知USB设备:Hub也能支持高速模式。发出一系列的"Chirp K”、"Chirp J"信号后,Hub继续维持SE0信号直到10ms。
  • USB设备发出"Chirp K “信号后,就等待Hub回应一系列的"Chirp K”、"Chirp J"信号:
    • 收到一系列的"Chirp K"、"Chirp J"信号:USB设备断开D+的上拉电阻,使能高速模式。
    • 没有收到一系列的"Chirp K"、"Chirp J"信号:USB设备转入全速模式。

3.6、数据信号

  • SOP:起始信号
  • SYNC:同步信号
  • Packet Content:数据包
  • EOP:结束信号

3.6.1、低速/全速的SOP和EOP

SOP:Start Of Packet,Hub驱动D+、D-这两条线路从Idle状态变为K状态。SOP中的K状态就是SYNC信号的第1位数据,SYNC格式为3对KJ外加2个K。

EOP:End Of Packet,由数据的发送方发出EOP,数据发送方驱动D+、D-这两条线路,先设为SE0状态并维持2位时间,再设置为J状态并维持1位时间,最后D+、D-变为高阻状态,这时由线路的上下拉电阻使得总线进入Idle状态。

从下面低速/全速信号电平的图中可以看到,Idle状态就是J状态。上面说SOP信号从Idle状态变为K状态其实就是从J状态切换到K状态。因为这里讨论的模式包括了低速和全速模式,为了统一描述,就用Idle状态概括了低速和高速模式中两个不同的J状态,低速模式的J状态对应Differential 0电平,高速模式的J状态对应Differential 1电平:

3.6.2、高速的SOP和EOP

高速的EOP比较复杂,作为软件开发人员无需掌握。

高速模式中,Idle状态为:D+、D-接地。SOP格式为:从Idle状态切换为K状态。SOP中的K状态就是SYNC信号的第1位数据。

高速模式中的SYNC格式为:KJKJKJKJ KJKJKJKJ KJKJKJKJ KJKJKJKK,即15对KJ,外加2个K。

3.6.3、NRZI与位填充

现在抛出一个问题。USB协议中,即没有时钟线,也不用事先约定好波特率,那是如何有效传输数据的呢?回答是靠 SYNC 信号来确保数据传输的同步,也就是接收端会以SYNC信号为基准来同步后续的数据接收。

那又是如何靠SYNC信号来同步的数据的?到这不得不介绍NRZI编码。USB 是采用 NRZI 编码来传输数据的,电平翻转代表逻辑 0,电平不变代表逻辑 1。

使用NRZI,发送端可以很巧妙地把"时钟频率"告诉接收端:只要传输连续的数据0即可。在下图中,低速/全速协议中"Sync Pattern"的原始数据是"00000001",接收端从前面的7个0波形就可以算出"时钟频率"。

使用NRZI时,如果传输的数据总是"1",会导致波形维持不变。如果电平长时间维持不变,比如传输100位1时,如果接收方稍有偏差,就可能认为接收到了99位1、101位1。而USB中采用了Bit-Stuffing位填充处理,即在连续发送6个1后面会插入1个0,强制翻转发送信号,从而让接收方调整频率,同步接收。而接收方在接收时只要接收到连续的6个1后,直接将后面的0删除即可恢复数据的原貌。

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

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

相关文章

【机器学习篇】从新手探寻到算法初窥:数据智慧的开启之门

文章目录 【机器学习篇】从新手探寻到算法初窥:数据智慧的开启之门前言一、什么是机器学习?二、机器学习的基本类型1. 监督学习(Supervised Learning)2. 无监督学习(Unsupervised Learning)3. 半监督学习&a…

SQL-Server链接服务器访问Oracle数据

SQL Server 链接服务器访问 Oracle 离线安装 .NET Framework 3.5 方法一:使用 NetFx3.cab 文件 下载 NetFx3.cab 文件,并将其放置在 Windows 10 系统盘的 C:Windows 文件夹中。 以管理员身份运行命令提示符,输入以下命令并回车: …

【C++】矩阵转置问题详解与优化

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯题目解析💯第一种实现方式:我的初始做法实现思路优缺点分析 💯第二种实现方式:我的优化做法实现思路优缺点分析 &#x1f4a…

比QT更高效的一款开源嵌入式图形工具EGT-Ensemble Graphics Toolkit

文章目录 EGT-Ensemble Graphics Toolkit介绍EGT具备非常高的图形渲染效率EGT采用了非常优秀的开源2D图形处理引擎-Cairo开源2D图形处理引擎Cairo的优势Cairo 2D图像引擎的性能Cairo 2D图像引擎的实际应用案例彩蛋 - 开源EDA软件KiCAD也在使用Cairo EGT高效的秘诀还有哪些Cairo…

信息系统管理工程师教程第2版(2024年最新版)

信息系统管理工程师教程第2版 目录 第 1 章 信息化发展 第 2 章 信息技术发展 第 3 章 信息系统架构 第 4 章 信息系统治理 第 5 章 信息技术服务管理 第 6 章 软件开发过程管理 第 7 章 系统集成实施管理 第 8 章 信息系统运维管理 第 9 章 云服务及其运营…

Science Robotics让软机器人“活”得更久的3D打印!

软机器人硬件在医疗、探索无结构环境等领域有广泛应用,但其生命周期有限,导致资源浪费和可持续性差。软机器人结合软硬组件,复杂组装和拆卸流程使其难以维修和升级。因此,如何延长软机器人的生命周期并提高其可持续性成为亟待解决…

通过Dockerfile来实现项目可以指定读取不同环境的yml包

通过Dockerfile来实现项目可以指定读取不同环境的yml包 1. 挂载目录2. DockerFile3. 运行脚本deploy.sh4. 运行查看日志进入容器 5. 接口测试修改application-dev.yml 6. 优化Dockerfile7. 部分参数解释8. 优化不同环境下的日志也不同调整 Dockerfile修改部署脚本 deploy.sh重新…

AutoSar架构学习笔记

1.AUTOSAR(Automotive Open System Architecture,汽车开放系统架构)是一个针对汽车行业的软件架构标准,旨在提升汽车电子系统的模块化、可扩展性、可重用性和互操作性。AUTOSAR的目标是为汽车电子控制单元(ECU&#xf…

超越YOLO11!DEIM:先进的实时DETR目标检测

DEIM: DETR with Improved Matching for Fast Convergence arXiv: https://arxiv.org/abs/2412.04234 Project webpage:https://www.shihuahuang.cn/DEIM/ GitHub:https://github.com/ShihuaHuang95/DEIM 1 背景:DETR目标检测框架 目标检…

深入理解 Java 接口的回调机制

前言 回调是一种非常重要的编程技术,它广泛应用于事件驱动的编程、异步任务和框架设计中。在 Java 中,回调机制通常通过 接口 来实现。本篇博客将详细解析 Java 接口的回调原理、实现方式,以及实际开发中的应用场景。 泪崩了,期末…

二、用例图

二、用例图 (一)、用例图的基本概念 1、用例图的定义: 用例图是表示一个系统中用例与参与者关系之间的图。它描述了系统中相关的用户和系统对不同用户提供的功能和服务。 用例图相当于从用户的视角来描述和建模整个系统,分析系统的功能与…

【软考网工笔记】计算机基础理论与安全——网络安全

病毒 Melissa 宏病毒 1. 是一种快速传播的能够感染那些使用MS Word 97 和MS Office 2000 的计算机宏病毒。 2. 前面有**Macro** 表示这是宏病毒; 3. 宏病毒可以感染后缀为.xls的文件;Worm 蠕虫病毒 1. 通常是通过网络或者系统漏洞进行传播。 2. 利用信…

STM32 拓展 低功耗案例3:待机模式 (register)

需求描述 寄存器操作进入待机模式。待机模式的唤醒方式比较有限。我们这次使用WKUP引脚的上升沿唤醒。PA0就是WKUP引脚。 当然PA0仍然需要工作在下拉输入模式,只有这样当按键按下的时候才会有一个上升沿。 由于我们电路中PA0已经连接了LED1,所以要产生…

windows中硬件加速gpu计划开启cpu的使用率居高不下

1.加速gpu计划开启在任务管理器的gpu选项中看不到cuda选项,这给我们进行深度学习训练和推理带来很大影响。 2.开启硬件加速CPU的占用率明显增高,特别用GPU进行实时视频流解码时就不会分配给GPU解码,造成cpu占用居高不下。不利于深度学习训练…

【Go】运行自己的第一个Go程序

运行自己的第一个Go程序 一、Go语言的安装Go环境安装查看是否安装成功配置GOPROXY(代理) 二、Goland安装三、Goland破解四、新建项目 开一篇专栏记录学习Go的过程,一门新语言从hello world开始,这篇文章详细讲解Go语言环境搭建及hello world实现 一、Go语…

提升汽车金融租赁系统的效率与风险管理策略探讨

内容概要 在汽车金融租赁系统这个复杂的生态中,提升整体效率是每个企业都渴望达成的目标。首先,优化业务流程是实现高效运行的基础。通过分析目前的流程,找出冗余环节并进行简化,能够帮助企业缩短审批时间,提高客户满…

计算机网络 (25)IPV6

前言 IPv6,全称为“互联网协议第6版”(Internet Protocol Version 6),是由互联网工程任务组(IETF)设计的用于替代IPv4的下一代IP协议。 一、产生背景 IPv4,即互联网协议第4版,是现行…

嵌入式系统(将软件嵌入到硬件里面)

目录 Linux起源 查看操作系统的版本 查看内核的版本: 内核系统架构 系统关机或重启命令 关机: 重启: linux下的软件安装 两种软件包管理机制: deb软件包分为两种: 软件包的管理工具:dpkg apt 1…

Conda 安装 Jupyter Notebook

文章目录 1. 安装 Conda下载与安装步骤: 2. 创建虚拟环境3. 安装 Jupyter Notebook4. 启动 Jupyter Notebook5. 安装扩展功能(可选)6. 更新与维护7. 总结 Jupyter Notebook 是一款非常流行的交互式开发工具,尤其适合数据科学、机器…

web实操9——session

概念 数据保存在服务器HttpSession对象里。 session也是域对象,有setAttribute和getAttribute方法 快速入门 代码 获取session和塞入数据: 获取session获取数据: 请求存储: 请求获取: 数据正常打印&#xff1a…