咱们知道USB2.0向下兼容USB1.x,即高速2.0的hub能支持全部的速度类型的设备,而USB1.x的hub不能支持高速设备(High Speed Device)。所以,若是高速设备挂到USB1.x的hub上,那该设备只能工做在全速模式下。不论是hub仍是设备(device),对于速度的区分是很是重要的,不然,后续的通讯根本没法进行。3d
根据规范,全速(Full Speed)和低速(Low Speed)很好区分,由于在设备端有一个1.5k的上拉电阻,当设备插入hub或上电(固定线缆的USB设备)时,有上拉电阻的那根数据线就会被拉高,hub根据D+/D-上的电平判断所挂载的是全速设备仍是低速设备。以下两图:blog
图1 全速USB设备的链接接口
图2 低速USB设备的链接it
USB全速/低速识别至关简单,但USB2.0,USB1.x就一对数据线,不能像全速/低速那样仅依靠数据线上拉电阻位置就能识别USB第三种速度:高速。所以对于高速设备的识别就显得稍微复杂些。io
高速设备初始是以一个全速设备的身份出现的,即和全速设备同样,D+线上有一个1.5k的上拉电阻。USB2.0的hub把它看成一个全速设备,以后,hub和设备经过一系列握手信号确认双方的身份。在这里对速度的检测是双向的,好比高速的hub须要检测所挂上来的设备是高速、全速仍是低速,高速的设备须要检测所连上的hub是USB2.0的仍是1.x的,若是是前者,就进行一系列动做切到高速模式工做,若是是后者,就以全速模式工做。终端
下图展现了一个高速设备连到USB2.0 hub上的情形:请求
图3 高速USB的协商过程im
hub检测到有设备插入/上电时,向主机通报,主机发送Set_Port_Feature请求让hub复位新插入的设备。设备复位操做是hub经过驱动数据线到复位状态SE0(Single-ended 0,即D+和D-全为低电平),并持续至少10ms。d3
高速设备看到复位信号后,经过内部的电流源向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的持续时间在40us60us之间。KJ序列中止后的100500us内结束复位操做。hub发送Chirp KJ序列的方式和设备同样,经过电流源向差分数据线交替灌17.78mA的电流实现。
再回到设备端来。设备检测到6个hub发出的Chirp信号后(3对KJ序列),它必须在500us内切换到高速模式。切换动做有:
执行1,2两步后,USB信号线上看到的现象就发生变化了:hub发送出来的Chirp KJ序列幅值降到了原先的一半,400mV。这是由于设备端挂载新的终端电阻后,配上原先hub端的终端电阻,并联后的阻抗是22.5欧姆。400mV就是由17.78mA*22.5Ohm得来。之后高速操做的信号幅值就是400mV而不像全速/低速那样的3V。
至此,高速设备与USB2.0 hub握手完毕,进行后续的480Mbps高速信号通讯。
最后附上几幅实际USB高速识别的示波器抓图,图中蓝色信号是D+,黄色信号是D-。
图5 示波器截取的高速USB协商过程2
图6 示波器截取的高速USB协商过程3
最后附上一张来自Don Anderson的USB System Architecture里的USB HS接口图: