根据USB协议2.0的7.2.1.2.1 Over-Curent Protection和11.12.5 Over-current Reporting and Recovery规定,USB HOST和SELF-POWERED HUB必须执行过电流保护.保护包括两方面,一是HUB必须有办法检测过电流的情况并向USB软件报告,二是过电流限制机制不需要经过用户的机械干涉就可以重新复位.也就是11.12.5描述的Reporting and Recovery. 目前WINTV和手机部3108的设计里都没有OC保护,因此如果发生意外, 用户的USB设备马上报销,因为协议里没有说USB DEVICE必须对所接受的电流进行保护.
电路保护元器件主要有物理型的和电子型的两种.
1.物理型:自恢复保险丝(协议里提到的聚合PTC),热敏电阻,聚合开关,POLYSWITCH等,特点为
(1)可恢复性,过电流之后又恢复到常态,不必更换;
(2)阻抗高,一般说来,这种自恢复保险开关在电路正常状态下,其阻抗比相同的金属型熔断器高,这样,就增加了电子产品的电能消耗,对于以电池为电源的电子产品来说,这种情况是不可忽视的,在某些电路应用中,由于其电阻大而产生热噪声也是不能使用的原因;
(3)响应速度慢,如PolySwitch响应时间是1s,与金属型熔断器、电子型限流开关相比较,这种自恢复保险开关的响应速度慢,因而它不适用于保护那些对过电流特别敏感的电路;
(4)存在老化现象,这种有机聚合物自恢复保险开关是靠自己随温度变化的伸缩而实现过电流保护作用的,因而随着时间的推移,其特性会发生一些变化,在高可靠产品中使用这种自恢复保险开关时,要考虑这一特性;
(5)体积较大,与金属型熔断器、电子型限流开关相比较,其承受的功率密度较低,因而体积较大。
上面这几个特点是网上COPY来的,我不太理解为什么USB协议里提到可以用聚合PTC和固态开关做电流限制.物理型只能做到OC时"消除或减小所有受影响的下行口电源",并无须用户机械干涉的RECOVRY,但并不能将OC情况报告给软件知晓.
2.电子型.就是用芯片啦,编程只要抓住几个IN/OUT PIN就可以,它内部是怎么消除过大电流,又怎么能够输出OC INDICATER我们就不用管了,省事.我在网上找了几款CURRENT LIMIT的芯片,有的其实功能也不算强.比如AAT4610(http://www.analogictech.com/products/digitalfiles/AAT4610.pdf),它的5PIN分别是INPUT / OUTPUT / ON / GND / SET, ON是芯片使能,SET接个电阻来控制限制的电流强度,其他就没了. 这仍然无法把OC情况报告给软件,废.
MAX1607(http://pdfserv.maxim-ic.com/en/ds/MAX1607.pdf)就符合要求了,8 PIN中的第5 PIN是OC OUTPUT, 这个可以连接到PXA27X CPU的USBHPWR脚上,一旦OC发生,OC OUTPUT置低, USBHPWR得知后, 会立刻做下面几件事:
1. 把该PORT断开连接,并通过USBHPEN脚停止对VBUS供电(需要硬件上实现)
2. set UHCRHPSx[POCIC] = 1
3. set UHCRHPSx[PPS] = 0
4. 前面2和3的操作会影响UHCINTS[RHSC]位,触发中断处理程序.
在程序里,usb\hcd\common\cdevice.cpp对GetPortStatus返回的OC情况进行处理.
if ( hubStatus.change.port.OverCurrentChange )
{
if ( hubStatus.status.port.PortOverCurrent )
{
DetachDevice( port );
SetOrClearFeature( port, USB_REQUEST_CLEAR_FEATURE, USB_HUB_FEATURE_PORT_POWER );
}
else
{
hubStatus.change.port.ConnectStatusChange = 1;
}
}
如果是短路(比如电缆或接口老化)原因造成的OVER CURRENT, 我们可以在DetachDevice后, 在UI上弹出个警告框提醒用户, 让用户操作来干涉并纠正; 如果是暂时的OC产生中断, 而当查询时 hubStatus.status.port.PortOverCurrent=0, 则属于自动恢复, 在协议规定的范围内.
本文转自Walzer博客园博客,原文链接:http://www.cnblogs.com/walzer/archive/2006/02/05/325585.html,如需转载请自行联系原作者