文本分享USB2.0的suspend和resume以及其波形的测试。
参考USB2.0规格书的
11.9 Suspend and Resume P332
7.1.7.6 Suspending P154
7.1.7.7 Resume P156
11.8.4.1 Low-speed Keep-alive P332
7.2.3 Power Control During Suspend/Resume P176
所有设备都支持从任意powered状态到suspend状态,如下图所示。
检测到suspend状态的条件是检测到总线上持续大于3mS的Idle状态,检测到suspen条件后在不大于10mS内(实测一般是3ms左右)设备要进入suspend状态。而任意总线上的活动信号使得设备退出suspend。正常情况全/高速设备在每个帧/微帧发送SOF,防止设备进入suspend状态,低速则是每个帧的SOF出现时的keep-alive信号来防止设备进入suspend状态(Section 11.8.4.1 P332)。
Idle状态高速/全速是J信号(高速进入suspend也会断开端接电阻转为全速),低速是K信号,而J和K信号的产生是分别由在DP和DM的1.5k上拉电阻和15k下拉分压得到的。
3.3v分压则为3.3V*15/16.5=3V。此时电阻会产生电流3.3V/16.5k=200uA,所以USB接口天生不是为超低功耗而生的,仅仅是suspend无法做到超低功耗,超低功耗需求200uA已经是非常大了,很多要求都是小于uA级别。
Idel信号参考规格书的7.1.7.1 Low-/Full-speed Signaling Levels P144和7.1.7.2 Full-/High-speed Signaling Levels P147
对于高速来说有一些需要注意的地方:
1.首先高速的reset和suspend开始一部分是一样的,都是Idle即J信号,所以当在高速模式下设备检测到数据线已经处于空闲状态至少3.0ms时,它必须在空闲状态开始后不迟于3.125ms(TWTREV)恢复到全速,恢复到全速即断开45欧端接电阻,然后上拉DP,转到全速之后在100uS~ 875uS (TWTRSTHS)时间之间采集总线状态,如果状态是全速的J则标明是suspend,如果是SE0则表示是驱动的RESET信号,此时需要进入速度枚举阶段Section 7.1.7.5。
当resume时,再自动返回到高速配置。
以下是高速的RESET和SUSPEND的对比
Reset可以参考文章https://mp.weixin.qq.com/s/8xKca-XPjZXAiO6MOQVGAQ 《基于DWC2的USB驱动开发-USB复位详解》
复位和SUSPEND对比如下
Suspend还有Global和Selective的概念参考规格书7.1.7.6.1和7.1.7.6.2的介绍,简单来说就是global就是整个总线suspend,Selective即hub的部分端口suspend。
suspend后所有USB设备最初默认为低功耗,此时电流限制在500µA以内。如果设备配置为高功率并启用为远程唤醒源,则在suspend期间可消耗最多2.5mA的电流。对于集线器最多2.5mA要分配给各个端口500uA,剩余的才是自己用。
在挂起状态下,设备可能会短暂地消耗超过平均电流的电流。电流尖峰的幅度不能超过设备功率分配100 mA(或500 mA)平均间隔允许最大1.0秒,在任何1.0秒的时间间隔(TSAVG1)内,平均电流不能超过平均暂停电流限制(ICCSH或ICCSL,见表7-7)。电流尖峰的上升沿不得超过100 mA/µs。由于上下拉电阻的存在,所以至少有200uA的消耗。
总线上任何活动信号都会让suspend状态的设备resume恢复。所以resume可以是host发起,也可以是设备发起,设备发起此时就是remote wakeup。关于remote wakeup还需要涉及到协议上的交互,后面单独分享一篇文章,本文就先按下不表。
主机可以在任何时候发出resume(TDRSMDN),且resume信号至少维持20ms(20ms的时间足够让所有总线上的设备都识别到),然后根据速度以不同方式结束。如果是低速/全速,则恢复信号必须以标准的低速EOP(两个低速bit时间的SE0,后面跟着J)结束。如果是高速则变为高速idle结束。Resume之后host要在至少3ms之内发送SOF或者数据包来避免再次进入suspend。
具有远程唤醒功能的设备可能不会生成恢复信令,除非总线已连续处于空闲状态必须在Idle状态维持至少5ms(TWTRSM)之后才能产生resume信号,让hub有足够时间进入suspend状态,并准备转发resume信号。远程唤醒必须保持resume信号持续在1~15ms(TDRSMUP)之间,完成后停止驱动总线(将其驱动器置于高阻抗状态,而不将总线驱动至J状态)。Hub会在接收到resume信号的1ms内开始转发该信号(TURSM)。
上述的1ms~15ms是因为hub传递resmue信号要在1ms以内,1ms以上可以确保其传递,然后最后一个hub,15ms内反向传播resume,所以不能持续大于15ms。控制集线器必须在1毫秒内传播resume信号(TURSM),并确保resume信号至少持续20毫秒(TDRSMDN)。
USB系统软件必须提供10毫秒的恢复时间(TRSMRCY),在此期间,不访问连接到受影响(刚刚激活)总线段的任何设备。
规格书中resume示意
要进行suspend和resume测试,需要host能进入对应状态发送对应信号,windows下挂房提供了工具,其实除了suspend和resume还能进行其他信号测试,这个有机会再单独分享一篇文章。
https://www.usb.org/documents下搜索XHSETT下载,如果是32位系统可以下载x32版本,如果是xp系统可以下载xp版本。
双击打开XHSETT 2.1.1.0 Installer_0.exe安装
同意license点击install
弹出用户账户控制对话框点击是
点击Next
同意license,next
继续Next
点击install
安装完成点击Finish
最后点击close
开始菜单打开软件
会弹出对话框选择主机控制器,如果有多个控制器,不知道对应哪个,可以打开UsbTreeView.exe查看
我这里看到的待测试的设备是位于USB3.10这个控制器下面。
我这里外部USB接口都是走的这个控制器,所以只能用这个控制器,如果有多个控制器可接,最好待测试设备单独接一个控制器,否则会影响鼠标等外设的使用。如果没有多个控制器,最好待测试设备单独再接一台测试电脑。
选择好控制器后点击continue
此时我这里鼠标不能使用了,只能用笔记本自带的触摸板了。
继续continue
选择device,右边默认选中了控制器,点击TEST
选择对应的设备,选择SUSPEND命令,点击EXECUTE
此时示波器可以看到停止了发送SOF包。
打印进入了SUSPEND。
再选择RESUME命令,点击EXECUTE,
此时示波器可以看到继续发送SOF包。
打印恢复了。
差分接,设置上升沿1.8V触发(因为suspend是J状态),测试软件发送suspend命令。
差分接,设置下降沿1.8V触发(因为resume是J变为k),测试软件发送resume命令。
单端接,设置DP High Too Long大于2mS触发。触发电平1V。测试软件发送suspend命令。
单端接,设置DP下降沿1V触发,测试软件发送resume命令。
某些高端示波器,比如keysight的MSOS804A有专门的USB测试功能,配合上面的软件和专门的测试板可以自动进行USB测试,可以测试对应的时间参数等。
菜单栏 Analyze->Automated Test Apps->D9010USBC USB Test App可以打开测试工具。有示波器的可以使用下,这里不再赘述。
1.Suspend和resume的信号还是比较简单的,建议实测一下波形,有个形象的了解。对于高速需要注意suspend会先切全速,resume自动恢复,了解下区分reset和suspend的原理。
2.注意下suspend时上拉电阻的电流消耗,这影响低功耗。
3.注意大部分usb控制器先进early suspend中断表示检测到3ms空闲的suspend条件,然后的suspend中断才表示真正进入suspend状态。