打印

USB设备状态bDeviceState该如何处理的问题?

[复制链接]
6817|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Swd21ic|  楼主 | 2010-3-4 20:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 Swd21ic 于 2010-3-4 20:54 编辑

使用STM32 USB通信.  固件代码里有一个bDeviceState的变量. 用于表示USB设备(STM32)所处的状态.
typedef enum _DEVICE_STATE
{
  UNCONNECTED,
  ATTACHED,
  POWERED,
  SUSPENDED,
  ADDRESSED,
  CONFIGURED
} DEVICE_STATE;

在程序中编写一个发送函数USB_SendData. 在拷贝数据到PMA之前判断一下是否设备处于CONFIGURED状态..

....
if (bDeviceState ==  CONFIGURED)
{
       //简略表达...反正是要发送数据

       while (SendOver == 0);   //等待EPx_IN_Callback()置1

       UserToPMABufferCopy(buffer_in, ENDP1_TXADDR, 64);
       SetEPTxCount(ENDP1, 64);
       SetEPTxValid(ENDP1);
}
....

如果将USB断开, bDeviceState仍=CONFIGURED. 这时候程序再调用USB_SendData()函数会,导致等待EPx_IN_Callback()里的变量而锁死.

大家一般是如何处理这个的? 因为设备不是USB总线供电的,所以断开USB后设备依然会发送数据.
沙发
Swd21ic|  楼主 | 2010-3-5 09:34 | 只看该作者
暂时的解决方法: 在等待发送完成中设置一个超时, 一般情况是不会进入的. 如果超时了就认为USB线缆断掉了.把bDeviceState与SendOver标志全部恢复...测试了一下基本没有问题..

while (SendOver == 0)
{
    INT32 timeout;
    timeout++;
    if (timeout > 1000)   
    {
        // 超时啦.
        bDeviceState = UNCONNECTED;
        SendOver = 1;
        return;
     }
     .....

使用特权

评论回复
板凳
香水城| | 2010-3-5 14:27 | 只看该作者
一般情况下,将USB断开意味着把USB线缆拔掉,此时USB +5V消失,可以通过检测+5V消失来判断。

还有一种情况是主机不通信或进入睡眠,这时应进入SUSPENDED状态。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

71

主题

781

帖子

1

粉丝