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.

430单片机的USB模块

想问一下,如果用msp430F5系列的单片机做一个手持设备,使用锂电池供电,用USB可以充电和传输数据。现在有个问题:

USB在没有数据传输活动时会挂起,但是如果我充电的时候没有数据传输,USB挂起了,那不就不能充电了吗,如果有锂电池的话可以用锂电池维持系统工作,但是如果没有电池供电全靠USB的话,处理器和其他模块也不能工作了,这个应该怎么处理?能不能禁止USB挂起? 或者说有没有其他办法解决?

 

  • 不会的,USB内有两根电源线始终能输出5V电压,和数据线是否有数据无关。

  • 是能始终输出5v 但是USB挂起是电流<2.5mA,典型为500uA,这么小的电流我电池怎么充电....

  • 关于USB充电其实是一个很复杂的问题,在原来的USB2.0规范并没有考虑使用USB接口为USB设备的电池充电。USB Host端会监视USB总线,如果总线持续3ms没有数据传输的话,USB HOST会通知USB 设备在10ms内进入Suspend 状态,在这个状态时,主机提供不超过100uA的电流。这个时候就无法过USB接口充电。

    所以USBIF发布了一个BC(Battery Charging) 规范作为充电的补充,具体内容你可以参见USB BC的规范。事实上只有支持充电的USB端口才能持续地对USB的设备进行充电,标准的USB2.0端口由于存在suspend检测机制,如果不做任何处理就不能实现USB的设备充电。

    那么目前我们如何来解决这个问题呢?

    1. 用专用的USB充电器给USB设备充电,目前很多带USB接口的电源适配器就就很好的选择。

    2.  从机在接收到HOST发送的SUSPEND命令之后,向主机发送无效的数据,主机会重新启动SUSPEND检测,这样处理会带来一定缺陷,就是Host端的应用程序需要处理这些无效的数据。

    2. 还有一个办法就是我们可以利用MSP430的其他端口设计一个新的设备,让这个设备向USB的host定期发送数据(每3ms一次)来防止1USB HOST端挂起设备。

    总的来说,无论采用哪种方式处理,都有一定的缺陷和局限性,要想彻底解决充电问题,需要按照USB-IF的充电标准来实现。

  • 多谢你的回答。你说了这几条我明白了,但你说要想彻底解决充电问题,需要按照USB-IF的充电标准来实现。那只是个标准而已,硬件的东西都已经定型了,标准能改什么啊?现在得电脑USB口肯定都支持充电的,但是那些USB设备是怎么做到让电脑USB口不挂起的?比如最常见的手机充电,都是可以一边充电一边传数据,或者只充电不传数据,是怎么做到的?那个规范就是一堆英文而已。。。难道里面规定了什么特殊的描述符,来通知主机不挂起?

  • USB充电器内部在两个数据线,D+和D-之间会检测一个电阻,没有这个电阻,设备就不会充电。如果把USB线的数据线短路,也可以实现对设备充电。

  • USB设备的HOST一般都是PC机,所以只要你的PC机系统支持USB-IF设备协议,那么当插入USB-IF协议的slave设备的时候,PC机就会按照USB-IF的协议来与它通信,包括供电方式的控制。

    所以要实现这个功能,不但PC主机要有这个功能,而且MSP430的USB这里的驱动也要相应的更改以满足USB-IF协议。

    目前来讲,最好的办法还是如  的第3种方式来实现,定时唤醒,与PC机通信,来满足5V的大电流持续供电。

  • 如果每3ms 都要与HOST通讯,那我系统就不用干别的了,太浪费资源了啊,我想要实现充电的时候,可以有数据传输,也可以没有,如果没有数据传输,每3ms发一次也无所谓,要是有数据传输,那不就乱了吗?再一个,我发的数据 主机怎么处理啊~

  • 3ms对于一个主频25MHz的MSP430来说,已经是非常大的间隔了;

    再一个数据传输可以利用USB的DMA来完成,只要MCU总线空闲,DMA就收发数据,USB也有自己独立的RAM Buffer;

    所以没有什么问题,你可以试试。