This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

连续热插拔连接在am3352处理器USB接口上的4G通信模块,出现无法识别4G模块的问题

Other Parts Discussed in Thread: AM3352

在使用am3352的USB接口时遇到了一个很奇怪的问题,我将am3352的两个USB接口(USB0、USB1)都配置为了host,USB1接口连接一个4G模块,上电启动时,am3352能识别USB1接口上的4G模块,但每次都会打印ti81xx_interrupt 1145: VBUS error workaround (delay coming)提示。我们用示波器抓取了下4G模块热插拔时USB1_DRVVBUS(蓝色线)和USB1_VBUS(黄色)引脚的电平变化,如下图所示:

USB1接口上没有接任何设备时,USB1_DRVVBUS(蓝色线)和USB1_VBUS(黄色)都为高电平,当此时把4G模块插上时,USB1_VBUS上的电压会立即下降,这个我理解的是可能是由于4G模块连上时瞬间需要一个大电流,此时造成了USB1_VBUS上的电平拉低了,这个时候USB host会出现一个VBUS中断,也就是会打印ti81xx_interrupt 1145: VBUS error workaround (delay coming)提示,这个不知道理解的对不对?

另外,我们在做USB的极限测试时,当我连续多次热插拔4G模块后,有两种会出现USB接口无法识别4G模块的情况,当出现无法识别4G模块时,我们用示波器测量USB1_DRVVBUS和USB1_VBUS的电平,发现两者都为高,这个时候只有重新热插拔一次4G模块,USB接口才能识别4G模块;另一种情况就是USB1_DRVVBUS和USB1_VBUS的电平用示波器测得都是低电平,这个时候无论你怎么热插拔4G模块,USB接口都不会识别,只有断电重启或复位系统后才能够识别。连续热插拔为什么会出现这两种奇怪的现象呢?有没有解决的方法?

  • 首先请确认下USB OTG做Host时的原理图设计部分:

    http://processors.wiki.ti.com/index.php/AM335x_Schematic_Checklist#USB

  • 谢谢您的回复,按照您给的链接,我比对了下我们的电路设计,我们的原理图设计没有问题。我现在的想法是遇到上面的问题可不可以用软件的方法让usb控制器复位重启,怎么设置才能实现在用户态控制usb控制器重启呢?谢谢!

  • USB做为HOST的时候,应该是USB_VBUS_DRV控制USB_VBUS的enable,在不接USB外设的时候,应该是USB_VBUS为低电平才对。

    看你的描述,不接USB外设,USB_VBUS为5V电平,这个应该是有问题的。

  • 我又确认了下确实是没接USB外设的时候,USB_VBUS和USB_VBUS_DRV都为高电平,我们的电路设计是这样的:

    USB0_VBUS和USB1_VBUS是USB_VBUS,使能引脚USB0_DRVVBUS和USB1_DRVVBUS都连接了下拉电阻,在没插入USB外设时,测得U26芯片的1和4引脚都为高电平,5和8引脚也为高电平。按照您说的应该为低电平才对,这个硬件电路有没有问题?要是软件的原因的话,我修改软件的哪部分能够实现低电平呢?另外,软件部分修改哪部分可以实现usb控制器的复位?谢谢。

  • SP2526A是双路限流开关么?

    如果这两个口都做主口,USB_ID应该全部0欧姆电阻接地。

  • 最近公司一直忙着调试,忘了回复了,很抱歉,谢谢您的耐心指导。电路图没什么问题,最后更改了下内核,可以在用户空间操作让usb controler重新再次检测外接的设备,方法是修改内核的drivers/usb/musb/musb_procfs.c源代码,在musb_proc_write()函数中加入让USB0_DRVVBUS引脚置低的程序:

        case 'R':
            reg = musb_readb(mbase, MUSB_DEVCTL);
            reg &= ~MUSB_DEVCTL_SESSION;
            musb_writeb(mbase, MUSB_DEVCTL, reg);
            break;
    这样就可以在应用程序通过指令:
    echo R > /proc/driver/musb_hdrc.0
    echo F > /proc/driver/musb_hdrc.0
    实现usb重新检测外接设备的目的了,这种方法测试是可以用的。