以前都是开发Host Only和Device Only,所以没关系过这三个东西,也没深入了解.现在做点基础学习.
ADP:Attach Detection Protocol
HNP:Host Negotiation Protocol
SRP:Session Request Protocol
ADP协议主要是用于检测设备的插入,监视VBUS的电平变化,如果这个电平变化达到某个阈值.认为插入了设备,然后就正式为VBUS提供电源(在此之前,只是给电容充能了,没有功率.),然后B设备要马上给出SRP请求,不然的话,主机会觉得,看起来这不是个合适的设备.
SRP协议主要是用于打开OTG设备的电源,在OTG设备中,Host和Device是自由切换的,但是总是由A器件供电,由A器件决定断电,但是要满足OTG设备的话,自身一定要具备电源.比如手机.举个例子就是两个手机,都是OTG设备.现在A设备觉得B不在通信,所以不给B提供VBUS,B如果没有得到VBUS,就不会开始通信.这样好像是个死局.所以B设备要让A设备打开VBUS,先在VBUS和D+引脚上给一个脉冲,然后A设备收到后,就打开VBUS,因为VBUS没有提供电源,他类似于悬空,所以电平也得到改变.这就是为什么OTG USB的单片机,他必然会带VBUS输入引脚(其实也是输出引脚).当然,如果不要VBUS引脚,只有D+有跳变脉冲,按照规范,A设备也会打开电源.
如下图是STM32F4-DISCO的图,VBUS明显连接到IO上了.并且VBUS是否打开也是由IO控制的.
HNP协议是用于交换主从设备的.主设备控制总线.有总线至高无上的控制权.ID管脚是OTG中特别重要的一部分.这里接到IO上.如果ID管脚接地,则该设备为A设备,若ID管脚悬空,则该设备是B设备,其中A设备是上电后是主机,B设备上电后是从机.即系统刚启动时,A设备是主设备,B设备是从设备.
下图所示,左边的设备是B设备(接地/从机),右边的USB设备是A设备(悬空/主机).
但是,既然是OTG设备,他就是可以变化的,不然得话,直接写死好了.比如手机,插电脑时候,他是设备,插U盘时候,他是主机.
在系统运行的过程中,USB设备的主从角色可能会变化,但是A设备/B设备的名称不会变化.也就是说,在系统运行过程中,A设备有可能从主设备变成从设备,但是A设备仍然叫做A设备;B设备类似, 另外,A设备始终是供电设备,而与A设备扮演的角色无关.即使A设备变成了从设备,仍然由A设备供电.
设备互换可以有什么用途呢,比如说,现在连接的是一个打印机和一个手机,但是很可惜,这个手机被初始化成B设备了.因为画板子的人忘了把ID拉出来了,真是该死啊.所以他成了B设备,然后OTG连接的打印机是个OTG设备,可以对外供电(比如那个USB口其实还是用来插U盘的.).然后不管是A还是B设备,检测空闲发生了一段时间,但是VBUS确实在使用,只好看谁先来给总线发RESET,谁就占有了总线,这样,主机就确认了.这样可以从原来是打印机主,抢为手机主.
从上面看来,HNP协议不依赖ID线,确实也是如此的,但是ID线是用于初始化确定设备本身职能重要的方法.
“下图所示,左边的设备是B设备(接地/从机),右边的USB设备是A设备(悬空/主机).”
这句话是不是写错了?ID接地才是A设备吧
@sonic_ll 没用写错,你可以假想以下,USB A头,如何让ID接地.
@TaterLi 左边的设备是B设备(悬空/从机),右边的USB设备是A设备(接地/主机),该是这样吧,图上也是这么画的
@shinobi 悬空是B设备
Hello,我发现你的博客中有很多图片无法显示出来,是我网络的问题吗?还是因为你的服务器在国外?
@huanglc 部分国产浏览器和广告插件会误杀,因为附件是通过远程调用s3获取的,获得的uri有hashtag.