学USB,你真的不要错过这篇入门笔记

文摘   2025-01-08 23:30   北京  

之前大家要的USB中文网:https://www.usbzh.com/


Hi!介绍你正式认识一下USB!

USB基本说明

USB是Universal Serial Bus的缩写,它是由业界领导厂商所共同制定的标准

由于USB从1996年问世到现在已经25年了,首先让我们来看一下当初

这些世界级的领导厂商是哪些?

各位可以看到,当初USB成立的时候,这有两个主要的Working Group,左边是Hub,右边是Electrical的部分

各位可以从这上面看到目前,我们现在仍然熟知的几个厂家,包括HP, Intel, 飞利浦, 微软, 跟NEC等左右边的厂家各位如果仔细看,除了NEC是日本厂家,飞利浦是欧洲荷兰的厂家之外,其它全部都是美国的厂家,所以确实在25年前领导的厂家几乎都是美国厂家

最近,各位应该知道USB4也出来了,我们来看一下最近USB4出来之后它的Promoter,也就是它推动的主要厂家有哪些?

各位看,主要有这7个厂家,HP、Intel、微软也都在上面在这个7个名单里面,各位应该也发现,仍然是美国的厂家居多,日本的厂家有一家叫瑞萨,在上面。其它的几乎都是美国厂家,不过对USB4来说这是列出主要的Promoter而已,其实还有很多参与的厂家,包括中国、台湾,日本、韩国,其实全世界有很多厂家都有参与,但是主要的Promoter就是这7家厂家而已,所以从这个表,各位可以知道,在PC的领域,尤其是USB的部分,主要还是美国的厂家为主!

只要你需要USB的信息,你可以上它的官网USB.org

我们直接连到USB.org,让各位看一下

USB.org里面有非常多的信息,如果对USB..需要了解的,不用去Google里面随便找,你只要到它的Document Library,像这边我直接点进它的Document Library给各位看

在Document Library里面,它的分类非常好,你可以在这里面找到各式各样的资料

如果要在USB Document Library里面找数据,你不用急着在搜寻这边输入

首先,我建议你先看看它的分类,先点到Category这边来点进去

你会发现它Category分成5类,包括

  • Legal就是法律的

  • Presentation是展示用的

  • 规格、工具、跟白皮书的部分,它主要分成这5大类,你先记在心里面

接着,你往下看Technology的分类,也是分成5项

包括USB2.0、USB3.2、USB4、还有Type-C, 及Power Delivery,所以它分成这5项

接下来,你再看右边的部分,它的Type部分,也是分成5项:

分别是cable, Device Class Specification跟Test的部分,Test有3项Matrix, 规格, 跟Tool的部分

对于写软件的人来说,最重要的应该是会看这一份,跟装置类别有关的

当然如果你对特定的某个技术特别想知道的,譬如说Type-C,你也可以直接选Category,再直接选USB Type-C

总之,在USB.org的官网上面

它将所有的文件、都整理得非常好,最重要是,它不用你花钱!

有些组织的文件是要给钱的,尤其最近ISO文件,几乎每项都要花钱你才可以看得到

但USB(组织)很大方!

你只要进到它的官网,你都可以自由地下载,所以看完这个USB官网之后,我们再回到我们的正题。

当初推动USB这项标准,它有三个动机

  • 第一个是希望USB接口,可以提供个人计算机、连接到电话

  • 第二个是希望它容易使用

  • 第三个是可以透过Hub来扩展。

我们来看第二项,容易使用

USB是个即插即用的接口,所以这部分它做得非常成功,第三项它提到是Hub的扩展,我们也知道USB,你可以插一个USB的Hub

可以执行扩展,USB在这部分,也展现的非常不错!

但是对于第一项,可能很多人会觉得奇怪,

为什么它是第一个考虑是希望能够连接电话?这个是不是很奇怪?

为什么USB当初在制定的时候,希望能够连接计算机?因为各位要知道USB是在1996年的时候制定的,在那个时间点没有宽带连网,所以当时如果你的计算机希望对外有链接你就是透过拨接的方法,如果透过拨接,就是透过电话,所以..

我来打开CDC的一份规范,让各位看一下当初制定这个的原因

现在各位看到这个就是一份CDC的文件,这个是USB附属的文件

我刚刚提过,如果你是写程序的,那么Class跟Protocol的部分,就是你最需要的文件这份就是CDC,CDC是Communications Devices Class的意思

各位可以看右边,这边有告诉你,它在1998年的时候、就制定第一版所以这个是很久以前..23年前制定的

我们再跳到..有相关的部分这份文件在第二章的地方就告诉你它制定这份文件的..主要的目标:第一个就是告诉你..Telephone

当然这个Telephone,不是我们现在的移动电话,你要知道,这是在1998年所以这边指的电话,都是室内电话,所以各位可以看第二个PSTN,PSTN就是室内电话第3个是ISTN,ISTN在二十多年前是很牛掰的技术,当时就是希望能够取代PSTN,能够进行网络联机,不过ISDN只红了几年,后来被ADSL给打败了现在几乎都是ADSL、或者是光纤。

总之,这是一个过往的历史,USB当时希望能够提供一个简单可以扩展的接口,也希望取代当时、使用拨接的方式,透过Modem, RS232, COM Port很没有效率的方法能够用USB这个界面来取代,所以它当时才会把电话列进去,所以会再回头看这边当时,在1998年的时候,它希望链接的电话是指市内电话,然后连上PSTN、ISDN、..等等

各位如果往下看,这边第五项有看到ATM

有没有看到ATM这个字样,这个ATM不是指提款机喔!

这个ATM是指:Asynchronous Transfer Mode

各位如果有用过USB转rs232啦!USB转rs485这些线就是ATM (更正应为ACM, subclass=2):非同步传输的

一个Class的一个界面,ATM是指这个不是提款机

从第六项开始就比较接近现代,因为CDC也做了很多调整,所以包括现在支持的都是可以支持ADSL,或支持WiFi, Wireless或直接变成USB转Ethernet,现在有这样的界面了这个就是CDC过往的标准

所以确实当初USB在制定的时候,是希望连接到电话的而且它在定义这个Class的时候..

我再让各位看一个在USB官网的一个链接

如果各位注意看在USB当初定义的时候

它的所有功能就是以一个一个的Class来定义的,各位如果从这边往下看

它所定义的第一个可支持的Class就是Communications Class

它这边所订的Class有分成两个,一个是可以用在装置,另外一个是用在接口

00是指说..它没有指定任何的{类型},但是02就是一个,可以指定装置(或接口)的一个Base Class它是02,所以CDC在当时USB开发的时候,它是跑在非常前面的,然后接下来各位有看到这个HID,HID就是Keyboard, Mouse的部分,接下来后面的,像这个Mass Storage, 是比较后面出来的,然后一直到底下有一些Diagnstic, Wireless Controller, 还有一些Vendor Specific的类型

总之,对USB来说,当初在制定的时候它主要的三个考虑,就是我上面列出来的这三个

USB经过数次的修改、演进,目前的最新版本为4.0,4.0是2019年所制定的,如果观察它过往演进的部分,你会发现它支持的速度不断的提升由最初的1.0版的1.5MHz,一直提升到目前最新的20Gbps

传输接口的部分从3.2 Gen2开始,如果你搭配Type-C的接头,那么它可以提供双向、双通道,这个在最早期的时候,只能够做半双工 这个部分,由我来进一步的说明,最早的USB,从1.0, 1.1, 到2.0,它是1996, 1998, 到2000年

我这边有把它所支持的内容列出来:

  • 1.0有一个代号叫LS, 就是Low Speed

  • 1.1叫Full Speed(FS),目前大部分的键盘鼠标都跑在全速(FS),因为全速(FS)对键盘鼠标来说,已经非常够用了

  • High Speed(HS)的部分,是在2000年的时候定出来的,High Speed跑到480Mbps

各位要特别注意的是在2.0之前,它的传输都只能够半双工,因为它只有D+, D-, 两根Pin,所以它是半双工,只有一个通道,然后它没有特别的编码

接下来我们再往下看

过了8年之后,在8年之后有一个Super Speed出来,就是USB3.0,当时的速度一次提升到5Gbps,这个速度提升非常的高

它提升到5Gbps之外,它的传输编码,加了一个8b/10b的编码,这个编码是因为USB3.0速度变高了,5Gbps这么高的速度为了要避免EMI的问题,因此它在做传输的时候它会打Scramble,所以,打了Scramble之后,就是让EMI可以降低,所以它有一个8b/10b的编码,这个8b/10b的编码就会让它效率变得比较糟了

以这个5Gbps来说如果8bit需要把它变成10b,那么实际上它的理论值带宽,就只有4Gbps,就是你把5G, 乘以8, 除以10相当于乘以0.8,所以实际上USB3.0

虽然它有跑5Gbps实际上它的有效带宽,理论带宽,最高也只有到4Gbps,就是因为这个编码的关系

过了8年才把这个速度提升,其实这个速度提升之后就非常好用了

一直到2013年的时候,当这个时间点,3.0又做了一个比较大的提升,就是它加入了一个10Gbps的部分,为什么呢?

因为在这个时间点这时候,SSD的普及率越来越高,那时候5Gbps就显得不够了。

很多装置带宽,就被卡在5Gbps这边,所以USB3.1,在那个时间点推出来,当时推出来之后,在2013年、这是过了5年之后它做了一个比较大的变化是:

USB3.1 Gen1的所有数据,都跟USB3.0一模一样

各位可以上下对照一下USB3.1 Gen1,就是USB3.0,简单说就是这样

而USB3.1 Gen 2,它就是一个提升的版本,它把5Gbps, 提升到10Gbps

其实它提升的有两个部分

  • 一个是它的频率翻倍了,从5Gbps, 变10Gbps

  • 另外一个是..它的编码,从8b/10b, 变成128/132

它做了这样的提升之后,虽然它的频率只提升了两倍,但实际上,再加上这个编码的部分,它的有效带宽,其实提升了2.5倍!

各位可以自己算一下就知道了

相当于只有4Gbps,因为5乘以0.8,这边理论只有4G。

而这边从4G, 提升到10G,所以它理论带宽提升2.5倍,但在2013年那段时间市面上就出现了非常多的,USB3.0, USB3.1的设备

所以市场上有点儿混乱,不过USB的组织一直对外宣称他们是很明确的就是当USB3.1出来的时候,他们不希望市面上再用USB3.0这个字样,可是因为USB组织,没有那么庞大的广告费用,他也没有办法那么大的宣传。除非你有上他的官网去看,所以你其实不知道它的定义是这样。

所以在那段时间,就是2013年那段时间,市面上有好多的USB设备又是标榜3.0,又是标榜3.1,好像它是比较新,其实USB3.1 Gen1,就是跟USB3.0是一模一样的啦!

不过大部分人不太清楚,就在那个混淆中也过了几年本来这样混淆就已经够乱了

结果在2014年,又推出一个USB Type-C

推出USB Type-C这个接头之后就让这个战局又更混乱了,为什么呢?

因为USB Type-C的接头、(接点)更多了

因为USB Type-C的推出,所以就衍生了USB3.1、又再进化到USB3.2

到3.2之后,主要就是希望使用Leverage Type-C的比较多的Pin脚,所以它在原来10Gbps的这个基础上,直接套用两个频道,

它在套用两个频道之后,它的总带宽就可以再翻倍喔!

它就可以从10Gbps, 变到20Gbps

同样的,USB这个组织也是对外说

当USB3.2出来之后,就希望市面上、不要再用USB3.1这个字样

可是这个历史又再一次出现,就是市面上又有

3.0到底是什么?3.1到底是什么?3.2到底是什么?

按照USB组织的规范,其实它有一系列、有脉络的!

各位如果注意看USB3.2,它的命名方法

当它命名USB3.2 Gen1x1,各位看光目标位置

Gen1的意思就是往前兼容

如果你往前回去看USB3.1, 它的命名方法其实也是一样的!

它的命名法则是一致性的

不过一般大众不太清楚

只知道市场上就是一片乱!

对USB来说,当3.2推出来之后

它的正式名称,就是现在这三个词

一个叫3.2 Gen1x1

接下来是3.2 Gen2,当3.2 Gen2这个名字出现之后,其实就表示、它跟3.0版不兼容,各位注意看,它的速度从5G, 变到10G,而且它的编码方式也不一样。

当初USB3.1、只有Gen2这个字,但到3.2之后,因为要把Type-C的两组Channel都拿来用,所以它又把3.2分成: USB3.2 Gen2x1, 跟Gen2x2

Gen2x1跟Gen2x2,其实用的频率都是一样的,都是10Gbps

不过,在Gen2x2的部分,它就直接把Type-C两组可用的接脚都拿来用,所以它就会变成有两个频道,所以你的理论带宽就可以翻倍

所以它就变成SuperSpeed 20Gbps

所以这个是USB3.2的部分!当然后来USB4, 就在2019年推出来了

USB4的部分出来之后,它的标示方法

其实跟前面的标示方法,是有一脉相传的

USB4 Gen2x2,各位有没有发现,USB4没有Gen1,所以USB4,各位注意喔!

它跟前一个版本,就是USB3.2,其实是完全不兼容的,理论上,如果USB4有出一个标示是跟前一版本相同的话,它的命名方式会变成USB4 Gen1x??,不过它直接是跳Gen2,表示它跟前面不兼容。

可是各位如果看频率的话,你会发现频率一样啊!

这个频率一样,它不是应该是兼容吗?可是各位注意看它编码

编码!它的编码跟前面是不兼容的!

在USB3.2, 3.1的时代,它的编码是132取128,但是它在USB4 Gen2的部分,改成66取64,所以这个部分是明显不一样,所以即使你看到它的频率一样,都是10G,它的理论带宽也是一样,都是20G,但是它实际在标示的时候,是不兼容的喔!

各位特别注意,都是10G、都是两个频道,但一个是132取128,一个66取64,所以两个其实不兼容

其实对USB4来说,它现在推出来的版本,就是有两个

一个叫USB4 Gen2x2, 另外一个叫USB4 Gen3x2,Gen3x2的频率又更往上拉了!它拉到20Gbps然后直接用两个频道,所以它的理论带宽,可以到40Gbps

这个是USB过往的部分,我把这个图稍微再整理一下,我把没有支持的部分移掉,再把它整理起来个就是目前在市面上,有支持的USB产品!

目前是USB1.0, 1.1, 2.0,这是LS, FS, HS

接着是USB3.2,这个3.2, 通通叫SuperSpeed

所以SuperSpeed分成: SuperSpeed 10Gpbs, SuperSpeed 20Gpbs

接下来就是USB4,USB4也有20Gpbs, 跟40Gpbs

但是再次提醒,USB4 20Gpbs, 跟SuperSpeed 20Gpbs, 其实是不相容的

接下来,我做了一张图表让各位看

现在画面上的这几个版本的速度你可以看它的频率是一直往上,最新版本的USB4最高可以到20Gbps

另外、我做了一个带宽的{图},它的带宽也是一样理论带宽,各位可以从这边、一直往上看,它越来越高

有一点要特别要告诉各位的就是在同样的频率底下,譬如说这个是

USB3.2 Gen2x1,它是走10Gbps,但是、同样是10G, 如果是USB3.2 Gen2x2,它的带宽是加1倍的

为什么呢?因为它走了两个通道!

这个一定要搭配Type-C才有喔!如果是Type-A的头就没办法因为Type-A只有TX, RX各一组而已!但Type-C可以有两组。

所以虽然频率是一样,但是因为它走Type-C两个通道所以它才会标成Gen2x2

所以虽然频率一样,但是它的理论带宽是翻倍的,另外就是USB4的部分,USB4一样是在10G的部分

然后它也是(Gen2) x2,不过我这边用不同颜色。因为要提醒各位,它的编码不一样,这个是66取64,这个是132取128,所以虽然这两个看起来带宽一样,但实际上这两个是不相容的,不过各位放心啦!你只要买新的Hub

都可以往下兼容,所以如果你买一个USB4的Hub,那么(请)放心USB4的(Hub)产品,USB3.2, USB2.0的装置通通可以插,总之,它就是可以往前兼容,这是USB的特点,但如果你是USB3.2的Hub。你就没办法支持USB4的装置

USB经过很多的演进,所以它的速度不断提升!

它的带宽也跟着提升!尤其是3.2之后如果搭配Type-C的话,就会提供双通道。所以做完这些解释后,希望各位对USB的各个版本、有更多的认识

USB硬件信号

首先来介绍,这是简单的鼠标,今天要谈的硬件信号,从两个部分来看

第一是这个接头,第二是线材的部分,

首先我们来看①,就是接头的部分

各位现在看到是一张正面图,这是从这个角度看,是从接口这边往里面看,这是一个正视图,如果从这个角度往里面看,各位看光目标位置,你会看到四个接脚

从这个角度往内看,你就看到这边有4Pin,有四个平面的接点

这4Pin的接点,就是(正面图的) 1, 2, 3, 4

我们再用另外一个角度,如果你从上面往下看的话,就是这个样子

各位会发现1, 2, 3, 4,它的长度不太一样喔!

第一跟第四接脚比较长,中间这两个接脚比较短,它为什么要做成这样呢?

各位看右边这张图就会了解了

第1跟第4接脚,分别是VBUS, 跟GND

USB装置可以自己带电,也可以吃HOST供电,大部分的装置,譬如说鼠标、键盘,都是直接吃HOST供的电

当你把这个接头,往里面切的时候,你会发现第1跟第4接脚是优先接触到的,因为第1跟第4接脚是供电。

接下来我们来看第二个部分

就是现在光点的②,我们把这个线材,把它切断来看,就会发现它里面有四根接脚,就是刚刚对照的这4个接脚

第1跟第4接脚,一般都是用红色跟黑色,就是VBUS跟GND

中间的D-, 跟D+,这两根接脚,一般会把它卷在一起,因为它是差分信号线,所以它会缠绕在一起。你打开来会发现这两个,绿色跟白色缠绕在一起,一般绿色就是D+,白色是D-,一般也会把它标记成DP, 跟DN

总之就是D+, 跟D-,这是它颜色的部分,是这样定义的

各位如果看右边这个图,除了1, 2, 3, 4接脚外,它有把Shell(Shield),就是它的外壳加进去,这个外壳,通常就是会有一些铜线

铜线的部分,如果你把线打开你会发现这个外部铜线包覆的部分就会接到它这个接头的外壳,不过最主要使用的,还是1, 2, 3, 4接脚

刚刚是标准的低速装置,我们来看一个高速、就是SuperSpeed。

SuperSpeed(SS)装置很容易辨识的就是..你注意看这个是蓝色的,如果你的U盘,这个不是蓝色,它是黑色或白色的,那么它只有支持到High Speed(HS)

蓝色的部分,就是支持到SuperSpeed

也就是USB3.0之后,它可以跑到5Gbps,这速度就差很多,因为一个是480M,一个跑到5G,(相差)超过10倍以上

这样的装置、我们一样从正视图往里面看,角度是一样的,你会发现一样的、它有1, 2, 3, 4接点

可是在1, 2, 3, 4接点后面,如果你从这个角度往内看,会发现后面有弹片

这个弹片不是装饰用的,而是后面真的有5,6,7,8,9接点,各位看光目标位置

你会发现1,2,3,4之后,后面有5,6,7,8,9,这是用弹片的方式做的,它的位置可以看,我现在目标这个箭头处

它的位置就是在后半部的地方

如果我们拿一个母的接头来看右边的这个USB,它是一个公接头,左边这个是一个母接头

这个1, 2, 3, 4接点,插到底之后,它会接到母接头的弹片,你的1, 2, 3, 4接脚,它是平面的接点平面的接点、插进去之后,母接头是用弹片的方式去接的

SS为了支持高速,它增加了5, 6, 7, 8, 9接点,它是做成弹片的

所以对于母接头来说,它这边就是用平面(接点)来接的

所以,如果你把这个接头插进去,首先你的1, 2, 3, 4接点,是会接到前面的1, 2, 3, 4接点

当然,你如果把它插到底的话,那么你后面的5, 6, 7, 8, 9接点,就会接到后面的这个5,6,7,8,9接点

所以各位看一下这边这个图

如果你把一个USB的装置,插到一个Socket

就是公接头、接到母接头这个的英文叫做Plug,然后这个接收端,这个叫Receptacle

你如果这样插进去,从这个角度往里面插首先你的1,2,3,4接点,就会接触到右边这个弹片,各位看光标位置,当你再往里面插,那么你自己的5,6,7,8,9的弹片就会接到它的这个5,6,7,8,9的平面接点

所以这是一个很聪明的设计

SuperSpeed的装置,它就可以直接使用Type-A的接头,就支持两种速度,因为如果你是一般没有(超)高速的HS装置,没有后面这些弹片,所以你把它插到底也没关系,因为这个5,6,7,8,9接点,不会接触到,可是,如果你是SS的装置,那么你插进去、1,2,3,4接触到之后接下来你插到底之后,后面的5,6,7,8,9弹片,就会接触到这边接触到后面之后,它就会提供第二组分别会有TX, RX各一组

本来只有2, 3接点是D+, D-,它会变成(增加了)TX+, TX-所以就会变成TX一组、RX一组

这样就变成全双工,就是可以同时收发

接下来我做了一个有意思的实验:

我试着把一个高速USB插到这个Socket, 进去之后, 我就故意不插到底

故意不插到底,让1,2,3,4有接触,让后面5,6,7,8,9没有接触

以及另外一个,就是直接把它插到底,各位可以看右边的速度,真的是有差别

上图下面部分,就是我把高速USB,直接插到底

那么它就会切换到SS,它直接用后面5,6,7,8,9来做传输

如果我没有把它插到底系统会侦测到,但是它只侦测到HS的速度

所以,各位可以看,这个速度就有很明显的差异,这个是让各位能够参考一下。

如果你有SS的装置,记得一定要准确的插到底,同时如果你的SS(接头)后面的弹片有问题,有可能会降速

不过这是极端状况下,一般人都会一次把它插到底,接下来,我们看完这个,我们再来看Cable的部分

在Cable部分,刚刚的HS,也就是USB2.0的定义它只有4根接点,就是D+, D-, VBUS, (GND)

但是在SS接头,它增加了5个接点,后面这个5,6,7,8,9,5个接点

中间这个第7接点是接地,所以它实际上多提供了两组,一组是TX,一组是RX

而且都是差分信号,然后它的Cable就会长这样子

总共会有六根接脚是做传输用

不过它同一时间、不会同时用

如果是跑2.0的速度,它只会用底下这一组

如果你的设备有支持SS,它才会用这个TX/RX这组

所以它不会共享,所以各位看上面这个图,一次就只会走一段喔!

接下来,我们再看这个硬件信号,我们一般的数字信号,不是0、就是1

这个是一般的Data,如果是Single End(单端)的状况就是这样

所以如果这是3.3v的话,0v就是0, 3.3v就是1,这是很容易分辨的

可是对于USB的装置来说,以D+, D-来说,它在工作状况底下,你看到的波形是长这个样子的

各位看,这个状况是这样的,绿色就是D+

在这样的波形底下,请问你怎么来定义,哪一个是1、哪一个是0?

这个看起来,哪一个都可以当1,哪一个都可以当0,在USB的定义里面,它是采这样波型方式的

当D+信号, 大于D-信号,它定义这个信号叫做'J',另外,如果是反过来,这个就是定义为'K'

这是第一点告诉各位的,在USB的信号定义里面,它是用J跟K的state来定义目前的波形信号

USB2.0 HS以下,它是用这样来定义J、K

这个波形上面,你可以定义出来,这个叫J状态,这个叫K状态

而且这边要特别提醒各位,USB在传输时,它会用固定频率传输,譬如说,如果你是(运作)在LS,那么,它的频率就是1.5MHz, 如果(运作)在FS,那么,它的频率就是12MHz, 就是固定的

HS的就是480MHz, 就是固定的,所以它在传输的时候,没有另外一根Clock Pin来定义时序,但是,因为它在传输的时候,就不断的这样交替、交替,所以它的传输上,(时序)还是蛮准的!

不过,还是会有某些状况下,因为同一个准位拉太长了,太长的话,它也怕会失去那个准确度,所以它有个(技术)叫Bit Stuffing,所以如果同一个信号,这个J超过6个,或K超过6个,它就会再补一次反转!

补的那个反转,就是Bit Stuffing,就会翻转回来,所以(请)记得在USB的传输里面,它是6加1的Bit Stuffing

我们再回到J,K,(谈到)这边,各位可能知道有J、有K

可是到底哪一个是0、哪一个是1?

这个我们就来说明,USB用一个叫做NRZI的编码来定义,什么是0,什么是1

如果你看到这个、目前的状况是K,但是它前面是J

这边是黑色,前面是绿色,表示说我从J变到K,那么这个时候,这一点的信号就是0,就是逻辑0

所以,以此类推往下看,这边都是0,0,0,0

因为它跟前面一个信号,都是不一样的

什么时候会变成1呢?

当当前一点的信号,跟前面一点的信号是一样的

所以你在看USB NRZI波形的时候,很简单的,如果看到这个宽度,超过1 Bit宽度,下一个就是1

只要是交替的,交替的位置通通就是0

为了加深一下理解,我们再看下一个图

下一个图就是,如果你读到一个NRZI的图,

各位可以发现,只要这个NRZI准位有变化的,就是0,如果没有变化,那这边就是1

小结一下:USB在(送出)波形信号时,它的D+, D- 接脚,当D+, 大于D- 的时候,它就把这个定义叫J, (反之以)K信号来定义,NRZI编码就是判断跟前一个、有没有一样?若不一样就是0,一样就是1。所以它基本的判定方法,就是用这个方法

不过这边有一点要特别提的,就是J, K信号,在LS是不一样的,它是反过来。

不过各位先不用拘泥,总之,FS跟HS的J信号,判断(方式)都是一样的

在USB2.0之前的版本,1.0, 1.1, 跟2.0版本都只有使用D+, D- 这两个接脚,所以它只有半双工,在这个状况下,USB的Type-A接头,一般都是白色或黑色的,所以如果你看到白色或黑色的USB接头,那么它通常就是支持USB2.0而已

在USB3.0之后,它支持SS,这时它是有规定的,你要用蓝色的接头,这时候它多了一组,应该说多了两组,就是TX, 跟RX分开,所以这是4根接脚,这个D+, D-还是会保留,因为它往前兼容,所以如果是USB3.0 Hub。你如果插入低速的装置,譬如说,插入键盘、鼠标。那它就会只走这个D+, D-也就是最高只用到HS,但一般只用到FS,或者,如果是跑SS,它就会用后面这一组

记得要插到底喔,我们刚刚有提到过,就是后面弹片的部分。

在Type-C之后,Type-C推了一个接头,Type-C的接点更多了,它有两组的TX跟RX

我把这个图调出来给各位看,这是一个Type-C 的 Receptacle

Receptacle接头,就是母接头

它可以上下反过来插!

所以当你在做Gen2x2, 或Gen3x2的时候,它就是会这两组,通通都(拿)来用了,这边顺便讲这个CC是指Configuration Channel

然后这个SBU是跟供电有关的,我今天不讲Type-C,所以大概这样子先带过就好。

USB2.0无论是FS, 或HS, 都是使用NRZI的编码NRZI的编码就是,如果D+大于D-,叫做J state如果是反过来,就叫K state

所以它的波形,就是有一个叫J state,另一个叫K state,至于它是逻辑0或1,则是要看你的信号有没有变化

当信号由J变到K,或由K变到J,就称为(逻辑)0,反之就叫逻辑1

所以如果准位一直保持在K,那下一个就是逻辑1,如果出现连续6个逻辑1,那就必须插入一个反转,就是它要插入一个Bit Stuffing

这个时候,这个多插入的这个Bit会在硬件底层帮你把它拿掉,所以这个你不用担心,硬件会帮你做掉

这边就考各位一个问题

如果连续出现6个逻辑1,请问这6个逻辑1,会是J 还是K state?

给各位3秒钟想一下

如果出现连续六个逻辑1,那么这个时候的准位,是在J 还是K 呢?

答案就是,有可能是J, 也有可能是K 啦!


本着啰嗦也要讲清楚,说说这个问题

在USB 2.0的NRZI(Non-Return to Zero Inverted)编码中,如果连续出现6个逻辑1,我们需要理解以下几点:

  1. NRZI编码规则

  • 如果D+大于D-,称为J state。
  • 如果D-大于D+,称为K state。
  • 逻辑0:信号状态发生变化(从J到K或从K到J)。
  • 逻辑1:信号状态保持不变(保持在J或保持在K)。
  • 连续逻辑1的情况

    • 当连续出现逻辑1时,信号状态不会发生变化。
    • 因此,这6个逻辑1可以是保持在J state,也可以是保持在K state。
  • Bit Stuffing

    • 为了确保信号同步和避免长时间无变化导致的接收端误判,USB 2.0协议规定,当连续出现6个逻辑1时,必须插入一个反转位(即插入一个逻辑0)。
    • 这个反转位(逻辑0)会导致信号状态从当前状态(J或K)变化到另一个状态(K或J)。
  • 问题解答

    • 如果连续出现6个逻辑1,那么这6个逻辑1可以是保持在J state,也可以是保持在K state。
    • 重要的是,这6个逻辑1的状态(J或K)在插入Bit Stuffing之前是一致的,但具体是J还是K,则取决于信号在出现这6个逻辑1之前的初始状态。

    因此,对于问题“如果出现连续六个逻辑1,那么这个时候的准位,是在J 还是K 呢?”的答案是:

    • 这6个逻辑1可以是保持在J state,也可以是保持在K state,具体取决于信号在出现这6个逻辑1之前的初始状态。

    到这里就差不多你肯定懂了,咱们继续!!!

    USB封包格式

    首先,让我们来看一个很有名的金字塔,这个是USB Topology

    这个Topology告诉你几个很简单的概念

    第一个就是,你看这个金字塔的顶端,它是一个USB HOST Hub

    这个HOST Hub其实跟一般的Hub一样,不过因为它在最顶端,所以我们一般又称它为Root Hub

    在USB的规划里面,这个金字塔只能有一个顶端,所以它只支持Single Root

    Single Root就是说,它最上面的这个Root Hub,只能有一个,所以你在PC上,如果看到很多的USB(根集线器),那么,如果它是(出现)两三个不同的HOST Controller

    那么,它的每个金字塔都是各自独立的,这是第一点

    在USB Topology,它这个金字塔只支援一个Root,它没办法好几个Root一起共享执行

    接下来,各位应该会发现到,这个金字塔总共有7层

    从这个第一层开始算,到最底下这个第七层

    在这七层架构里面,它中间最多可以有5层的Hub,所以各位可以看到,中间这5层可以接Hub,所以USB的规范里面,它的Hub最多是5层,所以很多QA单位,都会拿Hub插了5层!因为插了5层之后,这是USB规范里面。

    为什么只能插5层呢?这个跟它的Timing有关系,这个有精算过,插了5层之后,它的规范里面(仍)可以让HOST支援到最下面这个Function,能够在它指定的时间内实现对应的功能。

    接下来各位看,除了最上面这个Root Hub之外,你往下看从Tier2到Tier7,你会发现USB的定义里面,它只有两种装置:一种叫Hub, 就是现在白色的部分,另外一种叫Function

    这个Function, 也就是(又称为)Device

    这个粉红色的Function可能是一个鼠标,可能是键盘,可能是一个U盘

    总之,在USB的世界里面,就是分成Hub、跟Function

    不过,它的Hub是一种很特别的设定,就是它的Hub是透明的,Transparent Hub

    在USB的通讯里面,通常都是由HOST跟Function,就是HOST (or)Root Hub, 会直接跟你的Device做沟通

    中间过了几层Hub,其实你都不会知道!

    总之这个是USB的设定,中间的Hub是定位为「透明桥接」

    真正的沟通作业,就是由HOST跟Function直接来进行,不管中间有过了几个Hub,你不用太担心

    如果你再看这个金字塔结构就会发现,USB这样子的设定它就必须采用封包的格式

    因为各位可以看,你的装置有可能直接插到HOST Hub

    你也可能过了好几个Hub,才插在最底下,所以在这样子的架构底下

    如果你不是用封包格式来传递,那真的很难做到,但如果你用封包的方式来做,则你所发送的信息,因为是一个一个的封包,所以Hub可以帮你传递、(再)传递

    就有一点像你寄信,先由邮局收到,然后它帮你寄到Local,Local再有人帮你送到,所以在这样的架构底下,你又需要Hub来扩展时,那么(采用)封包格式,就变成是必须的

    所以刚刚也提到了,在USB的世界里面,它就只分成Hub跟Function

    不过在这个金字塔图里面,这边有个特别的装置, 叫做Compound装置

    这个Compound装置, 是一个特别的做法

    就是它实际上是一个Hub,但这个Hub有内建一个Device

    譬如说,这个Hub内建一个U盘

    那么当这个Hub往上插的时候,底下这个U盘就会被侦测到,但实际上,它并不是分开的两个产品

    它其实是一个(整合的)产品,这种装置就叫做Compound装置,实际上它就是一个Hub装置

    然后它里面的Function,是直接跟着Hub做(在一起),这样的设定就会比较有弹性

    有一些Compound装置,就是一个Hub、底下接2、3个装置,但是当这个Hub一插上去之后,对HOST (or)Root Hub来说,它会直接侦测到很多的Function,但实际上它就是一个Hub的产品,这样东西叫做Compound装置

    我们把刚刚的说明再看一次,上面这个黄色部分叫做Root Hub就是在USB Topology里面,它只支持一个Single Root

    在它的通讯里面,都是{Host},就是USB {Host}直接跟Device,直接沟通

    这个直接沟通,不管中间你过了几个Hub其实都不会影响,如果你的Function,其实是长在最底下,那么它实际上操作起来,就有点像是下边这个图

    虽然中间过了非常多的Hub,但是它最终希望呈现出来的Host/Device View是直接沟通的

    当然,这中间会过很多层!

    所以我给各位看一张比较详细的图

    底下这张图,就是在USB Protocol的设计里面

    它的封包在传递的时候,它是用这样子的方式来看的

    最上面这个黄色、跟粉红色是直接沟通的,没错,但是你往下看的话,它又分成很多层

    它会分成,第一个就是Function Layer,第二层是USB Device Layer,最下面这个才是真正的USB Interface Layer,而底下最下面这层,就是真的有一个cable,所以底下这一层,才是真的它连接的方法

    就是我们刚刚有提到的,如果是USB 2.0, 就是D+, D-,所以底下这个黑色的箭头、双向箭头,这才是实的

    可是往上,它有一些比较虚拟的层,在这一层,中间这层USB Device Layer,就是做很多USB基本的部分,USB基本的部分,就是你插上去之后,它要先给你一个地址,给了地址之后,要做一些Configration,就是在这一层做的,这一层做的事情,那就不分任何的装置,这层做的事情,几乎都是类似的

    例如说,你插了一个鼠标进来,这个鼠标就要先配一个地址,如果插一个Camera进来,这个Camera也要配一个地址,在这个过程中所做的事情,这些Configuration的事情就是在这一层发生的喔,这层就叫做USB Device Layer,Device Layer做的事情都是一样的,分配地址、选择配置,每一个装置都一样,所以这个会写在一起,一般(来说),这一层就是操作系统会帮你做的

    如果再往上,这个就是跟你实际插进来的装置有关的,譬如说HID(鼠标),那么你需要Mouse Driver,如果是Keyboard,就需要Keyboard Driver,Camera, 或是Ethernet, 或是ATM, (或)譬如USB收发器,你就需要哪个Device的Driver,这个Driver就会长在这一层。

    接下来,我们来看一个实际的例子

    譬如说,我在这个地方插了一个鼠标,在这个地方插了一个摄像机,从这边你就会发现

    以鼠标跟摄像机来说,鼠标只是一个低速的装置,这个摄像机,肯定是要高速,因为如果是Full-HD,那传输量很高,这个(状况),对这个Hub来说,Hub都要能够处理

    这个又更突显了它封包格式的重要(性),因为对鼠标来说,它是一个低速装置,它可能是跑FS, 只有12MHz,左边的这个摄像机,它肯定是跑高速(HS)

    如果是跑SuperSpeed的话,那可能还跑到5GHz!

    所以对高速的Hub来说,Hub对上面的处理,都是高速的

    如果它是HS装置,那它就是用480MHz, 跟Host控制器沟通

    如果它是SS装置,那它就是用5GHz的速度,跟上面沟通,可是它对下,它可以吃低速装置

    所以这是用封包格式来传递,另外一个很重要的地方,我把这个封包,拆开来给各位看

    以这个以鼠标为例,就是,HOST可能是用HS速度,先把数据丢下来,然后到Hub之后

    Hub再转成FS, 或LS 往下传

    我们假设这边是用高速,譬如说HS是480MHz,Host就先传一个叫做SSPLIT,这个意思就是:Start SPLIT

    然后底下这个,叫做Complete SPLIT(CSPLIT)

    先记得,上面就是Start,下面是Complete就好了

    对HOST来说,它知道这个是低速装置,譬如说它是FS, 只有12MHz,我这边是480MHz, 是你40倍的速度,所以它在发给Hub时候,它先发一个Start,接下来发它实际要的Data,它发一个OUT Token、再发Data0

    这个时候,Hub就会把这个封包先吃下来,它先吃在这边,吃下来之后,它再用低速,譬如说12MHz的速度,再发给这个装置,那它就会发一个OUT Token,记得,前面这个OUT Token是高速的,这边是Full-Speed,就是12MHz,这可能是480MHz, 甚至5GHz的速度都有可能。

    两个Token的速度不一样了,对应图片

    所以这又突显另外一个,用封包来传递的好处,你透过Hub之后,Hub可以先帮你吃下来,然后用比较低的速度传给下面,当装置回传ACK的时候,这个ACK回传给Hub之后,Hub会把这个ACK,先留在这边

    这个时候,如果HOST接下来,再发一个Complete时,那么,Hub就可以把这个OUT、跟ACK回给它,反之,如果Hub发现这个装置,还没有ACK给它的时候,那么,当HOST发Complete的时候,Hub就会发一个NACK给它,HOST接下来,还会继续发Complete给它

    这一坨可能说的有点啰嗦,但是主要点在于让你感受到用封包格式传递的另外一个好处

    用封包格式可以协助、在这个多层的金字塔阶层来做分组交换之外,把它打成封包之后还可以在高速跟低速之间做传递。

    所以这是在USB Topology底下,必须用封包传输的另外一个原因。

    接下来我们来看,USB的封包,到底有多少类封包?

    其实USB的封包,它的格式只用4 Bit来做(区别),所以USB的封包,说起来只分成4大类。

    最常用的只有3大类,就是Token、Data、跟Handshake。

    一个标准的Transection,它就是会Follow下面这个流程:

    先发Token、再发Data、再做Handshake

    在某些状况下,发完Token之后,就可以直接收Handshake,也有一些状况是,只发Token、Data,不需要Handshake,譬如Isochronous传输,它就只发Token跟Data,不需要做Handshake,大部分Audio装置,就是只做这一段

    总之USB封包,最常用的就是这三种在这个封包里面,大部分都是先发Token

    有一个封包是最特别、也最短的,就是单单只有Token:这个封包叫做SOF,Start Of Frame

    我把这个封包打(开来)给大家看

    SOF Token,是当你的装置接上Host之后,接下来,HOST就会不断地发SOF给你,譬如我们刚刚举的这个例子,只要这个鼠标接上,配到地址、设置完毕之后,这个鼠标就会固定、一直收到SOF Packet,以鼠标来说通常是FS, 所以它会每1ms, 就收到一个SOF Packet

    如果左边这个高速装置、它跑在HS的话,那么它是每125us,也就是说,每1ms会收到8次(SOF),这个Frame(的次数)不太一样,就看你是FS, 或HS,这个Frame是最简单的,它的格式是这样子:

    我把它列在这边,在Idle状况底下,Bus上是呈现J state

    我们刚刚在前面有提到,在J state

    当封包要出现的时候,会先出现SOP,SOP它的格式很容易{分辨}

    就是会出现 K,J,K,J,K,K,总共是8 bit

    总之,在Idle时候,你会看到一个连续非常久的J (state)

    这个一定超过Bit Stuffing的规范,就是超过6+1,这个状况会被判定为是Idle

    接着你只要看到K,J,K,J,K,J、再加上K,K,这8 bit就是SOP

    接下来就会接真正的Packet,封包总共有24 bit,就是SOF

    它的PID就(是)前面看到(的),就是0101B,PID是0101B,那就是一个Start of Frame

    SOF会有8 bit PID,接下来再带11 bit Frame(number),这边为什么是8 bit呢?

    在USB 2.0协议中,PID(Packet Identifier,包标识符)是一个非常重要的字段,它用于指示数据包的类型。

    PID字段总共8位(bit),由两部分组成:

    • 类型字段:前4位(PID[3:0]),用于指示数据包的类型。
    • 检查字段:后4位(PID[7:4]),是类型字段的反码,用于确保PID的可靠译码。

    对于SOF令牌,其PID的类型字段为0101(即二进制的0101B),因此检查字段为1010(即0101的反码)。所以,完整的PID字段为1010_0101B(或简写为0101B,但理解时应包含其反码作为检查码)。

    SOF令牌的结构

    SOF令牌用于标记一个帧的开始,其结构如下:

    • PID:8位,如上所述,为1010_0101B。
    • Frame Number:11位,用于指示当前帧的编号。帧编号是一个循环计数值,当达到最大值(7FFH,即2047)时,会重置为0。

    为什么PID是8位?

    PID被设计为8位的原因主要有以下几点:

    • 足够的类型表示:4位的类型字段可以表示16种不同的数据包类型(从0000到1111),这对于USB 2.0协议中定义的数据包类型来说是足够的。
    • 检查码的完整性:通过包含类型字段的反码作为检查码,可以确保PID在传输过程中的准确性。如果接收端检测到PID的检查码与类型字段不匹配,则可以认为PID出现了错误,从而忽略该数据包。
    • 标准化与兼容性:USB协议作为一种广泛应用的行业标准,其设计需要考虑到不同设备之间的兼容性和互操作性。8位的PID字段在保证足够功能的同时,也符合这一设计原则。

    PID检查码的作用

    PID的检查码在USB通信中起到了至关重要的作用。它允许接收端在接收到PID后,通过对其类型字段和检查字段进行比较来验证PID的正确性。如果检查码与类型字段的反码不匹配,则表明PID在传输过程中可能出现了错误,接收端将忽略该数据包并可能请求重传。这种机制有助于确保USB通信的可靠性和稳定性。

    回归正题!

    接下来会带一个11 bit Frame(number),然后再带一个CRC 5 bit,然后再2 bit结束

    这就是一个完整的封包,对Full-Speed, FS装置来说,每1ms就会收到一次这个封包,对于高速设备,每125us会收到一次。

    总之,这个金字塔告诉各位一件事情,USB最多可插5层Hub,然后它的所有沟通虽然看起来有很多Hub、有很多层,但它最终就是用一个很简单的概念:HOST是直接对Divice沟通的

    所以在封包部分,小结一下:

    • USB以封包方式传递信息虽然比较复杂,但却有诸多的优点

    • 第一个是,每笔封包会自带加强型的减查码(CRC16),这样可以提升侦错能力,

    • 通过封包的协议,可以达成交握、确认、或重送的机制

    • 它可以支持一对多的装置,并可透过Hub进行扩展

    • Hub可执行封包的转发,可更有效率的支持低速设备

    • 在封包的基础上,可以架构出更多样性应用,这个部分因为有封包的基础,所以USB(可设计)搭配更多的Class、更多的Protocol

    所以它可以即插即用,非常、非常多的装置,在早期很多装置是没有出现的,譬如说USB to Ethernet,最早期也没有USB to WiFi,这些都没有,但是它只要扩展Class, 跟Protocol之后,它就可以在完全相同的封包基础上,作出更多的应用,这个也是用封包来传递的好处。

    USB的所有传输都由HOST主控,且持续性的发送,有提过,就是HOST直接对Device,装置在完成配置后,就会持续收到Frame封包(=SOF),刚刚有提过,装置刚插进去之后,Host就会先配一个地址给它,接着、有地址之后,它会做配置然后就会持续收到封包

    对于LS或FS来说,每1ms都会收到一个Frame封包(SOF)

    对HS来说,每1ms会收到8个,相当于每125us收到一个Frame(=SOF),这个Frame(number),一样是只有11 bit,但是它在内部计算时,其实是用14 bit来计算的

    其余的、其它封包,因为我们刚刚说、封包有四大类型,最常用的有三个类型

    SOF只是Token的其中一个而已,其它的封包,全部都是在Frame之间出现的,所以这个,HOST会负责来计算,你的封包是不是够分配?

    因为所有的封包,必须在Frame里出现(不可跨祯)

    关于封包,我们就先知道到这个程度。

    USB波形范例

    在今天的示例里面,我会链接MCU 的USB 接脚,就是D+, D-, VBUS, GND 这4根接脚到一个标准的USB Type-A接头并把它插到计算机上,插进去之后,程序代码会启动装置,这个细节我们先不谈

    总之,MCU这端就是一个USB Device Controller,我会去启动它,启用之后,计算机就会侦测到这个USB Device,我们会透过示波器来观察Bus上的D+, D- 信号,并说明及解析SOF的封包内容,因为刚刚有特别提到这个SOF封包

    通过SOF封包的观察,可以让大家能够更了解USB的通讯

    今天不谈太多的程序代码,就直接看示波器,各位先看示波器这边,不断的有数据在显示,现在是每1ms、就有一个Frame(=SOF)丢出来,我现在把这个波形停下来整个图瞅瞅,各位应该可以发现,现在1格是1ms,所以每1ms都有一个触发

    现在我把中间这个1ms展开,我现在搭了两个(探测棒在) D+, D-

    D+是用绿色,黄色就是D-;

    所以各位有没有发现,这个绿色大于这个黄色,

    所以这个状态叫什么?这个叫J state,所以这个是J state,就是目前在Full-Speed的状况下,它属于Idle

    绿色在下面,黄色在上面,就是D- 在下面,所以这个叫K state,可以对照一下,这个就是从J 变到K

    各位可以看下面这个图示

    Start of Packet, SOP就是KJKJKJ, 然后两个K, 所以各位再往右边看,所以这边再两个K,现在我把光标调出来,光标锁住之后,现在光标的范围是8个,除一下,12MHz是83.3ns(奈秒),8 bit就是大概666ns,所以现在这个(光标范围)是8 bit左右。

    前面是J,所以就是Idle的状况下,KJKJKJ, 然后再2个K,所以这是SOP

    SOP之后,后面就会接PID,我们现在需要的PID是Start Of Frame

    SOF PID是0101B,接着来看看它后面是不是0101B?

    接下来我把光标再移到同样的位置,所以我现在把光标移到这边过来,这边就是PID的起始位置,所以这个(NRZI)值是多少?

    所以它是1, 0, 1, 0,1010B就是SOF,为什么呢?因为LSB先到,LSB是先到的

    所以当你是1010B的时候,你反过来就变成什么?0101B就是SOF,所以没有错,这就是一个SOF

    SOF后面就会接11 bit FrameNumber

    我把图形再往右边移,11 bit Frame(number)

    现在这个(光标右界)Bit在这里,我再把它往右移,我们只看到SOF前面,(实际为)最后8 bit就好了

    现在这8 bit是什么值呢?我再把它放大来看

    这个bit就是0, 0, 然后这边(3个)都是1,所以是0, 0, 1, 1, 1, 然后0, 0, 0

    再说一次,这个是从LSB开始的

    所以它是0, 0, 1, 1, 1, 然后再0, 0, 0。这个FrameNumber,如果换算成十六进制,就是0x1C

    这一段是0x1C,所以理论上,下一个Frame值应该是0x1D,因为你要加1,所以现在就到下一个Frame去看,下一个Frame的这个bit一定会变!

    现在这个bit,这边是0, 0, 1, 1,所以下一个{Frame}的这个bit位置会是1

    跳到下一个Frame来看

    前一个Frame是0x1C,这个值是0x1D

    这里看的有点模糊,也不存在,自己搞个示波器玩玩,你绝对清晰的不行。

    只要USB装置接上去之后,这个(SOF)Packet就不会停,但是观察波形 你会发现前面都没变!为什么呢?

    因为前面SOP,是固定的8 bit,然后接下来是,SOP跟SOF是固定的,所以前面16 bit固定,接下来有(变动的)11 bit,加后面的CRC5,就会一直跟着跳,这个就是当USB装置链接后,你固定会收到的封包

    这是最简单的一个封包(Transaction),它只有Token, 没有Data, 也没有Handshake。

    到这里你应该学会J跟K怎么看,(逻辑)0跟1是怎么判断的,以及在USB链接后,它的数据的信号是怎么跑的,都有了一个概念,大概先让各位有这样一点点的概念


    差不多这篇文章到这里就ok了,下次再聊,不能熬夜了~~~明天还得健身呢!

    因为文字太多,有错别字之处请海涵。祝各位一切顺利!好看记得点赞哦!


    处芯积律
    处芯积律,而后知所至。一个芯片人的技术和行业研究分享。
     最新文章