对于USB来说,我们都知道,其最大的特性就是支持热插拔。而对于STM32来说,从USB没有插入到插入是可以检查出来的;而从插入到扒出却无法检查出来。
在USB存在的情况下我们发送数据的没有问题的,如果在USB不存在的时候向USB发送数据是无法实现的,为此会遇到一系列问题。
为了保证代码的正常发送,一般来说,我们会通过标志进行判断,USB数据发送完成后程序会调用 EP1_IN_Callback()实现标志清除,只有USBSndMark为0时才表示数据发送完成,发送完成数据后,我们才可以发送下一帧数据,保证USB能够正确发送每一帧数据。
/*******************************************************************************
- * Function Name : EP1_IN_Callback.
- * Description : EP1 IN Callback Routine.
- * Input : None.
- * Output : None.
- * Return : None.
- *******************************************************************************/
- void EP1_IN_Callback(void)
- {
- SetEPTxStatus(ENDP1, EP_TX_NAK);
- USBSndMark = 0;
- }
/*******************************************************************************
- * Function Name : EP1_IN_SendDat.
- * Description : 数据发
- * Input : None.
- * Output : None.
- * Return : None.
- *******************************************************************************/
- void EP1_IN_SendDat(u8 *pDat, u16 len)
- {
- u16 timCnt = 0;
-
- while ((++timCnt < 4000) && (USBSndMark == 1)) ;
-
- if (USBSndMark == 0)
- {
- USBSndMark = 1;
- USB_SIL_Write(EP1_IN, pDat, len);
- }
- }
如果USB没有插入,而我们又不能判断,那么将会导致程序在
while ((++timCnt < 4000) && (USBSndMark == 1)) 地方延时,导致程序的实时性大大折扣,效率低下。为了提高整个代码的运行效率,我们在没有USB的情况下就不发送数,有USB的情况下才需要发送数据,这时就必须了解什么时候USB存在,什么时候USB不存在。
对于USB的插入我们可以通过bDeviceState 变量获取,如果此变量为 CONFIGURED表示连接正常,可以通过USB发送数据;但是USB的扒出并不会清除变量bDeviceState,而是保持为CONFIGURED,为此我们根本无法判断USB是否扒出。可能有点人说还有其他方式可以知道USB扒出,这个我不否则,但我没有找到,最终想到最好的方法就是坚持USB电源,如果USB有电源,我们可以判断bDeviceState的值,但USB电源都没有了,
- if (GPIO_ReadInputDataBit(CDS_USBC_PORT, CDS_USBC_PIN))
- {
- if (bDeviceState == CONFIGURED)
- {
- EP1_IN_SendDat(tmpBuf, 64);
- }
- }
- else
- {
- bDeviceState = UNCONNECTED;
- }
那么一定被扒出了,这是就不需要发送数据到USB了。
本帖最后由 zhaojun_xf 于 2014-2-14 15:02 编辑