0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于DWC2的USB驱动开发-0x0A ULPI接口同步模式介绍

嵌入式USB开发 来源:嵌入式USB开发 作者:嵌入式USB开发 2023-06-04 15:35 次阅读

1.1 前言

ULPI的同步模式是最主要的模式,内容也比较多,所以单独一篇介绍。

1.2 ULPI命令字节

ULPI修改原始的UTMI数据流,使其能够适应更多的数据类型。

传输期间PID字节中的冗余信息被ULPI传输命令(TX CMD)重载。

接收流中未使用的数据字节被接收命令(RX CMD)重载。

ULPI定义了由LINK发送的发送命令字节Transmit Command 和由PHY发送的接收命令字节 **Receive Command ** 。

以上的发送接收是以LINK的角度来看的。

1.2.1 发送命令字节(TX CMD)

LINK通过发送下表发送命令字节来启动到PHY的传输。TX CMD字节由2位命令代码和6位有效载荷组成。

2位命令代码可以定义4种命令类型。

图片

1.2.2 接收命令字节(RX CMD)

PHY发送下表的接收命令字节,以更新线路状态、USB接收、断开连接和OTG状态信息给LINK。

图片

RX CMD中的VbusValid指示来自内部VbusValid比较器或外部Vbus指示输入。

Hostdisconnect 主机断开连接状态必须仅在主机模式下指示给LINK(DpPulldown和DmPullddown均设置为1b。

当处于设备模式时,必须忽略Hostdisconnect,并且不能屏蔽RxActive或RxError上的事件。

1.2.3 发送RX CMD的时机

RX CMD仅在同步模式下发送,并将两种类型的信息传输到LINK。第一个是USB接收信息。第二个是中断事件。所有信息被编码到单个RX CMD字节中。

USB接收信息包括线路状态LineState、RxActive和RxError。

在USB传输之后,PHY必须向LINK发送具有指示EOP的LineState的RX CMD。

对于高速,EOP就是LineState 的!squelch到squelch 。

对于全速和低速,EOP是LineState从SE0到J的转换。

中断事件包括Hostdisconnect、Vbus、IdGnd和其他源,如Carkit中断。

只要检测到这些事件,相应的USB中断启用上升沿USB Interrupt

Enable Rising 或USB中断启用下降沿寄存器USB Interrupt Enable Falling

配置了,就会向LINK发送RX CMD。

如图说明了PHY如何向LINK发送RX CMD信息。第一个数据包显示单个RX CMD。如果检测到连续的更改,PHY将保持dir拉高并驱动连续的RX CMD,如第二个数据包所示。LINK必须能够接受任何数量的连续的RX CMD。

图片

RX CMD的优先级低于USB接收和传输数据,但优先级高于寄存器读取和写入命令。

如果ULPI总线忙于传输USB数据,则RX CMD将在PHY中排队,并在ULPI总线可用时发送。

当发送到LINK时,排队的RX CMD必须始终传达当前RX CMD值,而不是以前或旧的值。

当在USB接收数据包期间nxt被拉低,PHY也必须向LINK发送RX CMD。

1.3 USB包

本节介绍如何通过ULPI总线传输和接收USB数据包。给出了PHY和LINK处理延迟的限制,以便可以满足USB数据包间延迟。

1.3.1 NOPID数据包

如图所示,为了发送不包含数据包标识符(PID)的USB数据,LINK发送NOPID类型的TX CMD字节。

PHY可以拉低nxt以限制来自LINK的数据。PHY在TX CMD的第一个时钟周期中不能拉低nxt,并且必须在检测到stp高时去拉低nxt。

由于该命令不包含PID数据,PHY必须等待下一个数据字节,然后才能开始在USB上传输。

当最后一个字节已经被PHY接收时,LINK拉高stp1个周期,并且如果没有发生传输错误,则将数据驱动到00h空闲状态。在第一个字节被PHY接收之前,链路不得拉高stp。

该命令必须用于啁啾chirp 和恢复resume 信号,对于这种信号,必须首先将功能控制寄存器中Function Control 的OpMode位设置为10b。对于啁啾和恢复信号,PHY不需要插入填充比特,因此必须保持nxt为高,直到它看到stp脉冲为止。

当LINK用NOPID数据包驱动ULPI总线时,PHY不应拉高dir,除非它想中止数据包。

所有USB数据包传输期间的RX CMD更改,必须用在USB传输结束时,ULPI总线可用时,发送的单个RX CMD更新来替换。即USB数据传输过程中状态的变化不需要管了,最后发一个最终的状态RX_CMD给LINK即可。RX CMD更新必须始终传达当前RX CMD值,而不是以前或旧的值。

image.png

1.3.2 PID数据包

如图所示,为了传输USB数据包,Link首先驱动一个TX CMD字节。命令字节类型设置为01b(传输),并将USB数据包标识符(PID)放置在数据上(3:0)。

PHY使用nxt控制数据接收,LINK在检测到nxt为高之后提供下一个字节,这与UTMI的DataIn和TxReady相同。当最后一个字节已经被PHY接收时,LINK拉高stp 1个时钟周期,并且如果没有发生传输错误,则将数据驱动到00h空闲状态。

在第一个字节被PHY接收之前,LINK不得拉高stp。

对于所有PID数据包,PHY必须自动准备SYNC域并附加EOP域。当TX CMD的PID字段为5h时,PHY必须识别出这是帧开始(SOF)包,并且自动附加长EOP。

在拉高stp之后,LINK不能发送另一个数据包,直到第一个数据包在USB上完成。

如果在给定定时之前接收到RX CMD表示有EOP,LINK可以开始传输下一个数据包。PHY必须始终发送指示EOP的RX CMD。

当LINK用PID数据包驱动ULPI总线时,PHY不应拉高dir,除非它想中止数据包。

所有USB数据包传输期间的RX CMD更改,必须用在USB传输结束时,ULPI总线可用时,发送的单个RX CMD更新来替换。即USB数据传输过程中状态的变化不需要管了,最后发一个最终的状态RX_CMD给LINK即可。RX CMD更新必须始终传达当前RX CMD值,而不是以前或旧的值。

UTMI+规格书所述,PHY必须在传输期间内部阻塞USB接收路径。

USB data transmit (PID)

image.png

PHY drives an RX CMD to indicate EOP (FS/LS LineState timing not to scale)

image.png

1.3.3 USB发送错误

如果LINK在全速或低速USB数据包传输过程中遇到缓冲区运行不足,则必须在数据包结束前在数据包中插入一个位填充错误。为了强制表示传输错误,LINK在数据包结束时,在它拉高stp的同一时钟周期中,将FFh驱动到数据上。LINK只能驱动一个字节的FFh,PHY将通过在USB总线上发送至少8个连续的1来自动生成全速传输错误。在发送另一个数据包之前,LINK必须等待指示SE0-to-J转换的RX CMD。在第一个字节被PHY接收之前,LINK不得拉高stp。该序列取代了UTMI在传输的最后一个字节期间将OpMode从00b更改为10b的方法。为了强制表示高速传输错误,LINK必须在数据包末尾传输值翻转的CRC。

image.png

1.3.4 USB包接收

如图所示,当PHY接收到USB数据时,它首先通过拉高dir获得数据总线的所有权。

PHY在与UTMI的RxActive有效相同的周期中拉高dir。

如果dir先前为低,则PHY将拉高dir和nxt,LINK立即接收RXCMD知道这是USB接收数据包。

如果dir先前为高,PHY将拉低nxt并驱动RX CMD,RxEvent字段设置为01b(RxActive状态),以便LINK接收RX CMD直到状态。

PHY可以在下一个周期中开始驱动数据,或者输出RX CMD,直到USB数据可用。

PHY拉高nxt并在总线上发送一个字节,将有效的USB数据包数据发送给LINK。

当nxt为低电平时,PHY驱动RX CMD字节。

USB包接收过程中的状态变化即RX CMD变化,必须在nxt为低时,发出。

如果nxt在数据包接收期间从不为低,则必须在USB数据包接收结束时ULPI 总线可用时发送单个RX CMD更新来替换所有RX CMD改变,即最后只发送一次RX CMD状态,中间的就不管了。RX CMD更新必须始终传达当前RX CMD值,而不是以前或旧的值。

虽然数据流已从UTMI的DataOut修改,但nxt与RxValid相同。

当RX CMD字节显示RxActive被设置为0b或dir被拉低(以先发生者为准)时,LINK认为数据包已完成。

image.png

1.3.5 USB接收错误

如果PHY检测到USB数据包接收错误,它将忽略任何当前接收的数据字节,拉低nxt,并在RxEvent字段设置为11b的情况下驱动RX CMD字节(RxError状态)。

当RxActive被设置为0时,PHY拉低dir。RxError状态与UTMI的RxError信号相同。

当检测到全速位填充错误时,所有PHY实现都必须设置RxError。

PHY可以选择性地为未与字节边界对齐的高速EOP、数据溢出、数据下溢或其他有效接收错误条件设置RxError。

PHY在EOP之前不对单个全速dribble bit 位设置RxError。

LINK必须忽略出现接收错误的数据包。

如图显示了在数据包中间检测到比特填充错误时ULPI接口的行为。

image.png

如图显示了在最后一个CRC字节中发生位填充错误时的行为。

image.png

1.3.6 USB包时序

USB规范定义了数据包间时间。ULPI规范通过指定PHY和LINK可用的时钟周期的预算,将这些定时关联回ULPI接口。

PHY必须在给定的定时范围内处理数据。

类似地,LINK必须在给定的决策时间内做出响应,或者如果在给定的时间范围内没有收到响应,则超时。以下详细说明所有要求的ULPI数据包间定时,并源自USB规范和UTMI PHY处理和同步延迟(来自UTMI规范)。

1. USB数据包间延迟和数据包超时

全速数据包间延迟是从第一个数据包的SE0到J转换到第二个数据包上的SYNC域开始测量的。

高速包间延迟是从总线在第一包结束时进入空闲状态开始测量的,直到总线在第二个数据包开始时离开空闲状态时计算。

一个时钟周期有8个HS位时间,一个FS位时间有5个时钟周期,一个LS位时间有40个时钟周期。如图所示

USB规格指定的包间时间

image.png

位宽和时钟关系

image.png

Transmit-Receive时间:在USB规范中定义为,最大连接的USB系统,包括通过6根USB电缆、5个外部集线器和下游主机或外围设备的来回程时间。

2.PHY****管道延迟

使用ULPI接口的任何PHY必须符合表中给出的时序。

USB总线事件是相对于D+和D-线上的转换来测量的。

ULPI接口定时是相对于检测到转换的时钟边缘来测量的(例如,PHY在时钟de 边缘检测stp).

image.png

RX CMD Delay:与UTMI的线路状态延迟2-3个时钟相同,但由于RX CMD期间ULPI总线周转turn around,最大值增加了1个额外的时钟周期。

3.LINK决策时间

下表给出了为各种包序列分配给ULPI LINK的时间。当LINK传输第二个数据包时,它必须满足数据包间的延迟。当LINK期望对传输的数据包做出响应时,它必须对数据包间延迟进行计时,以检测超时。对于连续接收数据包,LINK必须能够在给定的时间内接收它们。

image.png

Transmit-Transmit,Receive-Transmit:与UTMI的FS SIE决策时间7-19时钟相同,但由于ULPI PHY在RX CMD期间需要总线周转turn around,因此从最大值减去1个时钟周期.

Transmit-Receive,UTMI规范说明高速传输到接收时间不正确,应忽略。

4.内部包时序图

如图说明了各种包序列的PHY管道延迟和LINK决策时间。

高速发送-发送包时序

image.png

高速接收-发送包时序

image.png

1.4寄存器操作

1.4.1 立即寄存器读写

寄存器写

LINK发送寄存器写入命令字节并等待nxt拉高。在nxt拉高之后的时钟周期中,Link发送写入寄存器的数据,并等待nxt再次拉高。当nxt第二次拉高时,Link在下一个时钟周期中拉高stp以完成操作。PHY必须检测stp拉高,然后才能接受另一个传输命令。如果PHY通过拉高dir中止RegWrite,则LINK必须在总线空闲时重试RegWrite。

image.png

寄存器读

LINK发送寄存器读取命令字节并等待nxt的拉高。在nxt拉高之后的时钟周期中,PHY拉高dir以获得对数据总线的控制。在dir拉高之后的时钟周期中,PHY必须返回寄存器读取数据。

当在寄存器读取操作期间,即使是在寄存器内容返回的时钟周期拉高dir,PHY也不拉高nxt。

这允许USB数据接收在任何时钟周期内始终优先于寄存器读取。如果PHY早于下图中所示时刻拉高dir中止RegRead,则当总线空闲时,LINK必须重试RegRead

image.png

1.4.2 USB数据接收中止立即寄存器读写

寄存器读取是ULPI不使用nxt来掐断数据的唯一实例。nxt信号仅在USB接收期间被拉高,使得LINK能够始终将USB数据接收与其他数据传输区分开来。

下显示了在初始发送命令字节期间被USB接收中止的寄存器读取或写入。

image.png

下图显示了在寄存器读取数据返回到LINK的同一时钟周期内,USB接收中止了寄存器读取。

image.png

在以上两种情况下,PHY都拉高dir和nxt以指示RxActive。

寄存器读取和写入操作也会因PHY发送RX CMD而中止,除非是在寄存器读取数据返回到LINK的时钟周期内。

1.4.3 连续的寄存器读写和USB数据接收

下图显示了在寄存器读取数据返回到LINK的同一周期中发生的USB数据接收。PHY必须首先返回寄存器读取数据,而不是指示RxActive的RX CMD字节。PHY在下一个周期中指示RxActive,将USB接收数据与寄存器读取连续放置

image.png

下图显示了在寄存器读取完成后的时钟中立即发生的USB数据接收。PHY将USB接收数据与寄存器读取连续放置。

LINK必须能够接受连续的数据包,其中dir不会在数据包之间拉低。

image.png

如下图所示,如果dir在寄存器写入操作结束时拉高stp的同一时钟周期拉高,则PHY认为寄存器写入已成功完成。PHY不会因为stp而拉低dir。

image.png

下图显示了在寄存器读取数据返回到LINK后的时钟周期中开始的USB数据接收。

注意,当dir在一个周期周期内拉低时,总线周转turn around的两个周期。

image.png

在所有情况下,PHY拉高dir和nxt以指示RxActive。

1.4.4 扩展寄存器读写

对立即寄存器地址2Fh的访问表示对扩展寄存器集的访问。在这种情况下,地址在下一个时钟周期内可用。

寄存器写

对于扩展寄存器写入,如图所示,Link发送一个地址设置为2Fh的寄存器写入命令,并等待nxt拉高。在nxt拉高之后的时钟周期中,Link发送扩展寄存器地址,并等待nxt再次拉高。

当 nxt 第二次拉高时,LINK发送寄存器写入数据并等待 nxt 再次拉高。当nxt第三次拉高,LINK在接下来的时钟周期拉高stp,以完成操作。如果PHY通过拉高dir中止RegWrite,则LINK必须在总线空闲时重试RegWrite。

image.png

寄存器读

对于扩展寄存器读取,如图所示,Link发送一个地址设置为2Fh的寄存器读取命令,并等待nxt拉高。在nxt拉高之后的周期中,Link发送扩展寄存器地址,并等待nxt再次拉高。当nxt第二次拉高时,PHY拉高dir以获得对数据总线的控制。在dir拉高之后的周期中,PHY返回寄存器读取数据。当在寄存器读取操作期间拉高dir时,即使在返回寄存器读取数据的时钟周期期间,PHY也不拉高nxt。这允许USB接收在任何周期内优先于寄存器读取。如果PHY在下图所示之前通过拉高dir中止RegRead,则当总线空闲时,LINK必须重试RegRead

image.png

1.4.5 扩展寄存器读写被连续的USB数据接收中止

除了扩展地址字节周期外,扩展寄存器读取与立即寄存器读取相同。

有一个额外的情况,如图所示,在扩展地址周期期间,USB接收中止了扩展寄存器读取。

image.png

PHY发送RX CMD也会中止扩展寄存器读取和写入操作,但在寄存器读取数据返回到LINK的周期期间除外。

1.5中止ULPI传输

1.5.1 LINK中止PHY

当LINK在ULPI总线上传输数据时,PHY可以通过拉高dir来中止LINK。ULPI没有指定任何会导致这种情况发生的条件。

1.5.2 PHY中止LINK

当PHY在同步模式下拉高了dir时,LINK可以通过拉高stp来中止PHY,如图所示。

在下一个周期中,PHY必须拉低dir,并保持拉低dir直到Link事务完成。如果LINK如图所示执行寄存器写入或USB传输,则PHY必须等待序列末尾的stp脉冲,然后才能重新拉高dir。如果LINK执行寄存器读取,PHY必须返回寄存器读取数据,如图所示,并且如果需要进行USB接收数据或RX CMD,则允许继续拉高dir。

image.png

image.png

LINK不能在拉高dir的同一周期中中止PHY,并且PHY必须在其首次拉高dir的相同周期中忽略stp。

如果LINK在与拉低dir相同的周期中拉高stp,则PHY必须仍然保证LINK事务。

当PHY中止时,LINK必须在周转turn around周期后立即驱动TX CMD。如果LINK没有立即驱动TX CMD,则允许PHY重新拉高dir,如图所示。

所有ULPI PHY实现必须支持被拉高stp的LINK中止。虽然该功能可以在任何时候使用,但它主要用于LINK通过禁用PHY来关闭babbling端口。如果LINK在USB接收数据包期间拉高stp,则PHY不能保证当前包和下一包期间USB数据的有效性。

image.png

1.6 USB操作

以下部分描述了LINK和PHY必须如何在ULPI总线上进行通信,以执行特定的USB操作序列。

图表是在时间轴上水平压缩的,而不是按比例压缩的。

1.6.1 高速检测握手(Chirp)

高速检测握手,或称Chirp,如图所示,注意,图中的时间不是按比例排列的,也没有显示所有RX CMD更新。总线周转周期turn around也没有显示,并且必须在dir的每次拉高和拉低后发生一个周期。

必须遵循以下事件顺序

1.FS/LS检测–如果D-为高,主机检测外围设备连接为低速,如果D+为高,则检测为全速。如果主机检测到低速外围设备,则不遵循此协议的其余部分。

2.主机驱动-如果主机检测到全速外围设备,它会通过写入功能控制寄存器并设置XcvrSelect=00b(HS)和TermSelect=0b来重置外围设备,从而驱动总线上的SE0(D+和D-通过45欧接地).主机还设置OpMode=10b用于正确的Chirp发射和接收,接收Chirp会使LineState以不同的方式进行编码,并考虑高速差分接收器输出,以免出现错误的总线活动。SE0的起点标记为T0。设备PHY拉高dir,并使用RX CMD向LINK通知线路状态改变。

3.设备响应-在检测到SE0不少于2.5us后,如果设备具有高速功能,则设备LINK将XcvrSelect设置为00b(HS),将OpMode设置为10b(chirp),并立即发送一个TX CMD(NOPID),发送一个chirp K不少于1ms。并且chirp K必须在复位时间T0之后不超过7ms结束。如果设备处于低功率模式,它必须在5.6ms内唤醒其时钟,留下200us用于LINK开始传输chirp K信号,留下1.2ms用于chirp信号完成(最坏情况下,时钟慢10%)

4.主机响应–如果主机未检测到设备chirp,则必须继续发送SE0,直到重置结束。如果主机在总线离开chirp K状态后检测到设chirp K不少于2.5us、然后不多于100us,主机发送具有交替的chirp K和J序列的TX CMD(NOPID)。每个单独的chirp K或J必须持续不少于40us且不超过60us。

5.HS空闲–设备必须检测到最小的chirp K-J-K-J-K-J。每个单独的chirp K和J必须被检测至少2.5us。在看到该最小序列之后,设备LINK设置TermSelect=0b和OpMode=00b。设备现在处于高速模式,看到LineState的!squelch。当设备在LineState上看到squelch(10b)时,它知道主机已经完成了chirp,并等待高速USB通信开始。发送chirp序列后,主机将OpMode更改为00b,并开始发送USB数据包.

image.png

1.6.2 前导

USB将前导数据包定义为低速数据包的报头,低速数据包必须在主机和集线器之间通过全速总线传输。要进入前导码模式,LINK在功能控制寄存器中设置XcvrSelect=11b。当处于前导码模式时,PHY的操作与全速模式相同,并以全速上升和下降时间发送所有数据。每当LINK以前导码模式发送USB数据包时,PHY必须在以低速比特率发送LINK数据包之前以全速比特率自动发送前导码报头。PHY必须确保全速PRE-PID的最后一位和低速包SYNC的第一位之间的最小间隙为4个全速位时间。在发送PRE PID之后,PHY必须驱动J至少1 FS位时间,之后上拉电阻器可以在总线上保持J状态。

在前导码模式中,PHY还可以从全速总线接收低速包。

image.png

1.6.3 Usb挂起和恢复

挂起和恢复由HOST或者HUB启动

1. 低速挂起和恢复

下图说明了主机或集线器如何进入低速挂起状态,然后启动恢复信号以唤醒下游低速设备。图计中时不是按比例进行的,也没有显示所有RX CMD线路状态更新。总线周转周期也没有显示,并且必须在dir的每次拉高和拉低后发生一个时钟周期。以下描述了事件的过程。

1.LS通讯-最初,主机和设备通过USB总线发送低速流量(XcvrSelect设置为10b)。主机有其15kΩ 下拉已启用(DpPulldown和DmPullddown设置为1b)和45Ω 终端已禁用(TermSelect设置为1b)。设备具有1.5kΩ 上拉连接到D-(TermSelect设置为1b)。

2.LS挂起–当设备在3ms内没有看到总线活动时,它进入挂起状态。设备的LINK通过设置SuspendM位将PHY置于低功率模式,从而使PHY仅汲取挂起电流。主机可能断电,也可能未断电。

3.恢复K–当主机想要唤醒设备时,它将OpMode设置为10b,并传输LS K至少20ms。设备的LINK看到线路状态上的恢复K(01b),并拉高stp以唤醒PHY

4.EOP–当stp被拉高时,主机PHY自动附加一个LS EOP(2位LS SE0,后跟1位LS J)。主机PHY知道添加LS EOP,因为主机的DpPulldown和DmPulldown被设置为1b。LS EOP完成后,主机LINK将OpMode设置为00b以进行正常LS操作。设备的LINK看到LS EOP并恢复正常LS操作

image.png

2. 全速挂起和恢复

下图说明了主机或集线器如何进入全速挂起,然后启动恢复信号以唤醒下游全速设备。

图中计时不是按比例进行的,也没有显示所有RX CMD线路状态更新。总线周转周期也没有显示,并且必须在dir的每次拉高和拉低后发生一个周期。以下描述了事件的过程。

1.FS通讯-最初,主机和设备通过USB总线进行全速数据传输(XcvrSelect设置为01b)。主机其15kΩ 下拉已启用(DpPulldown和DmPullddown设置为1b)和45Ω 终端已禁用(TermSelect设置为1b)。设备的1.5kΩ 上拉连接到D+(TermSelect设置为1b)。

2.FS挂起–当设备在3ms内没有看到总线活动时,它进入挂起状态。设备的LINK通过设置SuspendM位将PHY置于低功率模式,从而使PHY仅汲取挂起电流。主机可能断电,也可能未断电。

3.Resume K–当主机想要唤醒设备时,它将OpMode设置为10b,并传输FSK至少20ms。设备的LINK看到线路状态上的恢复K(10b),并拉高stp以唤醒PHY

4.EOP–当stp被拉高时,主机PHY自动附加一个LS EOP(2位LS SE0,后跟1位FS J)。主机PHY知道添加LS EOP,因为主机的DpPulldown和DmPulldown被设置为1b。LS EOP完成后,主机LINK将OpMode设置为00b以进行正常FS操作。设备的LINK看到LS EOP并恢复正常的FS操作。

image.png

3. 高速挂起和恢复

下图说明了高速主机或集线器如何进入全速挂起状态,然后启动恢复信号以唤醒下游高速设备。图中计时不是按比例进行的,也没有显示所有RX CMD线路状态更新。总线周转周期也没有显示,并且必须在dir的每次拉高和拉低后发生一个周期。以下描述了事件的过程。

1.HS通讯-最初,主机和外围设备通过USB总线进行高速数据传输(XcvrSelect设置为00b)。主机的15kΩ 下拉电阻已启用(DpPulldown和DmPullddown设置为1b)和45Ω 终端电阻已启用(TermSelect设置为0b)。设备的45Ω 终端电阻已启用(TermSelect设置为0b)。

2.FS挂起–当设备在3ms内没有看到总线活动时,它进入挂起状态。设备的LINK将PHY置于全速模式(XcvrSelect设置为01b),删除45Ω 终止并启用1.5kΩ D+上拉(TermSelect设置为1b)。然后,设备的LINK设置SuspendM将PHY置于低功率模式,从而使PHY仅汲取挂起电流。主机也更改为全速(XcvrSelect设置为01b),删除45Ω 终端电阻(TermSelect设置为1b),然后可能断电也可能不断电

3.Resume K–当主机想要唤醒设备时,它将OpMode设置为10b,并传输FSK至少20ms。设备的LINK看到线路状态上的恢复K(10b),并拉高stp以唤醒PHY。

4.HS通讯-主机LINK设置高速(XcvrSelect设置为00b),并启用其45Ω 终端(TermSelect设置为0b)。设备的LINK在USB总线上看到SE0,并设置高速(XcvrSelect设置为00b),并启用其45Ω 终端(TermSelect设置为0b)。主机的LINK将OpMode设置为00b以进行正常HS操作

图片

1.6.4 远程唤醒

设备启动远程唤醒(恢复)。当置于USB挂起状态时,Link会记住它最初的操作速度。根据原始速度,LINK遵循以下详细说明的协议之一。下图中,计时不是按比例进行的,并且没有显示所有RX CMD线路状态更新。总线周转周期也没有显示,并且必须在dir的每次拉高和拉低后发生一个周期。

1. 低速远程唤醒

图片

A)主机和设备都以低功耗模式启动。

B) 外设通过重新启用其时钟并设置其SuspendM位来开始远程唤醒。

C) 设备开始驱动总线上的K以发出恢复信号。设备的LINK在传输时应假设线路状态为K(01b)

D) 主机识别恢复,重新启用其时钟并设置其SuspendM位

E) 主机在检测到远程唤醒后1毫秒内接管恢复驱动程序。如果时钟不能在1ms内重新启动,PHY必须实现自动恢复功能。

F) 设备停止驱动恢复

G) 设备看到主机继续驱动恢复。

H) 主机停止驱动恢复,PHY将LS EOP添加到低速恢复的末尾。设备将LS EOP识别为恢复的结束。T1为LS EOP间隔。

J) 主机和设备都通过将OpMode写入正常来恢复正常操作。

2. 全速远程唤醒

image.png

A)主机和设备都以低功耗模式启动

B)外设通过重新启用其时钟并设置其SuspendM位来开始远程唤醒。

C)设备开始驱动总线上的K以发出恢复信号。设备的LINK在发送时应假定线路状态为K(10b)。

D)主机识别恢复,重新启用其时钟并设置其SuspendM位

E)主机在检测到远程唤醒后1毫秒内接管恢复驱动程序。如果时钟不能在1ms内重新启动,PHY必须实现自动恢复功能。

F)设备停止驱动恢复

G)设备看到主机继续驱动恢复

H)主机停止驱动恢复,PHY将LS EOP添加到全速恢复的末尾。设备将LS EOP识别为恢复的结束。(T1是LS EOP间隔。)

I)主机和设备都通过写入OpMode和XcvrSelect恢复到正常操作。

3. 高速远程恢复

image.png

A)主机和设备都以低功耗模式启动

B)设备通过重新启用其时钟并设置其SuspendM位(1)开始远程唤醒

C)设备开始驱动总线上的K以发出恢复信号。设备的LINK在发送时应假定线路状态为K(10b)。

D)主机识别恢复,重新启用其时钟并设置其SuspendM位(2)

E)主机在检测到远程唤醒后1毫秒内接管恢复驱动程序。如果时钟不能在1ms内重新启动,PHY必须实现自动恢复功能。

F)设备停止驱动恢复。

G)设备看到主机继续驱动恢复

H)主机停止驱动恢复,总线返回高速空闲状态。设备将高速空闲识别为恢复结束。(T1是LS EOP间隔。

I)主机和设备都通过写入OpMode、XcvrSelect和TermSelect恢复到正常操作

4. 自动恢复

当USB主机检测到来自下游设备或集线器的远程唤醒信号(resume-K)时,主机必须在1ms内接管resume-K信号的驱动。

如果PHY处于主机模式,时钟断电,并且PHY检测到远程唤醒信号,则LINK必须唤醒时钟并接管resume-K信号的驱动。如果时钟无法在1ms内重新启动,PHY必须提供自动恢复功能。如图所示,PHY必须在内部驱动resume-K,直到时钟恢复并接收到NOPID类型的TXCMD。

当时钟恢复时,LINK通过发送NOPID类型的TXCMD来接管resume-K的驱动。当在自动恢复和由NOPID命令中的LINK驱动的恢复-K之间转换时,PHY必须确保在恢复序列期间没有故障。PHY还必须确保在退出低功率模式之前将SuspendM寄存器位自动设置为1b。

实现由PHY供应商确定,但是PHY供应商必须指定时钟唤醒时间TSTART_HOST。

如果时钟可以在1ms内重新启动,则PHY不需要提供自动恢复功能。

接口控制寄存器中的自动恢复位控制自动恢复功能。

图片

1.6.5 设备连接和断开连接检测

USB 中断状态寄存器中的主机断开位指示设备何时连接或断开,并且仅在 PHY 用作主机时才有效(DpPulldown 和 DmPulldown 均设置为 1b)。当用作主机PHY时,未屏蔽的HostDisconnect中的更改会导致PHY生成中断事件通知。

当用作设备(DpPulldown设置为0b)时,PHY决不能生成指示主机断开连接事件的中断事件通知。

1.6.6无SYNC和EOP产生(Opmode11b)可选

此模式会影响数据包的传输方式,并且只能用于高速。

当OpMode设置为11b时,PHY在发送包时不会自动添加SYNC和EOP。PHY必须仍然对数据进行NRZI编码并执行比特填充。当LINK想要传输USB数据包时,它必须发送NOPID类型的TX CMD。在NOPID命令之后,LINK在ULPI总线上发送一个4字节的SYNC模式(00h,00h,0h,80h),然后是PID、数据有效载荷,最后是一个1字节的EOP(FEh),如图所示。不支持UTMI+的TxBitstuffEnable信号。PHY在启动数据包时自动启用位填充,在拉高STP时禁用位填充。LINK在其驱动EOP字节的同一周期中拉高stp。如果在stp被拉高时数据被设置为00h,则PHY将不会在USB总线上传输任何EOP。PHY必须检测PID字节是否为A5h(SOF数据包),并在stp被拉高时自动发送长EOP。为了传输chirp和恢复信号,LINK必须将OpMode设置为10b。

当OpMode设置为11b时发送PID类型的TX CMD将导致未定义的行为。当OpMode为11b时接收RX CMD和USB接收数据包的操作与OpMode 00b相同

image.png

1.7Vbus电源控制(内部和外部)

LINK通过设置OTG控制寄存器中的DrvVbus位来打开Vbus。如果Vbus电源在PHY外部,则LINK在OTG控制寄存器中设置DrvVbus和可选的DrvVbusExternal位。VBUS控制设置如下表:

图片

1.8 OTG操作

1.8.1 会话请求协议(SRP)

ULPI提供完整的SRP支持。LINK使用OTG控制寄存器中的ChrgVbus和DischrgVbus位来开始和结束会话。

1.8.2 主机协商协议(HNP)(可选)

ULPI未定义HNP支持。假设HNP是在LINK硬件和/或软件中实现的。这并不妨碍PHY实现者向任何ULPI PHY添加HNP支持,只要其不干扰或违反本规范中定义的ULPI协议即可。

1.8.3 VBUS比较器阈值

虽然OTG规范提供了单独的A设备和B设备可用的比较器,但具有0.8V至2.0V阈值(VA_SESS_VLD)的A设备比较器也可用于需要0.8V至4.0V阈值(VB_SESS_VLD)的B设备比较器,从而消除了对单独的B设备比较器的需要。具有单独的A设备和B设备比较器的实现可以映射到单个定义(VSESS_VLD)中。ULPI Vbus比较器阈值如表所示。

VA_VBUS_VLD阈值的目的是允许A设备确定其是否能够在VBUS上输出有效电压。因此,ULPI未指定VA_VBUS_VLD阈值的上限,然而,该阈值的上限通常取决于A设备电源的特性。因此如果A器件电源通过将VBUS驱动到VA_VBUS_REF的基准来操作,并且当其目标设备列表上的B设备没有汲取太多电流时,输出电压不会下降到x%以下,则阈值电压将是:

4.4V

图片

如果VBUS电源在PHY外部并且外部电源提供指示VBUS何时有效的信号,

建议该信号是可选引脚ExternalVbusIndicator上PHY的输入,并且该引脚的状态通过RX CMD字节中的VA_VBUS_VLD≤VBUS指示反映到LINK。OTG控制寄存器中的可选UseExternalVbusIndicator位在内部和外部VbusValid指示器之间进行选择

为了支持行业标准的USB电源控制设备,PHY可以可选地支持接口控制寄存器中的两个附加位,IndicatorPassThru和IndicatorComplement。这两个位允许可选的ExternalVbusIndicator引脚与来自功率控制设备的功率有效信号或过电流故障输出互操作,并适应来自功率控制装置的有效高信号或有效低信号。当ExternalVbusIndicator引脚上提供电源故障信号时,PHY必须使用内部VbusValid比较器的输出和外部电源故障信号的逻辑组合来生成VA_VBUS_VLD≤VBUS指示。

下表定义了UseExternalVbusIndicator、IndicatorPassThru和IndicatorComplement寄存器位的使用,以控制ExternalVbusIndicator输入引脚和内部VbusValid比较器输出的使用,从而在RX CMD字节中生成VA_VBUS_VLD≤VBUS指示。表中还列出了每种设置的典型应用。

RX CMD Vbus有效过电流条件

标准外围设备不应使用Vbus Valid来开始操作。内部VbusValid可能不表示Vbus在第五集线器层上有效,允许低至4.375V。因此设备应使用Session valid。

图片

下图提供了内部和外部VbusValid源的逻辑组合的图形表示,以及控制寄存器位如何影响RX CMD字节中的VA_VBUS_VLD≤VBUS指示。UseExternalVbusIndicator、IndicatorPassThru 和 IndicatorComplement 控制寄存器位是单独可选的。PHY可以实现可选控制位的任何组合,然而,如果实现控制位,则它们必须提供表中定义的功能。如果未实现任何控制位,则PHY有责任定义可选ExternalVbusIndicator引脚如何影响RX CMD字节中VA_VBUS_VLD≤VBUS指示的状态

RX CMD VA_VBUS_VLD≤VBUS指示源

图片

根据应用程序的不同,LINK应启用或禁用适当的VBUS中断。下表中给出了典型应用的示例设置,RXCMD中的VbusValid指示来自内部VbusValid比较器或外部Vbus指示输入。

典型应用所需的RX CMD中的VBus指示器

图片

1.9总结

同步模式是ULPI必须支持的且主要的模式,内容比较多,对于软件开发人员来说重点关注下总线时序,即数据是如何交互的,这样必要的的时候可以使用逻辑分析仪进行抓包分析。另外重点关注下各个状态是如何反应在ULPI的寄存器中的,可能底层分析时需要通过寄存器值分析当前状态。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    30

    文章

    5032

    浏览量

    117746
  • usb
    usb
    +关注

    关注

    59

    文章

    7436

    浏览量

    258217
  • PHY
    PHY
    +关注

    关注

    2

    文章

    265

    浏览量

    51009
  • USB驱动
    +关注

    关注

    1

    文章

    136

    浏览量

    19997
  • CMD5
    +关注

    关注

    0

    文章

    2

    浏览量

    7113
  • DWC2
    +关注

    关注

    0

    文章

    35

    浏览量

    98
收藏 人收藏

    评论

    相关推荐

    基于DWC2USB驱动开发-0x01开篇介绍与新思DWC2 USB2.0控制器简介

    本文转自公众号,欢迎关注 基于DWC2USB驱动开发-0x01开篇介绍与新思DWC2
    的头像 发表于 05-08 18:10 3173次阅读
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-0x01开篇<b class='flag-5'>介绍</b>与新思<b class='flag-5'>DWC2</b> <b class='flag-5'>USB</b>2.0控制器简介

    基于DWC2USB驱动开发-0x02 DWC2 USB2.0 IP功能特征介绍

    DWC2即新思(Synopsys )的DesignWare® Cores USB 2.0 HiSpeed On-The-Go (OTG)控制器IP,被大量使用。从linux的内核源码驱动中就带
    的头像 发表于 05-09 10:09 6147次阅读
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-0x02 <b class='flag-5'>DWC2</b> <b class='flag-5'>USB</b>2.0 IP功能特征<b class='flag-5'>介绍</b>

    基于DWC2USB驱动开发-0x08 ULPI接口协议概览

    本篇概述了ULPI相关的内容,内容比较多后面还有工作模式和寄存器相关内容会分开讲。
    的头像 发表于 06-02 13:08 5860次阅读
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-0x08 <b class='flag-5'>ULPI</b><b class='flag-5'>接口</b>协议概览

    基于DWC2USB驱动开发-0x0E 使用逻辑分析仪分析ULPI数据

    工欲善其事必先利其器,所以在USB开发中工具很重要,示波器,逻辑分析仪,USB协议分析仪等都不可少。在底层问题分析时缺少有力工具时很难进一步分析,本文分享了ULPI抓包分析,实际抓包波
    的头像 发表于 06-07 16:56 1166次阅读
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-0x0E 使用逻辑分析仪分析<b class='flag-5'>ULPI</b>数据

    基于DWC2USB驱动开发-IAD描述符详解

    本文转自公众号,欢迎关注 基于DWC2USB驱动开发-IAD描述符详解 (qq.com) 一.  前言 IAD描述符用于一个设备功能关联多个接口
    的头像 发表于 06-27 08:45 1.2w次阅读
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-IAD描述符详解

    基于DWC2USB驱动开发-USB复位详解

    本文转自公众号欢迎关注 基于DWC2USB驱动开发-USB复位详解 (qq.com) 一.前言          上一篇我们详细
    的头像 发表于 07-07 11:18 1.6w次阅读
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-<b class='flag-5'>USB</b>复位详解

    基于DWC2USB驱动开发-USB连接详解

    本文转自公众号,欢迎关注 基于DWC2USB驱动开发-USB连接详解 (qq.com) 一.前言   之前一直在阅读手册,规格书,练习招式
    的头像 发表于 07-07 08:46 2315次阅读
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-<b class='flag-5'>USB</b>连接详解

    基于DWC2USB驱动开发-设备类驱动框架

    本文转自公众号,欢迎关注 基于DWC2USB驱动开发-设备类驱动框架 (qq.com) 一.前言 从软件顶层,从数据流的角度来看
    的头像 发表于 07-16 15:56 673次阅读
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-设备类<b class='flag-5'>驱动</b>框架

    基于DWC2USB驱动开发-数据不能发送问题分析案例

    本文转自公众号欢迎关注 基于DWC2USB驱动开发-数据不能发送问题分析案例 (qq.com)   一.前言        对于驱动
    的头像 发表于 08-08 09:43 1137次阅读
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驱动</b><b class='flag-5'>开发</b>-数据不能发送问题分析案例

    Labview读取二进制文件(有的时候会自动添加0X0D到0x0A前面)

    我是利用Labview开发TCP/IP通信的,需要把接收的网络数据保存为二进制文件。用UltraEdit查看保存的文件里面有好多二进制值,0x00~0xFF,里面会有0x0A或者
    发表于 05-02 14:48

    请问AM335X USB0如何使用host模式

    本帖最后由 一只耳朵怪 于 2018-6-21 15:04 编辑 您好,AM335X u***0设置host模式,软件部分是不是只是在这个地方修改就行了,我的内核版本3.2static
    发表于 06-21 06:06

    VEE停止在0x0a(“LF”)更新

    0x0A(LF)(0x0A始终是70的第60个字节)是最后接收的字节。然后我得到错误701“文件结束或者没有找到数据“(这指的是真正解释为0x0A作为读取终结符的东西),下次我读取数据时我得到了丢失
    发表于 08-28 08:39

    串口接收,0x0a0x0d表示的什么?

    void USART1_IRQHandler(void){ u8 res; if(USART1->SR&(163)USART_RX_STA=0;//接收数据错误,重新开始接收 }}} }} 串口接收,0x0a0x0d,表示什
    发表于 08-19 03:09

    stm32识别TC35短信有两个“0x0d 0x0a”怎么解决?

    原子哥的串口代码里,遇到0x0d 0x0a就停止接收,但是从TC35模块读取短信时,前面的短信息说明,会有两个“0x0d 0x0a”,然后再到真正的短信内容,而这部分真正的短信内容就不
    发表于 08-28 08:00

    如何对基于hal库的DWC2 USB IP进行调试呢

    背景之前适配 DWC2 USB IP 的时候,主要是基于 st 的 hal 库来走的,当时我就对他们的 hal 库代码不满,只是无奈,迫于时间就没重构,果不其然,usb bug 一堆,随意举例,这还
    发表于 06-14 15:23