深入理解USB2.0通信协议——电气及物理层规范
深入理解USB2.0通信协议——电气及物理层规范导言
本节将主要讨论USB的物理层规范,并深入探讨FPGA在USB比特级物理层编解码方面的实现。本文专注于从FPGA角度探讨USB实现,不会详细介绍电气规范,具体的电气规范请参考其他相关文档。
1USB线缆(Cable)
USB需要一根屏蔽电缆,其中包含4根导线。
D+和D-:这两根导线形成了一个叫做扭曲双线对(twisted pair)。它们负责传输差分数据信号,同时也承载一些单端信号状态。在低速USB中,数据线可能不会被扭曲。D+和D-两根线上的信号是相对于(第三根)GND(地线)导线的。
GND:这是地线,用于提供信号的参考。所有信号都是相对于地线的电压来测量的。
VBUS: 这是第四根导线,称为电源导线。它携带一个名义上的5V电源,设备可以使用这个电源进行供电。这使得USB不仅仅是一种数据连接,还可以为连接的设备提供电力。
图片
2USB设备速度识别
图片
在USB集线器的每个下游端口的D+和D-上,都接有一个15kΩ的下拉电阻。当端口没有设备插入时,这两个下拉电阻将输入端拉到低电平。
在USB设备端,D+或D-上接有一个1.5kΩ的上拉电阻到3.3V的电源。对于高速设备和全速设备,上拉电阻连接在D+上;对于低速设备,上拉电阻连接在D-上。
当设备插入到集线器时,带有上拉电阻的数据线的电压通过上拉电阻和下拉电阻的电压分压效应,大致为3V左右,形成一个高电平信号。
集线器检测到这个状态后,会向主机控制器报告,从而检测到设备的插入。
通过检测高电平的数据线是D+还是D-,集线器可以判断设备的速度类型。
高速设备首先被判断为全速设备,然后通过集线器和设备之间的确认,可以切换到高速模式。
在高速模式下,是电流传输模式,因此需要将D+上的上拉电阻断开。
3USB信令(Signaling)
在USB协议中,有一系列特定的信令和信号状态如se0、se1、J、K、idle、sop、eop等。这些信令和信号状态对于USB设备之间的通信至关重要,在USB通信中确保了设备之间的协同工作。它们是协议规范的核心组成部分,负责同步数据、传输信息和控制设备状态。USB设备根据这些规定的信令进行通信,从而确保数据的可靠传输和设备的正常运行。因此,理解和遵循这些信令和状态对于USB通信的稳定性和可靠性至关重要。
图片
图片
图片
图片
差分0/1
在USB(Universal Serial Bus)通信中,差分0和差分1是指USB数据线(D+和D-)上的两种状态,用于表示二进制数据。
差分信号:USB使用差分信号传输数据,这意味着数据传输通过两根线(D+和D-)进行,而不是单根线。差分信号的优势在于抗干扰性更强,因为接收端通过观察两根线之间的电压差异来识别信号。
差分0:差分0表示逻辑低电平。在USB差分信号中,当D+的电压高于D-时,系统将被解释为差分0。这是USB通信中的一种状态,表示二进制0。
差分1:差分1表示逻辑高电平。当D-的电压高于D+时,系统将被解释为差分1。这也是USB通信中的一种状态,表示二进制1。
SE0/1
SE0和SE1是USB差分信号线上的两种特殊状态,用于表示数据的逻辑低电平和逻辑高电平。
SE0(Single Ended Zero):SE0表示逻辑低电平。在USB差分信号中,当D+和D-两个线的电压低于低电平电压时(0.3V),系统被解释为SE0状态。这是USB通信中的一种状态,通常用于指示空闲或特定的控制状态。
SE1(Single Ended One):SE1表示逻辑高电平。当D+和D-的电压高于 SE1 电平的最小输出电压(0.8V)时,系统被解释为SE1状态。这也是USB通信中的一种状态,通常用于特定的控制信令或握手过程。
在USB通信中,SE0和SE1的变化用于表示不同的控制状态、数据传输和同步。例如,在USB通信的开始和结束时,会使用SE0状态来指示起始点(SOP)和结束点(EOP);在复位条件下,也会使用SE0状态。SE1状态可能用于特定的信令或指令。
J/K State
在USB(Universal Serial Bus)通信中,JK状态通常涉及到差分信号线D+和D-的状态切换,用于表示数据的不同逻辑状态。
在低速设备中,差分0表示J状态,差分1表示K状态,在全速和高速设备中,差分1表示J状态,差分0表示K状态。
差分信号的J和K状态的切换和持续时间会根据USB通信的特定协议和阶段而变化。这种状态的切换用于表示数据的传输和同步信息。
IDLE State
IDLE(空闲)状态是指在没有进行数据传输或特殊控制信令时,差分信号线D+和D-保持特定的电平状态。对于低速、全速和高速设备,IDLE状态与差分信号的电平状态之间存在一些差异。低速设备中,保持K状态为IDLE状态,全速设备中保持J状态为IDLE状态,高速设备中保持SE0状态为IDLE状态。
SOP/EOP
SOP(Start of Packet)是用于标识数据包起始的信令。USB电平从IDLE状态切换到K状态则为SOP。
EOP(End of Packet)是用于标识数据包结束的信令。USB电平持续两位时间的SE0后跟随一位时间J状态,表示EOP。
图片
Suspend(挂起/暂停)
所谓挂起就是设备长期进入空闲状态,USB规范规定所有USB设备都必须支持挂起状态。设备可以从任何已供电状态进入挂起状态。设备在看到上行总线上保持连续空闲状态(Idle state)超过3.0ms后开始过渡到挂起状态。
设备必须在所有端口上的总线不活动后的不超过10ms的时间内实际暂停,此时设备只能从总线中获得挂起电流。
在上行端口发生任何总线活动时,设备将无法进入挂起状态。
在缺乏其他总线流量的情况下,为了防止全速/高速设备进入挂起状态,SOF令牌将每个(微)帧发生一次。
设备在挂起状态下必须继续向其 D+(全速/高速)或 D-(低速)上拉电阻提供电源,以保持空闲状态,以便上游集线器能够维护设备的正确连接状态。
对于操作在高速模式的设备,复位和挂起在初始阶段是无法区分的。当高速设备检测到数据线保持高速空闲状态至少3.0ms时,必须在空闲状态开始后的不迟于3.125ms内切换回全速配置。设备通过断开终端电阻并重新连接其 D+ 上拉电阻来实现从高速切换到全速。切换回全速后的100us到875us内,设备必须对总线的状态进行采样,如果状态是全速 J,则设备继续挂起流程。当一个设备或下游朝向的端口从高速操作被挂起(suspended)时,实际上会在挂起过程中过渡到全速(full-speed)信号传输,但需要记住它在被挂起时是以高速模式运行的。当恢复操作(resume)发生时,设备或下游朝向的传输器必须在不需要进行复位的情况下,重新转换到高速模式。
当USB设备进入挂起状态(Suspend state)后,它采取一系列动作以降低功耗并减少对总线的影响。以下是USB设备进入暂停状态后可能采取的动作:
停止数据传输:设备停止在总线上的数据传输活动。这包括暂停对上行(upstream)和下行(downstream)数据线的通信。在暂停状态下,设备不发送或接收数据。
降低功耗:设备降低功耗,以最小化对电源的需求。在挂起状态下,设备通常只维持最低限度的电流,被称为暂停电流(suspend current)。
关闭部分电路:设备可能关闭一些电路或组件,以降低整体功耗。这可能包括关闭不必要的模块、接口或外设。
保持连接状态:设备可能会维持与上游集线器的连接状态,以确保在需要时能够快速恢复通信。
维持上拉电阻:如果设备是全速或高速设备,它必须继续提供电源以维持其 D+(全速/高速)或 D-(低速)上拉电阻,以便上游集线器能够正确维护连接状态。
等待唤醒信号:设备进入暂停状态后,它将等待特定的唤醒信号,以便在需要时快速返回活动状态。唤醒信号可能来自主机系统或其他触发条件。
Resume(恢复)
恢复动作触发条件:如果USB设备处于暂停状态,它的操作将在其上行端口接收到任何非空闲信号时恢复。此外,如果USB系统软件启用了设备的远程唤醒功能,设备还可以通过信令系统来请求恢复操作。恢复信令主要由主机或设备发送,用于将暂停的总线段重新激活。
主机发起恢复:主机可以在任何时候发出恢复信令。它必须至少发送20毫秒的恢复信令(K状态),然后以两种方式之一结束恢复信令,具体取决于其端口在暂停时的操作速度。如果端口在暂停时是低速/全速运行的,则恢复信令必须以标准的低速结束帧(两个低速位时间的SE0后跟一个J)结束。如果端口在暂停时以高速运行,则恢复信令必须以切换到高速空闲状态结束。
恢复信令的目的:20毫秒的恢复信令确保所有启用了接收恢复信令的网络中的设备被唤醒。恢复信令建立的连接状态由“End of Resume”终止,该操作为集线器的正常运行做好准备。在恢复总线后,主机必须在空闲状态开始后的3毫秒内开始发送总线流量(至少是SOF令牌),以防止系统重新进入暂停状态。
远程唤醒设备的要求:具有远程唤醒功能的设备除非总线连续处于空闲状态5毫秒,否则不能生成恢复信令。这样设计是为了使集线器能够进入其暂停状态并准备传播恢复信令。远程唤醒设备必须保持恢复信令至少1毫秒,但不超过15毫秒。在此期间结束后,设备停止驱动总线(将其驱动器放入高阻抗状态并且不将总线驱动到J状态)。
集线器的作用:如果远程唤醒设备的上游集线器被暂停,它将把恢复信令传播到其上游端口和所有已启用的下游端口,包括最初发出恢复信令的端口。当一个集线器传播来自下游设备的恢复信令时,它可能会在规定的时间内以比正常更快的速度从空闲状态切换到K状态。集线器必须在接收到原始恢复信令后的1毫秒内开始这个重新广播。恢复信号将以这种方式向上游传播,直到达到主机或非暂停的集线器,后者将在下游反射并控制恢复定时。这个集线器被称为控制集线器。
系统软件要求:USB系统软件必须在10毫秒的恢复恢复时间内提供,期间它不会尝试访问连接到受影响(刚刚激活)的总线段的任何设备。
端口连接和断开的影响:端口的连接和断开也可以导致集线器发送恢复信令并唤醒系统。这些事件只有在集线器已被启用为远程唤醒源时才会导致集线器发送恢复信令。
高速设备和集线器的特殊处理:如果集线器端口和设备在暂停之前以高速运行,它们必须“记住”它们先前以高速运行,并且它们必须在从K到SE0过渡的两个低速位时间内无需仲裁地过渡回高速操作。在K到SE0过渡后的两个低速位时间后,必须启动非活动定时器。需要注意的是,如果链接在暂停时以高速运行,则会忽略通常会在全速恢复信令结束时发生的从SE0到J的过渡。它要求主机及时发送SOF,以防止高速总线进入暂停状态。
Reset(复位)
复位信令触发:集线器通过在下游端口上驱动一个延长至少10毫秒的SE0来向下游设备发送复位信令。复位信令持续一段时间后,设备将进入默认状态(Default state)。
默认状态:在默认状态下,设备等待主机的指令,准备接受配置等信息。在这个状态下,设备无法主动进行通信,需要主机通过设备描述符等信息对其进行配置。
复位信令生成:USB系统软件可以通过对任何Hub或主机控制器端口的请求来生成复位信令。复位信令必须至少持续10毫秒。在复位后,集线器端口将转换到已启用状态(Enabled state)。
对根端口复位的要求:主机控制器和USB系统软件必须确保根端口发出的复位信令的持续时间足够长,以覆盖任何下游设备可能进行的并行唤醒尝试。根端口的复位必须持续至少50毫秒。不要求复位是连续的,但如果不连续,复位信令之间的时间间隔必须小于3毫秒,且每次SE0的持续时间必须至少为10毫秒。
低速/全速模式下设备的复位响应:处于低速/全速模式的设备如果在其上行端口上看到SE0信号持续时间超过2.5微秒,则可以将该信号视为复位。复位必须在复位信令结束之前生效。复位后,集线器会将流量传播到新复位的端口。连接到此端口的设备必须识别总线活动并防止进入暂停状态。
复位恢复时间:集线器必须能够在复位被移除后的10毫秒内接受所有集线器请求,设备必须能够在复位被移除后的10毫秒内接受SetAddress()请求。未能接受此请求可能导致USB系统软件无法识别设备。
复位唤醒设备:复位必须唤醒设备,使其从暂停状态返回活动状态。
高速设备复位协议:高速设备可以在已上电、默认、地址、已配置或暂停状态时进行复位。复位信令与低速/全速复位兼容,即集线器必须成功复位任何设备,设备也必须能够由任何集线器成功复位。
初始连接后,具有高速功能的收发器在复位期间参与低级协议(高速检测握手协议),以建立高速链路并在适当的端口状态寄存器中指示高速操作。
Reset过程中高速检测握手协议
「确认设备不是低速设备」在复位开始之前,集线器检查连接的设备是否不是低速设备。低速设备不允许支持高速操作。如果设备是低速设备,集线器将不执行后续的高速检测协议。
「驱动SE0信号」集线器发出SE0信号,开始复位协议,并将这个时刻标记为T0。
「设备检测SE0信号并进行高速检测握手」a) 如果设备是从挂起状态进行复位的,则在检测到SE0信号后,设备开始进行高速检测握手。由于挂起状态下设备的时钟通常被禁用,检测到SE0信号会导致时钟重新启动。时钟必须在足够时间内可用(尽管不一定要稳定到500 ppm的准确度),以便在握手协议中检测到高速集线器的Chirp信号。b) 如果设备是从非挂起的全速状态进行复位的,则在检测到SE0信号后,设备开始进行高速检测握手。c) 如果设备是从非挂起的高速状态进行复位的,则设备必须在开始恢复到全速之前等待一段时间。恢复到全速是通过断开高速终端并重新连接D+上拉电阻来完成的。设备在开始从高速状态恢复后的100 µs至875 µs内,检查总线状态,以确定SE0(复位而不是挂起)是否被检测到。如果检测到SE0(复位),则设备开始高速检测握手。
「设备生成Chirp K」高速模式是由电流驱动的,其J/K信号是由一个17.78mA的电流源向D+和D-数据线产生,当USB主机进入高速模式后,主机和设备两端的D-和D+都会挂载45Ω的等效终端电阻,并会断开D+数据线上的上拉电阻,这两个电阻并联之后为约为22.5Ω,因而可以在D+或者D-数据线上形成约为400mV的高速J/K信号。而高速设备在连接到USB主机时默认为全速模式,因此此时USB设备端还未挂接45Ω终端电阻,而是挂载了1.5K的上拉电阻,此时USB设备端的上拉电阻1.5K和主机端的45Ω并联后约45Ω,因此在D+和D-上会形成800mV(17.78x45)的差分信号,这种差分信号就是Chirp J和Chirp K状态。Chirp J和Chirp K状态只是断暂的,是因为设备端没有挂载45Ω的等效终端电阻而引起D+和D-上的短暂电压变高,待挂载了45Ω的等效终端电阻后电压自动降低而变成高带模式的J/K状态。
在全速模式下,高速设备看到SE0后,保持D+ 1.5K上拉电阻连接,禁用高速设备端点(Endpoint),然后将高速信号电流(17.78mA)驱动到D-线上,生成一个Chirp K信号,Chirp K信号在集线器端就是800mV电压。
图片
图片
「集线器检测设备的Chirp信号」在集线器发出SE0后的2.5 µs内,集线器必须检测到设备的Chirp信号。如果未检测到设备的Chirp K信号,集线器必须继续维持SE0,直到复位结束,然后一直保持全速模式。如果检测到Chirp K信号则会切换到高速模式。
「集线器发送Chirp K和Chirp J序列」在Chirp K状态结束后的100 µs内,集线器开始发送Chirp K和Chirp J的交替序列(KJKJKJKJ...),通知设备这是USB2.0的集线器。在J和K之间不能有空闲状态。这个序列必须在Reset结束前的500 µs之前开始,且在Reset结束前的100 µs之前结束。这确保了总线保持活跃,防止设备进入高速挂起状态。每个Chirp K和Chirp J的持续时间必须在40 µs至60 µs之间。
「集线器保持SE0并在复位结束时过渡到高速Enabled状态」在完成Chirp序列后,集线器继续保持SE0直到复位结束。在复位结束时,集线器必须在不引起数据线上的任何过渡的情况下过渡到高速Enabled状态。
「设备检测集线器的Chirp信号」在设备完成自己的Chirp后,它检测集线器的高速Chirp序列。如果设备检测到Chirp K-J-K-J-K-J序列,那么设备在500微秒之内断开D+ 上拉电阻(1.5K欧),启用高速终端电阻(45欧),并进入高速Default状态。如果设备在1.0到2.5毫秒之间未检测到这个序列,则设备需要回到全速Default状态,并等待Reset结束。
Connect/Disconnect(连接/断开)
图片
图片
「断开」在低速和全速模式下,当主机或集线器的下行端口没有连接任何设备时,下拉电阻将导致D+和D-都被拉低,将在下游端口上创建一个SE0状态。如果主机或集线器没有驱动数据线并且在下游端口上持续存在SE0状态超过TDDIS(2~2.5微秒),则表示断开连接条件。在高速模式下运行的面向下游的收发器通过感测 D+ 和 D- 线上差分信号幅度的倍增(当设备终端被移除时可能发生这种情况)来检测高速设备的断开连接。当差分幅度 ≥ 625 mV 的信号必须可靠地激活断开。差分幅度 ≤ 525 mV 的信号绝不能激活断开。
「连接」在集线器检测到数据线之一被拉高到其VIH(2.0V)阈值以上超过TDCNN(2.5微秒)。具有高速功能的设备最初必须作为全速设备连接,并且必须符合所有全速连接要求。
SYNC(同步)
SYNC(同步)是USB通信中的一种模式,用于在数据传输开始时标识数据包的起始点。在USB通信中,SYNC模式有两种:低速/全速传输中使用的SYNC模式和高速传输中使用的SYNC模式。
低速/全速传输中的SYNC模式:在低速和全速传输中,SYNC模式是一个特殊的位模式,标识着数据包的开始。具体而言,它是3对KJ后跟2个K的模式,总共8个符号。这有助于接收端同步并识别数据包的起始点。
高速传输中的SYNC模式:在高速传输中,SYNC模式更为复杂,要求是15对KJ后跟2个K,总共32个符号。这种模式在高速传输中提供更强的同步信号,以确保精准的数据包起始点。
NRZI编码后的SYNC前缀就是01010100(KJKJKJKK)并不是00000001。
图片
4USB 比特级编码
位序
USB数据位,优先发最低位(LSB),最后才是(MSB)。例如发送数据0x8A,会先后发送0,1,0,1,0,0,0,1。
NRZI编解码
USB 在传输数据包时采用 NRZI 数据编码。
NRZI编码规则是:
比特0,电平有变化
比特1,电平没有变化
在USB通信中,这种编码方式对于同步是至关重要的。USB使用差分信号传输数据,而NRZI编码帮助确保在接收端正确地解释和同步这些差分信号。此外,NRZI编码还有助于消除长串的0,因为数据位0的变化会在每个时钟周期内发生,从而避免了频繁的状态变化。
图片
module nrzi_encode(
inputlogic clk ,
inputlogic rst ,
inputlogic din ,
output logic dout
);
always_ff @(posedge clk)begin
if(rst)
dout <= 'd0;
else if(~din)
dout <= ~dout;
end
endmodule
module nrzi_decode(
inputlogic clk ,
inputlogic rst ,
inputlogic din ,
output logic dout
);
logic d_r;
always_ff @(posedge clk)begin
d_r <= din;
end
always_ff @(posedge clk)begin
if(rst)
dout <= 'd0;
else if(din == d_r)
dout <= 'd1;
else
dout <= 'd0;
end
endmodule
位填充(bit stuffing)
在USB通信中,为了确保充足的信号过渡,发送设备在发送USB数据包时使用了比特填充(Bit Stuffing)机制。比特填充的目的是在NRZI编码之前,在数据流中的每六个连续的“1”之后插入一个“0”,以强制在NRZI数据流中引入一个电平翻转。这样,接收方逻辑就能够在至少每七个位时间内得到一次数据翻转,以确保数据和时钟同步。比特填充是从同步模式(SYNC)开始启用的,并且在高速数据包结束(End-of-Packet,EOP)信号之前一直有效。当接收端检测到不符合比特填充规则的比特序列时,就会产生比特填充错误。在USB规范中,特别规定了在高速信号传输中故意引入比特填充错误来指示数据包的结束(End-of-Packet,EOP)。接收端被要求将任何比特填充错误解释为EOP。
在比特填充规则中,发送设备会在数据流中的每六个连续的“1”之后插入一个“0”。
比特填充规则始终生效,除非在高速数据包结束(EOP)信号期间。
即使在数据包结束了,如果符合比特填充规则,发送设备也会插入一个零比特。
发送端,FPGA可以通过状态机判断是否需要bit stuffing(1111110)
接收端,FPGA可以通过状态机判断是否为bit stuffing进行解码
高速模式下的EOP
对于高速数据包中的非SOF(Start-of-Frame)数据包,传输的EOP分隔符要求是一个NRZI编码字节,为01111111,不进行比特填充。例如,如果EOP字段之前的最后一个符号是J,则会导致EOP为KKKKKKKK。
对于高速SOF数据包,传输的EOP分隔符要求是5个NRZI编码字节,没有比特填充,包括01111111 11111111 11111111 11111111 11111111。因此,如果EOP字段之前的最后一位是J,则会导致在导线上出现40个K,结束后,数据线必须返回到高速空闲状态。这个额外的EOP长度对于接收方没有意义,它用于断开检测。
当数据包被通过多个集线器(或中继器)进行重复时,每个集线器都有一些灵活性来添加额外的比特,以确保数据的正确传输,集线器可以在EOP字段的末尾添加最多4个随机比特。因此,在5个集线器之后,一个数据包可以在EOP字段之后有多达20个随机比特。然而,集线器不能破坏EOP字段的任何8个(或40个,对于SOF的情况)必需的比特。 学习了!
页:
[1]