USB PHY芯片

参考:

https://www.zhihu.com/question/51436808

ULPI_v1_1

https://www.sparkfun.com/datasheets/Components/SMD/ULPI_v1_1.pdf

http://cross-hair.co.uk/tech-articles/ULPI%20interface.html

https://www.beyondlogic.org/usbnutshell/usb3.shtml

https://www.usb.org/documents?search=&tid_2%5B0%5D=40&items_per_page=50

https://www.mentor.com/products/ip/usb/usb20otg/phy_interfaces

https://www.ti.com/lit/ds/sllse16e/sllse16e.pdf?ts=1592220488191&ref_url=https%253A%252F%252Fwww.google.com%252F

https://www.techdesignforums.com/practice/technique/usb-3-0-physical-layer/

https://ip.cadence.com/ipportfolio/ip-portfolio-overview/interface-ip/usb-ip/usb-3-0-phy-2/usb3-ss-phy

usb3.0

https://www.eefocus.com/liangziusb/blog/11-12/236193_34684.html

hs usb2.0

http://ww1.microchip.com/downloads/en/DeviceDoc/evb3320.pdf

http://ww1.microchip.com/downloads/en/Appnotes/AN19.0-Application-Note-DS00002959A.pdf

http://ww1.microchip.com/downloads/en/DeviceDoc/evb3320user.pdf

http://ww1.microchip.com/downloads/en/DeviceDoc/00001792E.pdf

opencores

https://opencores.org/projects/usb1_funct

https://opencores.org/projects/usb

USB 2.0 Physical
USB 2.0 Physical Layer(PHY
Layer(PHY) Design
) Design
 

低速设备D-上有一个1.5k欧的上拉电阻。

高速和全速设别在D+上有一1.5k欧上拉电阻。

连接后通过检测电压变化来了解设备是否为低速设别。

低速下:D+为“0”,D-为“1”是为“J”状态,“K”状态相反;

全速下:D+为“1”,D-为“0”是为“J”状态,“K”状态相反;

高速同上。

低速下空闲状态为“K”状态;//1.5Mbps

全速下空闲状态为“J”状态;//12Mbps

高速下空闲状态为“SE0”状态;//480Mbps

//----------------------------------------------

J态:DP=0,DN=1

K态:DP=1,DN=0

SE0态:DP=0,DN=0

从J到K或者从K到J,信号翻转,说明发送的是信号0;从J到J或从K到K,信号保持不变,说明发送的是信号1。这就是差分信号0/1的发送。

高速设备的J和K相反。

 

NRZ与NRZI编码解释

RZ 编码(Return-to-zero Code),即归零编码。

在 RZ 编码中,正电平代表逻辑 1,负电平代表逻辑 0,并且,每传输完一位数据,信号返回到零电平,也就是说,信号线上会出现 3 种电平:正电平、负电平、零电平:

 

 

从图上就可以看出来,因为每位传输之后都要归零,所以接受者只要在信号归零后采样即可,这样就不在需要单独的时钟信号。实际上, RZ 编码就是相当于把时钟信号用归零编码在了数据之内。这样的信号也叫做自同步(self-clocking)信号。

这样虽然省了时钟数据线,但是还是有缺点的,因为在 RZ 编码中,大部分的数据带宽,都用来传输“归零”而浪费掉了。

那么,我们去掉这个归零步骤,NRZ 编码(Non-return-to-zero Code)就出现了,和 RZ 的区别就是 NRZ 是不需要归零的:

这样,浪费的带宽又回来了,不过又丧失宝贵的自同步特性了,貌似我们又回到了原点,其实这个问题也是可以解决的,不过待会儿再讲,先看看什么是 NRZI:

NRZI 编码(Non-Return-to-Zero Inverted Code)和 NRZ 的区别就是 NRZI 用信号的翻转代表一个逻辑,信号保持不变代表另外一个逻辑。

USB 传输的编码就是 NRZI 格式,在 USB 中,电平翻转代表逻辑 0,电平不变代表逻辑1:

 

翻转的信号本身可以作为一种通知机制,而且可以看到,即使把 NRZI 的波形完全翻转,所代表的数据序列还是一样的,对于像 USB 这种通过差分线来传输的信号尤其方便~

现在再回到那个同步问题:

的确,NRZ 和 NRZI 都没有自同步特性,但是可以用一些特殊的技巧解决。比如,先发送一个同步头,内容是 0101010 的方波,让接受者通过这个同步头计算出发送者的频率,然后再用这个频率来采样之后的数据信号,就可以了。

在 USB 中,每个 USB 数据包,最开始都有个同步域(SYNC),这个域固定为 0000 0001,这个域通过 NRZI 编码之后,就是一串方波(复习下前面:NRZI 遇 0 翻转遇 1 不变),接受者可以用这个 SYNC 域来同步之后的数据信号。

   此外,因为在 USB 的 NRZI 编码下,逻辑 0 会造成电平翻转,所以接受者在接受数据的同时,根据接收到的翻转信号不断调整同步频率,保证数据传输正确。

但是,这样还是会有一个问题,就是虽然接受者可以主动和发送者的频率匹配,但是两者之间总会有误差。假如数据信号是 1000 个逻辑 1,经过 USB 的 NRZI 编码之后,就是很长一段没有变化的电平,在这种情况下,即使接受者的频率和发送者相差千分之一,就会造成把数据采样成 1001 个或者 999 个 1了。

USB 对这个问题的解决办法,就是强制插 0,也就是传说中的 bit-stuffing,如果要传输的数据中有 7 个连续的 1,发送前就会在第 6 个 1 后面强制插入一个 0,让发送的信号强制出现翻转,从而强制接受者进行频率调整。接受者只要删除 6 个连续 1 之后的 0,就可以恢复原始的数据了。

 

既然说编码,那就顺便把另一种极常用的编码也说一下把:曼彻斯特编码

曼彻斯特( Manchester )码是一种双相码。用高电平到低电平的转换边表示 0 ,而用低电平到高高电平的转换边表示 1 。

注:以上关于电平的表示,具体环境或者不同教材给出的规定可能不同,但是原理相同!

 

低速设备:

J态:DP=0,DN=1

K态:DP=1,DN=0

SE0态:DP=0,DN=0

从J到K或者从K到J,信号翻转,说明发送的是信号0;从J到J或从K到K,信号保持不变,说明发送的是信号1。这就是差分信号0/1的发送。

高速设备的J和K相反

 

posted @ 2020-06-15 09:24  Hello+World!  阅读(3189)  评论(0编辑  收藏  举报