基础概念
通用串行总线(英语:Universal Serial Bus,缩写:USB)是一种串口总线标准,也是一种输入输出接口的技术规范,被广泛地应用于个人电脑和移动设备等信息通讯产品,并扩展至摄影器材、数字电视(机顶盒)、游戏机等其它相关领域。
USB 的最初是在1994年英特尔与微软发布,第一个版USB 1.0 ,经过30多年,目前已经发展到了USB4.0,无论在USB的外形,速率,功能都已经发生了巨大的变化。
首先关于Type A, Type B, Type C 这种指的是USB的物理接口样子,关于USB1.0 USB2.0 USB3.0 等,一般是作为速度的一个版本。这是两个不一样的概念。
物理接口
USB 接口主要分为 A , B, C 口那么几种,但是其中有分为有Standard 标准,Mini小型,Micro 微型,所以USB 接口到目前为止有非常多种形态。
常用的接口有 Type A 接口,这个接口一般直接插在电脑上的,Type B 接口比较少见,目前比较常见的是 Mini-B、Micro-B接口,前者在 MP3 之类的设备中比较常见,当然在我们工程师中的调试器中也经常使用,后者多用于手机等设备。但随着时间改变,Type-c 接口已经成为了主流,目前大部分手机接口用 Type-C接口代替了,当初在乐视手机上最先开始采用Type-c 接口。
Type-c 接口具有可以正反插的优势,线束更多,传输数据量变大的优势,在很多设备都成为了使用。
Mini/Micro USB接口
Mini/Micro USB接口内部的引脚分布情况(不包含 Type-C 接口,这个接口引脚很多):
第四引脚在某些接口中可能没有,其他引脚都是存在的。
Vbus 和 GND 两个硬件用于供电,提供恒定的 4.4 ~5.25 V电源(当 USB 为设备提供 5.25 V 电源时,数据线工作在 3.3 V),当设备使用总线供电时,将由这两根引脚提供所需电源,当然总线提供的电流比较有限,所以如果说总线不足以提供足够的电源,那么就需要使用外部供电。
D-、D+两个引脚用于数据传输,类似串口的Tx、Rx数据线,不同的是,USB采用差分方式传输,使用双绞线,并且在线上传输的数据编码远比串口的复杂,这个后面介绍。
这里需要注意一下线的颜色,一般的厂家生产USB数据线时会按照标准来生产,但是有些厂家却不一定,红色不一定是电源,黑色不一定就是地,使用的时候需要注意确认。
标准的USB数据线外部一般会有屏蔽线包裹,防止外部干扰,但是有些厂家偷工减料,可能并没有屏蔽线,甚至连D-、D+数据线都没有,只提供电源线。
(外层白色包裹为屏蔽线)
因为采用差分传输,并且只有两个引脚,所以总线为半双工传输,即同一时刻只能发送或接收。同时 USB 采用一主多从模式,即USB网络中只有一个主机,其他都是从机,也就是设备。
USB Type C接口
Type C接口特点
Type C 是一组对称的连接器,在使用的过程中不需要如同使用 USBA,MinUSB,MicroUSB 那样来辨别接口方向。其次能够承受较高的功率所以可以支持高达 100W 的功率,所以使用该接口可以更好的支持快速充电,以及支持更高的数据吞吐量,普通规格也达到 10 Gb/s 的数据带宽,可用于高清视频的传输。对于同时满足以上的要求 USBA,MinUSB,MicroUSB 接口无法达到的。
Type C接口定义
USB Type C母口
USB Type C公头
从上图的 Type C 公头和母口的引脚排列可以知道 Type C 的引脚功能是上下对称的,所以公头无论以什么方向接入母口两者的功能引脚都可以完美对接。具体引脚,及其详细描述查看如下表格:
Type C接口CC1/2 作用
最早快充协议属于高通发布的 QC 充电协议,该协议通过提高充电适配器的输出电压从而提高充电功率。既需要与适配器进行协议通信,让适配器调整输出电压,在 QC 协议中通信使用的是 USB2.0 的 DP 和DM 引脚,这样带来的问题是充电的时,对 USB 通信造成影响。为了解决这个问题 PD 快充协议对电源设备的识别通过 CC1 和 CC2 引脚来进行,从而避免了 QC 协议中 对 DP 和 DM 引脚的占用。使得 PD 协议快充在充电的同时,数据传输也可以稳定进行。
主从设备
做主机时,CC1、CC2接上拉电阻VBUS
做从机时,CC1、CC2接5.1K电阻接地
典型应用原理图(做从机使用)
注意: 由于支持 PD 快充协议的适配器的电源输出受 CC1 和 CC2 引脚协议控制,所以对于在设计没有 PD 协议芯片的电子产品来说,如果想从支持 USB-PD 快充协议的适配器中获取电源,则需要在 CC1 和 CC2 引脚连接 Ra/Rd 下拉电阻,如果悬空可能无法让适配器输出电源(这一点是需要格外注意的)。
如果在无 PD 快充协议的适配中(比如电脑 USB 接口,充电宝或普通电源适配中)则可以任意或悬空。
CC1和CC2的下拉电阻是否能共用一个电阻
不建议,这两个多功能配置channel 分别接在USB type C 的connector上。这些功能包括:connector polarity,
end-device connection detect, current capabilities, Power Delivery communication.
并且有些芯片数字输出引脚的逻辑状态来检测是哪个通道CC1 还是CC2被USB typeC connector 拉低了。
Type C版本
Type C 接口实际上为了适应不同的用途(全功能 24P Type C 价格较高为了节约成本,比如很多时候使用的芯片不需要使用或不支持 24 个引脚,不需要使用音视频传输,只需要使用 USB2.0,所以此时使用 24 片引脚的全功能版本 Type C 就显得浪费)按功能需求进行划分从而拥有多个版本,前面描述的实际属于全功能 Type C,共有 24 个功能引脚,该版本可以支持 USB3.0、USB2.0、协议,音视频传输,快速充电协议等等。
- 全功能USB3.0/3.1、USB2.0、视频传输,24P Type C,目前我们交流说的Type C默认指的就是 24P全功能Type C。
- 仅支持USB2.0,16P/12P Type C,16Pin和12Pin实际属于同一种接口。
- 仅支持充电,6P Type C。
所以对于 Type C 共有以上四个版本,实际使用因该是三个版本,在电路设计时按照自己实际需要实现的 USB 通信类型进行选择相应的 Type C 接口。
16P与12P Type C接口定义
从上图可知 16Pin Type C 在 24Pin 全功能版本的基础上移除了 USB3.0 的 TX1/2、RX1/2 引脚,保留了 SBU1/2、CC1/2、USB2.0 的 D+ 和 D- 引脚,除了不支持 USB3.0/3.1 高速传输外,其他没有任何的差别,同样可以支持 PD 快充、音频传输、HDMI 传输、调试模式等其他功能。
从上图的俯视图上可以看到16 Pin Type C实际上仅有12 Pin,这是因为16 Pin接口在设计时将Type C 母口两端的两个Vbus和GND引脚两两相互靠近,注意仅仅是相互靠近并不是共用引脚所以接口实际还是存在16 Pin,但对于其封装只要12 Pin,其中相互靠近的引脚共用一个封装引脚,具体可以看下图的实物图。
所以 16Pin 和 12Pin Type C 本质是相同的,是可以共用贴片 PCB 封装的。
6P Type C接口定义
对于仅需支持充电,那么 USB2.0 D+ 和 D- 引脚也可移除进一步节约接口制造成本。6Pin Type C 仅保留Vbus、GND、CC1、CC2 引脚。接口两侧同样对称分布 Vbus 和 GND ,CC1,CC2 引脚用于支持正反接入,以及快充协议的支持,具体可以看下图的实物图。
Type-C设备之间如何识别
就供电而言,Type-C设备可分为三类:
- 只能作为供电端(Source)的Type-C设备,如Type-C充电器等
- 只能作为受电端(Sink)的Type-C设备,如Type-C手机等
- 既可以作为供电端(Source),又可以作为受电端(Sink)的Type-C设备(DRP,Dual RolePort),如Type-C笔记本,双向充电宝等。
显然,当两个Type-C设备通过C2C线材连接在一起时,双方必须知道对方属于何种类型的设备,否则会带来不理想的充电(如反向充电),或者不充电,甚至导致产生安全问题。
例如,当用户利用充电器(Source)给Type-C双向充电宝(DRP)充电时,理想情况下,充电宝应当“担任”Sink的角色。 然而,由于设备类型识别错误,可能导致充电宝“担任”Source角色而发生“电流倒灌”的现象,损坏两方设备。
Type-C接口规范通过CC引脚的一系列“上拉”和“下拉”的机制来区分Source、Sink以及DRP。 对于Source设备,要求CC引脚配置上拉电阻Rp; 对于Sink设备,要求CC引脚配置下拉电阻Rd; 而对于DRP设备,要求通过切换开关,交替性地切换上拉和下拉。CC引脚的“上拉”和“下拉”如下:
Source通过检测Rp端的CC引脚判断是否有设备接入,Sink通过检测Rd端的CC引脚判断正反插的方向。
下拉电阻Rd=5.1k,上拉电阻Rp根据其供电能力和上拉电压不同而设定。 USB Type-C的供电能力有如下几种:
- 1、默认USB供电能力(Default USB Power)。 USB2.0接口为500mA; USB3.2接口为900mA和1500mA
- 2、BC1.2(BatteryCharge 1.2)协议。 支持最大功率7.5W,即5V1.5A
- 3、USB Type-C电流1.5A(USB Type-C Current 1.5A),支持最大功率7.5W,即5V1.5A
- 4、USB Type-C电流3A(USB Type-C Current 3A), 支持最大功率15W,即5V3A
- 5、USB PD(USB PowerDelivery)协议, 支持最大功率100W,即20V5A
这五种供电能力优先级依次升高,且供电功率也逐渐提高。 高优先级的供电能力会覆盖低优先级的供电能力。 其中Default USB Power,USB Type-C Current 1.5A和USB Type-C Current 3A可通过配置Rp值来设置。
当两个设备连接完成后,Sink通过检测Rp和Rd的分压值vRd获取Source的供电能力。 如下为Rp值,vRd电压范围与Source供电能力的对应关系。Rp值,vRd电压范围与Source供电能力的对应关系如下图:
与此同时,设备的另一个CC已经被悬空或者通过Ra=1k下拉。 若有Ra下拉,则说明USB-C线材内置eMarker芯片,需要Source端通过切换该引脚至VCONN为线材供电。
至此,我们已经解释了设备之间通过“上拉”或“下拉”,或者在二者之前交替性切换,来判断Source、Sink以及DRP,并通过Rp电阻值,vRd电压值设置和判断Source的供电能力。 然而,这个过程具体是如何实现的? Type-C是如何避免反充或错误充电的?
Type-C设备之间详细的配置过程
我们以常用电子设备对应这三种类型:Source – 充电器; Sink – 手机;DRP – 笔记本或充电宝。
对于三种设备类型,理论上就会存在9种相互连接的组合,这些组合中必然有错误的连接方式(如适配器连接适配器),或不确定谁是Source的连接方式(如充电宝或笔记本)。 那么对于这么多组合,Type-C控制器是如何配置接口的?
Type-C控制器通过状态机的状态切换完成整个识别和沟通的过程,如下为状态机中的几种主要状态。
- 1、Unattached.SRC,Source处在未连接的状态
- 2、Unattended.SNK,Sink处在未连接的状态
- 3、AttachWait.SRC,该状态目的是Source确保设备连接后,CC1和CC2保持稳定
- 4、AttachWait.SNK,该状态目的是Sink确保设备连接后,CC1和CC2保持稳定
- 5、Attached.SRC,Source端判断设备连接成功
- 6、Attached.SNK,Sink端判断设备连接成功
- 7、Try.SRC,该状态为DRP设备试图切换Source角色
- 8、Try.SNK,该状态为DRP设备试图切换Sink角色
情形一:Source和Sink间的行为机制(适配器和手机)
如下是当Source有Sink设备接入时的行为机制:
- 1、Source和Sink均处于未接入状态Unattached.SRC和Unattached.SNK
- 2、Source检测到CC端有Sink上拉电阻,则Source状态变化Unattached.SRC --> AttachWait.SRC–> Attached.SRC; Source打开VBUS和VCONN。
- 3、Sink检测到VBUS,则Sink状态变化为Unattached.SNK --> AttachWait.SNK -->Attached.SNK
- 4、在Source和Sink处于连接(attached)状态之后,Source调整Rp数值来限制Sink吸收电流,Sink检测Rd上的电压vRd判断VBUS允许的电流,Source通过监测CC判断Sink是否断开,如果断开,则进入Unattached.SRC,Sink通过监测VBUS电压判断Source是否断开,如果断开,则进入Unattached.SNK
充电器(Source)和手机(Sink)的行为机制如下:
情形二:Source和DRP间的行为机制(充电器和笔记本)
如下是当Source有DRP设备接入时的行为机制:
- 1、Source和DRP均处于未接入状态,Source处于Unattached.SRC状态- DRP在Unattached.SRC和Unattached.SNK之间切换
- 2、Source检测到CC端有Sink上拉电阻,则Source状态变化为Unattached.SRC --> AttachWait.SRC–> Attached.SRC; Source打开VBUS和VCONN。
- 3、当DRP切换到Unattached.SNK,并检测到CC引脚有上拉时,则DRP状态变化为Unattached.SNK -->AttachWait.SNK --> Attached.SNK
- 4、在Source和DRP处于连接(attached)状态之后,Source调整Rp数值来限制DRP(即Sink)吸收电流,DRP(即Sink)检测Rd上的电压vRd判断VBUS允许的电流,Source通过监测CC判断Sink是否断开,如果断开,则进入Unattached.SRC- DRP(即Sink)通过监测VBUS电压判断Source是否断开,如果断开,则进入Unattached.SNK,并恢复其Unattached.SRC和Unattached.SNK的切换机制
充电器(Source)和笔记本(DRP)的行为机制如下:
情形三:DRP和Sink间的行为机制(笔记本和手机)
如下是当DRP有Sink设备接入时的行为机制:
- 1、DRP和Sink均处于未接入状态,DRP在Unattached.SRC和Unattached.SNK之间切换- Sink处于Unattached.SNK状态
- 2、当DRP切换至Unattached.SRC时,并检测到CC引脚有下拉电阻,则DRP的状态变化为Unattached.SRC -->AttachWait.SRC --> Attached.SRC;DRP(即Source)打开VBUS和VCONN。
- 3、Sink检测到VBUS,则Sink状态变化为Unattached.SNK --> AttachWait.SNK -->Attached.SNK
- 4、在Source和DRP处于连接(attached)状态之后,DPR(即Source)调整Rp数值来限制Sink吸收电流- Sink检测Rd上的电压vRd判断VBUS允许的电流,DRP(即Source)通过监测CC判断Sink是否断开,如果断开,则进入Unattached.SRC,并恢复其Unattached.SRC和Unattached.SNK的切换机制,DRP(即Sink)通过监测VBUS电压判断Source是否断开,如果断开,则进入Unattached.SNK
笔记本(DRP)与手机(Sink)的行为机制如下:
情形四:DRP和DRP间的行为机制(充电宝与笔记本)
对于DRP和DRP的沟通,存在三种情况。 一种情况是,设备双方决定谁是Source还是Sink是随机的; 第二种情况是,其中一个DRP试图通过Try.SRC机制来决定其作为Source; 第三种情况是,其中一个DRP试图通过Try.SNK机制来决定其作为Sink。如下是当DRP有DRP设备接入时的行为机制:
第一种情况:
- 1、两个DRP设备均处于未接入状态,DRP#1和DRP#2在Unattached.SRC和Unattached.SNK之间随机切换
- 2、当DRP#1切换至Unattached.SRC时,并检测到CC引脚由DRP#2下拉,则DRP#1的状态变化为Unattached.SRC–> AttachWait.SRC --> Attached.SRC; ;DRP#1(即Source)打开VBUS和VCONN。
- 3、DRP#2切换至Unattached.SRC时,并检测到CC引脚有上拉,则DRP#2的状态变化为Unattached.SNK -->AttachWait.SNK --> Attached.SNK
- 4、在Source和DRP处于连接(attached)状态之后,DPR#1(即Source)调整Rp数值来限制DRP#2(即Sink)吸收电流,DRP#2(即Sink)检测Rd上的电压vRd判断VBUS允许的电流,DRP#1(即Source)通过监测CC判断Sink是否断开,如果断开,则进入Unattached.SRC,并恢复其Unattached.SRC和Unattached.SNK的切换机制,DRP#2(即Sink)通过监测VBUS电压判断Source是否断开,如果断开,则进入Unattached.SNK,并恢复其Unattached.SRC和Unattached.SNK的切换机制
充电宝(DRP)和笔记本(DRP)的行为机制如下:
第二种情况:
- 1、两个DRP设备均处于未接入状态,DRP#1和DRP#2在Unattached.SRC和Unattached.SNK之间随机切换
- 2、当DRP#1切换至Unattached.SRC时,并检测到CC引脚由DRP#2下拉,则DRP#1的状态变化为Unattached.SRC–> AttachWait.SRC --> Attached.SRC; ;DRP#1(即Source)打开VBUS和VCONN。
- 3、DRP#2切换至Unattached.SRC时,并检测到CC引脚有上拉,则DRP#2的状态变化为Unattached.SNK -->AttachWait.SNK
- 4、DRP#2处在AttachWait.SNK,并希望切换至Source角色,DRP#2的状态变化为AttachWait.SNK -->Try.SRC; 并且上拉CC引脚
- 5、DRP#1不再检测到DRP#2在CC引脚上的下拉,于是状态变化为Attached.SRC --> UnattachWait.SNK–> AttachWait.SNK; 并且关闭VBUS和VCONN,在CC引脚上切换下拉电阻
- 6、DRP#2检测到CC引脚有上拉,则其状态变化为Try.SRC --> Attached.SRC; 并且打开VBUS和VCONN
- 7、DRP#1状态变化为AttachWait.SNK --> Attached.SNK
- 8、在Source和DRP处于连接(attached)状态之后,DPR#2(即Source)调整Rp数值来限制DRP#1(即Sink)吸收电流,DRP#1(即Sink)检测Rd上的电压vRd判断VBUS允许的电流,DRP#2(即Source)通过监测CC判断Sink是否断开,如果断开,则进入Unattached.SRC,并恢复其Unattached.SRC和Unattached.SNK的切换机制,DRP#1(即Sink)通过监测VBUS电压判断Source是否断开,如果断开,则进入Unattached.SNK,并恢复其Unattached.SRC和Unattached.SNK的切换机制
笔记本(DRP#1)和充电宝(DRP#2)的行为机制如下:
第三种情况:
第三种情况为Try.SNK机制,其与Try.SRC机制类似,这里不再赘述。
情形五:Source和Source间与Sink和Sink间的行为机制
这两种使用情况下,Source和Sink都处于Unattached.SRC和Unattached.SNK状态下,故不存在设备间供电的情况。
至此,我们介绍了一些常见的设备之间的沟通机制。 尤其是对于两个都是DRP双角色设备,Type-C控制器会采用Try.SRC或Try.SNK的方式,试图建立正常的供电逻辑。 当然,如若出现错误的供电逻辑(比如出现笔记本给充电宝充电的情况),USB PD协议还提供了Power Role Swap的机制,通过PD协议进行供电角色切换,详细内容可参考USB Power DeliverySpecification。
USB传输标准
USB历史版本
USB经过多年的发展,经历了多个版本,初始版本 1.0,于1996年完成,支持低速(LS)模式(1.5Mb/s)和全速(FS)模式(12Mb/s)。
- USB1.1规范于1998年面世,改进了1.0,但速度上没有改变。
- USB2.0 在2000 年问世,增加了新的速度模式,即高速(HS)模式,最高支持 480 Mb/s。
- USB3.0在2008年发布,传输速率 5Gb/s。
这些版本保持向后兼容的特性,即USB3.0的主机接口可以接入 USB 1.0、2.0 的设备,但是受到设备本身的速度影响,所以最终的速度由低版本速度决定。
通过数据(D+或D-)线上的上拉电阻的位置,主机可以识别低速设备和全速设备,而高速设备会在之后移除上拉电阻。
在 STM32F103 中,支持 USB 2.0接口 ,但是只支持全速模式下的2.0,即最大速度只有 12 Mb/s,换算到字节的话,只有 1.5 MB/s,除去USB本身的协议开销的话(类似串口中的起始位、结束位开销,但USB比这个复杂的多),最大有效数据带宽差不多在1.2 MB/s(我们接下来要学习的就是全速模式)。
所以不要认为 USB2.0 的接口一定支持高速模式。
在 STM32F4 中,USB开始支持高速模式,并且支持 OTG,这个模式使得USB 设备既可以当做主机也可以当设备使用。
现在的手机一般都支持 OTG,即通过一根转接线,即可将U盘之类的设备插入手机中使用,所以当你的手机触摸屏坏了,别着急,插上无线鼠标键盘套餐,照样玩手机。
当然这只是应急使用,真正来说,没谁会随身带着鼠标键盘的。
USB传输速率
关于USB的传输速度发展非常快,从USB1.0 只能传输1.5 Mbps到40Gbps。但对于USB 的相关命名,当初其实都比较简单,有USB1.0 USB2.0 USB3.0 这样,但是在有了USB3.1 时候之后,变得就更加复杂了,负责该命名的组织USB-IF先后改过2次命名。
可以看出其实在USB3.0 开始就发生了命名的改变。USB4接口将统一以传输带宽命名,USB4 v2.0对应USB 80Gbps,USB4对应USB 40Gbps,USB 3.2 Gen2x2对应20Gbps,USB 3.2 Gen2对应USB 10Gbps,USB 3.2 Gen1对应USB 5Gbps……
目前的关于USB新包装都采用新的表示
对于USB4 相关有新的标识
雷电技术
看着USB的传输协议,为什么又多出一个雷电技术?雷电技术是:由英特尔开发的Thunderbolt™ 雷电技术是一种强大的连接标准,可通过单一连接提供数据、视频信号以及为笔记本电脑充电。对于那些希望减少线缆数量,以整理和增强其生产力空间的工作人员、游戏玩家和内容创作者,Thunderbolt™ 雷电技术的多功能性无疑是他们的最佳选择。关键在于雷电技术都是需要走Typce-C接口。
USB4 的出现是基于雷电3的基础上开发,这是英特尔贡献给USB-IF组织,但是如果后期的认证还是需要英特尔。
原本的雷电3的传输数据最高支持40Gbps 其中传输数据是22Gbps,显示带宽18Gbps,但是在USB4中可以去动态调整达到一个最优的使用环境。到目前为止已经有了雷电5技术
USB 的发展,从当初的热插拔的优势,再到现在的传输速度上的大大提升,还包含关于充电速度的提升,都是在不断地进步,高版本的USB协议都是向下兼容。另外提到雷电技术,雷电3技术已经提供到USB-IF组织,让USB 有了更进一步的发展。
HUB与USB拓扑结构
除了常见的设备外,在 USB 网络中,还有一种特殊的设备,即 HUB(集线器),这种设备只有一个作用,就是将一个 USB 接口分成多个 USB 接口(最多 7 个)使用,这样即使你的电脑只有一个USB接口,通过 HUB,你也可以实现多个设备的连接。
HUB对于用户而言是透明的(即用户在使用时不用特别去操作它),而为了实现这种透明,HUB所做的工作要比上述复杂的多,具体可以找相关资料,鱼鹰有时间也会研究一下这种特殊的设备。
上图是USB连接图,可以看到,通过 HUB,一个 USB 网络中可以连接非常多的设备(最多 127 个,由 USB 设备7位地址决定),并且由于集线器的时间和电缆传播的延迟,最多只能连接五个 HUB,在层次上表现为上图的 7 层(在全速和高速设备中,最大线缆长度为 5 m,低速设备限制为 3 m)。
USB网络中的所有设备(包括HUB)都有一个地址,范围 0~127,地址 0 是所有设备在接入 USB 网络时使用的默认地址,当设备完成枚举后,即可拥有新的 USB设备地址,之后所有的通信都将采用新地址通信。也就是说, USB 设备的地址是动态的,类似网络的IP地址。
USB 层次结构
下面再来看看 USB 层次结构:
在开发时,由于我们主要是软件开发,所以主要的关注对象是上面两层,而底层的实现一般来说都是由硬件自动完成的,比如STM32就帮我们实现了这一层,我们只需要获取底层的数据然后进行相应的处理即可。
USB科普视频
想了解更多更多关于USB的知识,点击你真的了解Type-C么
本文参考:
USB接口小科普
Type-C设备之间详细的配置过程