USB究竟是什么?看完这篇文章我就明白了!

时间:2022-08-26 22:57:18

在早期,USB接口的出现似乎仅仅是要解决一些简单外设诸如鼠标、键盘之类的设备与电脑的连接问题,很显然,这些外设所产生的数据量是极低的,所以,USB规范所定义的数据速率是1.5Mbps,数据还是双向分时传输的,PC主机采用轮询的方式和各个外设进行通讯,只有被点到名的外设才能进入传输状态。这是USB 1.0的规格,它成文于 1996年。

USB的面世

提速以后的USB 1.1规范发布于 1998年,其数据传输速率为12Mbps,我在这个时候还在一家从事有线电视监控系统和路桥收费系统的香港公司工作。有一次,被我们称为谭董事的业务负责人带了几位客人来公司参观,参观的重点是通过电话线传输视频信号,客人能在电脑显示屏上看到的信号以今天的标准来看那是惨不忍睹的,但是客人却对此表示满意,因为他们知道那已经是最好的效果了。(这段话中提到的谭董事真的姓谭,也是公司董事,是个业务高手,但他的特长并不在电子领域,而是一位财经分析师,是证券投资顾问,是我很喜欢的一位公司领导。)

2000年,USB 2.0发布,数据传输速率被提升至480Mbps。也就是在这一年的8月28日,我第三次踏上深圳的土地,进入一家芯片分销商工作。我在这份工作中最先接触到的应用是DVD播放器,然后是数码相机和采用USB接口的摄像头,这应该是我最早接触到的USB外设了。在这个时期,我们的客户所生产的相机,30万像素的就算是好产品了,摄像头则只有10万像素,可在屏幕上现出一个小小的图像框,用今天的标准来看就是不清不楚的,但这已经是高技术了,大家玩得不亦乐乎。这个时期的数码相机所拍摄的数码相片还不是存储在像今日的存储卡所采用的闪存里的,它们直接被存储在一掉电就会丢失数据的存储器中,所以需要在拍照以后尽快通过USB接口将相片导入电脑里,很显然,这样的设计是有很大风险的,但也没有办法,行业的技术发展就处于这个状态。在我后来支持的一个客户那里曾经听来一个故事,他们曾经生产的一批数码相机就有客户遇到了丢数据问题,这个问题导致他们被消费者告上了法庭,法庭认为他们的产品导致客户丢掉了自己的记忆,因而应当为消费者的记忆丢失负责。记忆的价值到底有多大呢?这很显然是一个无法计量的数据,因为如此,他们付出了一笔巨大的费用,还不得不将这些产品全部回收,给公司带来了巨大的损失。

关于USB的知识普及

USB是通用串行总线的简称,除了完成通讯功能,它还能够传输电源为外设供电。为此,它采用了4根导线的电缆,还制订了A型和B型的连接器接口。

USB究竟是什么?看完这篇文章我就明白了!

这就是最初的接口的外形图。其中的A型连接器只是出现在PC主机或是集线器一侧,B型连接器只出现在外设一侧。之所以要使用两种不同的连接器,是为了避免插接错误。需要说明的是,主机端的端口被命名为下行端口,因为从它这里流出来的数据总是向下进入外设中,与此相应的就是上行端口了,它处于外设上。通常,一个外设只会有一个上行端口,但一台主机则可以有多个下行端口。集线器作为承上启下的设备,它必须具有一个上行端口,下行端口则可以有一个或多个。

USB究竟是什么?看完这篇文章我就明白了!

这是标准的USB电缆的样貌,它的两端都有插头,可分别插入主机和外设的插座上将两者连接起来。有一些外设是自带电缆的,这时候就只有一端有插头了,像我们常用的USB鼠标就是这样的。

细心的读者和使用者应该可以看到电缆的插头上都有USB的标识符,这个标识符的样貌是有严格规定的,它以浮雕的形式呈现在一块凹陷下去的坑里。这个符号被要求放在插头的顶部一侧,与之相应的是拥有USB插座的主机和外设也要印上此标志,在插接时只要将插头上的这一标识符和机器上的标识符对上就可以顺利地插入了。关于这一点,我想是规范制订者的一片好心,但我发现我从未利用过这一标识,这是因为我不知道,我相信大多数用户都是不知道的,否则又怎会有远高于50%的插错几率呢?

要在USB电缆中传递数据和电源,这两者的传输线自然是应该不同的,因为它们的特性并不相同。数据的传输使用了不归零反相(NRZI)编码方法,此编码方法中已经含有时钟信号,因而利用信号本身就可以提取出时钟信号实现收发之间的同步。相应的电缆内部结构和编码方法示意如下图所示:

USB究竟是什么?看完这篇文章我就明白了!

USB究竟是什么?看完这篇文章我就明白了!

为了能将尽可能多的外设纳入USB接口中来使用,USB规范定义了如下图所示的多达7层的可级联星形拓扑结构:

USB究竟是什么?看完这篇文章我就明白了!

依靠这种以集线器为中心的可以级联扩展的拓扑,一个USB主机可以连接最多达127个外设。在规范中,这种外设也可被称为Function。实际上,一台设备中是可以有多个Function的,例如你可以把键盘和鼠标整合在一台机器中,它们在总线上就表现为两个Function,当主机上分别安装了这两种Function的驱动程序时,作为使用者是不用去区分它们的。

依我的看法,USB这种既供电又传数据,还能支持多外设同时使用的做法实在是太方便了,这就导致大量的外设要往这一接口上靠,然后就会出现数据传输速率不足的问题,这就逼得规范需要被不断修改以提升其应用的性能,这又会促进更多的应用往上面靠,从而形成一个不断升级的局面。

USB 2.0是在兼容此前USB 1.X 规范的基础上于2000年推出的,除了速度的提升,我认为其变化并不大,但其对应用的影响是巨大的。在这个时期,其他的技术也在发生突飞猛进的发展,作为一个局外人,我能够感受到的是硬盘技术的发展,高速度、大容量、小体积的硬盘开始出现,于是市场上出现了移动硬盘。很显然,早期的B型接口用在像移动硬盘这样的小设备上是不太匹配的,这时候就有了小型USB接口mini-B的出现,现在我手里还有的几个移动硬盘就全是这种接口,甚至去年买的车载摄像头也还在使用这样的插座。

按照标准的设计,如果我想将数码相机里存储的照片放入移动硬盘,我需要将数码相机和移动硬盘都与电脑主机连接起来,这样才能完成相片的转移过程,而在此过程中电脑只是起到了中转的作用,可是这对一个旅行者来说实在是太费事了。怎么办?这就有了USB On-The-Go的诞生,它被简称为OTG。OTG赋予一台本来的外设以主机的功能,它就能像主机那样工作了,其他外设就可以连上去完成该外设想完成的事情而当它和一台主机连接的时候,它仍然是一台外设。所有的OTG设备都是为某些特定目的而设计的,所以,当OTG设备作为主机的面目出现时,它并不需要像PC那样拥有可以和各种外设连接的能力,因而其设计可以是简化的,可以和其连接的外设也很有限,它们可以被列入一份目标外设清单中。

关于OTG

OTG是USB的一个扩展,它总是被设计为只有一个单独的USB插座,但使用的是同时兼容Micro-A型插头和Micro-B型插头的Micro-AB型插座,这些插头座也是USB的一项扩展。Micro-AB型插座比其他的插座多了一个ID端,其状态可以由插入的插头决定。当插入的插头是Micro-A型时,意味着该OTG设备被确定为A型设备,即它被确定为主机当插入的插头是Micro-B型时,意味着该OTG设备被确定为B型设备,即它被确定为外设。如果没有插头插入,该OTG设备的预设状态就是一台外设(假如它是自供电的)。假如应用中的B设备需要拥有主机的角色,这时候可以通过软件协议使其角色发生转变,很显然,这样的设计在将两台OTG设备连接在一起的时候是很有用的。

USB的主机是需要为连接进来的外设供电的,所以,OTG设备需要进行相对比较复杂的电源管理工作。立锜有投资成立一家名为立敏(RichNex)的公司,他们就有专门提供支持OTG应用的USB接口芯片。与标准的主机不同,用于USB OTG应用的接口芯片通常只提供最多100mA的电流输出,因为关于OTG的规范就是这样定义的。如果要供应更大的电流,就需要像我们这样的专门提供电源管理的公司来提供方案。当我写到这里的时候,回忆起多年前为那些制作移动硬盘的公司提供方案支持的经历,心中仍然是有些波澜的,因为这样的方案并不好做,而我并未见过比我所做更好的东西,可是我对好东西的渴望似乎总是存在的。

有关USB的充电电流

按照规范,USB2.0以前的接口能够提供的最大电流是500mA,而每一台电脑上居然都有USB接口,所以在USB接口被用于数据交换的同时催生了一项应用:为移动设备充电。这一发展一定是出乎USB规范制定者的初衷的,否则它们从一开始可能就不会做出那么多的限制了。例如,当USB总线处于挂起状态时(这时候数据线上没有数据进行传递,是不活动的),一台外设能够吸取的电流仅仅是2.5mA(平均值)当外设接入总线但还未完成配置以前(也没有处于挂起状态),一台外设可以吸取的电流是100mA500mA的电流是在外设完成和主机的连接以后才容许吸取的(当然也需要总线没有挂起)。可是由于USB在使用上的方便性,大量的移动设备采用了USB接口并且通过这一接口来完成供电和充电,这就导致了一个新的辅助标准的诞生:USB BC1.2。在这个标准出现以前就已经有很多公司利用USB接口来为其产品供电、充电了,而它们的充电器也利用了这一接口,所以,BC1.2中就纳入了很多特别的概念,例如DCP(专用充电端口)、SDP(标准下行端口)、CDP(充电下行端口)等等。另外,世上历来就有一些公司是喜欢自行其事的,他们会按照自己的意愿去确定自己的充电器的设计。当一台设备接入这些不同的端口或是不同的充电器时,被容许吸取的电流是不一样的,这就导致这样一个问题:设备的设计者应当如何设计自己的产品呢?他应当如何确保自己的产品在被插入这些充电端口时能够知道该吸取多大的电流呢?BC1.2就是为了解决这个问题而生的,它制订了一些方法去适应这些不同的状况,使得大家有一个共同的标准可以参照,而那些采用了这种标准的器件也可以宣称自己符合这一标准了。宣称符合这一标准的器件示例如下图所示,这款器件的型号是RT9485,是立锜的一款全新的移动电源方案,它已包含移动电源控制部分的全部功能,而且它是全智能化的,其内部集成的ARM内核容许进行*的编程设计,这样就可以根据不同的应用需求进行重新设计。作为一个实例,你将很快看到我们是如何让它支持USB Type-C接口的,有兴趣的读者可在3月份的上海慕尼黑电子展上看到实物,那将是它的处女秀。

USB究竟是什么?看完这篇文章我就明白了!

对于一个有经验的工程师来说,他/她在考虑一项设计的合理性的时候是需要在产品的全寿命周期内进行思考的。在这方面,我曾经有过一次很深刻的教训。那是在锂离子电池开始普遍应用的早期,专门用于锂离子电池充电管理的IC还是稀有产品,我不得不将多颗IC组成一个系统方案为我们的客户服务。在某一次设计的方案中,我忽略了电池没电以后的系统状态,结果造成系统无法被充电,因为这时候的充电通道无法被启动,这个问题逼得我建议客户加入一个由二极管加电阻构成的启动电路才把问题解决。由于这项产品已经进入生产阶段,对客户的影响无疑是巨大的,好在这家客户的老板是我初入行时就认识的,我们之间早已建立了很深的友谊,他在遇到难以解决的问题时都会找我提供建议和方案,我们也能够相互理解对方的困难,难题就这样被轻易地解决了,但这对我无疑是有影响的。

像我这样所遇到的问题,在BC 1.2中也被纳入了考虑范畴。当电池没电或是电量不足的时候,一个系统在受限的供电条件下很可能是无法启动的,它必须被充电至一定的程度以后才能进入正常的状态,这个时候,BC 1.2就提供了一种机制,它容许你在充入一定的电量以后再按常规来对你进行考核,从而拓宽了标准的覆盖范围。

USB的供电能力限制还曾经创造过一个巨大的市场,那就是为Nokia的手机充电的应用。这个事件的起因是Nokia的手机都依靠充电器的限流能力结合其内部采用的开关用脉冲电流为电池充电,它要求其充电器的供电电压在空载时高于5V,在限流时电压可以低到内部电池电压甚至是0V。当采用USB端口为之充电的时候,为了符合USB规范,就需要采用输入电流能够得到限制、输出电压也需要得到限制的转换器,可惜那时候没有好用的器件,我不得不采用一些特殊的设计来完成此功能,甚至为了满足客户的需要而将两颗IC封装在一起形成一个具有特定功能的器件。后来,为了实现低成本,不得不开始新IC的规划,但可惜我们的报价没有被客户接受,让另外一家供应商得到了机会。在后来的日子里,这家客户用40%的资源投入这项产品的生产中,而获得的利润却是全公司利润的70%,之所以有这么大的收获,是因为Nokia的所有这类产品都是由这家公司生产的。

就在进行这项应用开发的时候,Micro-USB接口开始进入市场,这就是我们今天看到的大部分智能手机上的接口的样子。但是,用过这类接口的人如果再用上苹果的iPhone,那就知道iPhone所使用的接口会让人感觉更好,而USB的规格也将慢慢地走上一条类似的轨道,这就是Type-C时代的来临。今天的你我,就正站在Type-C时代的入口上,而本文也是因此而生的,后续的文章将逐渐开启这一过程,敬请期待

USB究竟是什么?看完这篇文章我就明白了!的更多相关文章

  1. APP的缓存文件到底应该存在哪?看完这篇文章你应该就自己清楚了

    APP的缓存文件到底应该存在哪?看完这篇文章你应该就自己清楚了 彻底理解android中的内部存储与外部存储 存储在内部还是外部 所有的Android设备均有两个文件存储区域:"intern ...

  2. [转帖]看完这篇文章你还敢说你懂JVM吗?

    看完这篇文章你还敢说你懂JVM吗? 在一些物理内存为8g的服务器上,主要运行一个Java服务,系统内存分配如下:Java服务的JVM堆大小设置为6g,一个监控进程占用大约 600m,Linux自身使用 ...

  3. [转帖]看完这篇文章,我奶奶都懂了https的原理

    看完这篇文章,我奶奶都懂了https的原理 http://www.17coding.info/article/22 非对称算法 以及 CA证书 公钥 核心是 大的质数不一分解 还有 就是 椭圆曲线算法 ...

  4. 如果你每次面试前都要去背一篇Spring中Bean的生命周期,请看完这篇文章

    前言 当你准备去复习Spring中Bean的生命周期的时候,这个时候你开始上网找资料,很大概率会看到下面这张图: 先不论这张图上是否全面,但是就说这张图吧,你是不是背了又忘,忘了又背? 究其原因在于, ...

  5. 细心看完这篇文章,刷新对Javascript Prototype的理解

    var person={name:'ninja'}; person.prototype.sayName=function(){ return this.name; } 分析上面这段代码,看看有没有问题 ...

  6. 【转】APP的缓存文件到底应该存在哪?看完这篇文章你应该就自己清楚了

    只要是需要进行联网获取数据的APP,那么不管是版本更新,还是图片缓存,都会在本地产生缓存文件.那么,这些缓存文件到底放在什地方合适呢?系统有没有给我们提供建议的缓存位置呢?不同的缓存位置有什么不同呢? ...

  7. 看完这篇文章,我奶奶都懂了https的原理

    本文在个人技术博客同步发布,详情可猛戳 亦可扫描屏幕右方二维码关注个人公众号 Http存在的问题   上过网的朋友都知道,网络是非常不安全的.尤其是公共场所很多免费的wifi,或许只是攻击者的一个诱饵 ...

  8. Python正则表达式,看完这篇文章就够了...#华为云·寻找黑马程序员#【华为云技术分享】

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/devcloud/article/detai ...

  9. 看完这篇文章才对【GIT】有了大彻大悟的认识

    git定义:版本管理工具 历史:没有git的时候,我们修改完一个文件,要先把文件拷贝一个副本到备份文件夹中,还要建个文档来记录当前文件的信息和操作记录.当文件多的时候,人工操作起来将是个非常辛苦非常庞 ...

随机推荐

  1. 第3月第11天 vs2005调试 ace编译

    1.vs2005调试 http://blog.csdn.net/u010797208/article/details/40452797 2.macbook ace编译 小坑: 源代码clockid_t ...

  2. 一个不错的loading效果--IT蓝豹

    一个不错的loading效果 介绍:一个不错的loading加载效果,弹性收缩,效果不错,学习android动画的朋友可以下载来研究研究本例子其实由SeekBar实现,由MetaballView,Me ...

  3. TableLayout练习

    <?xml version="1.0" encoding="utf-8"?> <TableLayout xmlns:android=&quot ...

  4. 专注网格剖分 - TetGen

    提要 记得大三那一年有一门课叫做高等有限元,最后的作业就是网格剖分算法的实现,我和同学一起花了些时间做了一个Qt程序,他写算法,我写界面,最后成绩竟然出奇的拿了90多... 今天要介绍的这款软件Tet ...

  5. Linux&sol;U-Boot Git Repo

    Linux: git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git   U-Boot: git://git.denx.de/ ...

  6. Oracle预估的基数算法

    SQL> create table t as select * from dba_objects; Table created. SQL> create index idx_t on t( ...

  7. 详细比较三个 CSS 预处理器(框架):Sass、LESS 和 Stylus

    [大伽说]如何运维千台云服务器 »   CSS 预处理器技术已经非常的成熟,而且也涌现出了越来越多的 CSS 的预处理器框架.本文向你介绍使用最为普遍的三款 CSS 预处理器框架,分别是 Sass.L ...

  8. &lbrack;Netty&rsqb; - Netty入门&lpar;最简单的Netty客户端&sol;服务器程序&rpar;

    Java中的NIO是一种解决阻塞式IO问题的基本技术,但是NIO的编写对java程序员是有比较高的要求的.那么Netty就是一种简化操作的一个成熟的网络IO编程框架.这里简单介绍一个程序,代码是&lt ...

  9. HighCharts基本折线图

    1.设计源码 <!DOCTYPE html> <!-- To change this license header, choose License Headers in Projec ...

  10. Docker 使用Docker知识简易部署一个LNMP平台

    1.自定义网络 docker network create lnmp 2.创建Mysql数据库容器(这里我们首先得创建一个mysql-vol数据卷) docker volume create mysq ...