如题。
reset和disconnect
在OTG2.0中,当其配置程host模式,当host发送reset时D+/D-线都为低电平,这是USB协议侧的复位(与上电复位不同,协议上的复位是为了对连接的dev进行枚举,例如对端点0进行set address,set config等);在dev插入host之前,或者当与host连接的dev拔出后,插入D+和D-也为0。如何区分他俩?
对于全速和低速的dev,当其没有数据传输时,处于IDLE状态,D+或者D-的某一根线会被dev的上拉电阻拉高。当host发送复位,D+和D-都会被驱动为0,持续一段时间后,dev会检测D+和D-状态,确定此情况是host发送的复位信息;而当断开连接后,FS情况下,D+无驱动,变为0,LS情况下D-无驱动,变为0,dev没有电源供电了,即使D+D-都为0,dev自然不会再去检测这两根线代表什么含义了。同时,host这时候还是上电状态,其通过检测D+或者D-的拉低情况,能够立马判断出这是断开连接了。
对于HS情况,当其没有数据传输时,处于IDLE状态,D+和D-都为0,也就是SE0状态。这时候,又该如何区分reset和断开连接?
这里搬运USB中文网的结论。目前在RTL中没有看到检测差分信号的电平差值的代码,并且对于数字电路来说,波形上只有0/1之分,如何确定差分差值?并且,在当前生成的RTL的情况下,无法模拟dev disconnect的情况,尝试了好几天都不成功。只能存疑,日后补充。
suspend
当主机3ms内没有活动时(每隔1ms或者125us发送SOF也算作总线活动),dev应该将其当作一个挂起信号,并在规定的时间内挂起,同时将dev的电流降低到一定值。在挂起状态中,dev需要向D+/D-的上拉电阻提供电压以维持idle态,对于高速dev,收到挂起信号后,移除45欧的终端电阻,并在D+上重新挂载1.5k欧的上拉电阻(高速dev用全速信号进入挂起状态)。
对于host发送挂起命令,host自己当然知道自己处于要让设备进入挂起状态,所以此时host不会对D+/D-线进行检测,直到dev挂起后,才会对disconnect进行检测。
这个时候的disconnect的检测就和上文的第二段对应上了。