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.
想问一下,如果用msp430F5系列的单片机做一个手持设备,使用锂电池供电,用USB可以充电和传输数据。现在有个问题:
USB在没有数据传输活动时会挂起,但是如果我充电的时候没有数据传输,USB挂起了,那不就不能充电了吗,如果有锂电池的话可以用锂电池维持系统工作,但是如果没有电池供电全靠USB的话,处理器和其他模块也不能工作了,这个应该怎么处理?能不能禁止USB挂起? 或者说有没有其他办法解决?
关于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设备的HOST一般都是PC机,所以只要你的PC机系统支持USB-IF设备协议,那么当插入USB-IF协议的slave设备的时候,PC机就会按照USB-IF的协议来与它通信,包括供电方式的控制。
所以要实现这个功能,不但PC主机要有这个功能,而且MSP430的USB这里的驱动也要相应的更改以满足USB-IF协议。
目前来讲,最好的办法还是如 Triton Zhang 的第3种方式来实现,定时唤醒,与PC机通信,来满足5V的大电流持续供电。
如果每3ms 都要与HOST通讯,那我系统就不用干别的了,太浪费资源了啊,我想要实现充电的时候,可以有数据传输,也可以没有,如果没有数据传输,每3ms发一次也无所谓,要是有数据传输,那不就乱了吗?再一个,我发的数据 主机怎么处理啊~
3ms对于一个主频25MHz的MSP430来说,已经是非常大的间隔了;
再一个数据传输可以利用USB的DMA来完成,只要MCU总线空闲,DMA就收发数据,USB也有自己独立的RAM Buffer;
所以没有什么问题,你可以试试。