打印
[STM32F1]

求助!stm32f103 usb设备pc重启后无法识别

[复制链接]
1823|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 nice9273 于 2019-6-27 09:18 编辑

stm32f103 usb键盘,DP恒上拉。pc重启后无法识别设备,从新插拔下识别正常。

使用特权

评论回复
沙发
yiyigirl2014| | 2019-6-26 23:23 | 只看该作者
系统不会复位导致的。

使用特权

评论回复
板凳
yiyigirl2014| | 2019-6-26 23:23 | 只看该作者
要做到上电重新复位。

使用特权

评论回复
地板
yiyigirl2014| | 2019-6-26 23:24 | 只看该作者
检查复位电路。

使用特权

评论回复
5
nice9273|  楼主 | 2019-6-27 09:14 | 只看该作者
yiyigirl2014 发表于 2019-6-26 23:23
要做到上电重新复位。

stm32 做了上电复位电路的。你具体说的是那个复位电路。

使用特权

评论回复
6
waveforms| | 2019-6-27 11:20 | 只看该作者
PC重启会不会USB就没断电

使用特权

评论回复
7
zhangpf0| | 2019-6-27 14:42 | 只看该作者
waveforms 发表于 2019-6-27 11:20
PC重启会不会USB就没断电

很有可能,不是每个电脑断电后,USB也跟着断电的

使用特权

评论回复
8
nice9273|  楼主 | 2019-6-27 15:30 | 只看该作者
本帖最后由 nice9273 于 2019-6-27 17:56 编辑
waveforms 发表于 2019-6-27 11:20
PC重启会不会USB就没断电


关机在开机,也不会识别,肯定断电从新上电了

使用特权

评论回复
9
nice9273|  楼主 | 2019-6-27 15:32 | 只看该作者
而且我用短接帽模拟usb插拔 没有一次能识别,只有插拔usb接口才能识别。大家玩stm32 usb遇到过吗

使用特权

评论回复
10
nice9273|  楼主 | 2019-6-27 15:32 | 只看该作者
而且我用短接帽模拟usb插拔 没有一次能识别,只有插拔usb接口才能识别。大家玩stm32 usb遇到过吗

使用特权

评论回复
11
nice9273|  楼主 | 2019-6-28 11:10 | 只看该作者
本帖最后由 nice9273 于 2019-6-28 11:19 编辑

沉了吗,有大神帮忙分析下吗

使用特权

评论回复
12
哥是个传奇| | 2019-7-5 11:53 | 只看该作者
nice9273 发表于 2019-6-28 11:10
沉了吗,有大神帮忙分析下吗

有没有解决呢 遇到了同亚的问题

使用特权

评论回复
13
leihen0525| | 2019-7-5 17:35 | 只看该作者
是因为USB复位这一块设计有问题,正常情况下,只要USB主识别到USB从节点插入,会发送一个复位信号给USB从,USB从模块会捕捉到这个信号,然后复位USB从模块寄存器等相关配置,然后USB主会分配一个地址号给从,然后USB从会开始重新枚举配置符,最后根据PC的驱动建立USB端点连接。
下面是我的代码 这个例子是演示这个过程的
void USB0_IRQHandler(void)
{
        //DisableInterrupts;
        // 检测USB 模块是否解析到有效的复位。
    if(K60.USB0->ISTAT_Bit.USBRST)
    {
        USB_Reset_Handler();
        //EnableInterrupts;
        return;
    }

    if(K60.USB0->ISTAT_Bit.SOFTOK)
    {
            //K60.USB0->ISTAT_Bit.SOFTOK=1;
            K60.USB0->ISTAT=0x04;
    }

    // 检测STALL
    if(K60.USB0->ISTAT_Bit.STALL)
    {
            if(K60.USB0->ENDPOINT[0].ENDPT_Bit.EPSTALL)
            {
                    K60.USB0->ENDPOINT[0].ENDPT_Bit.EPSTALL=0;
            }
            K60.USB0->ISTAT=0x80;
            //K60.USB0->ISTAT_Bit.STALL=1;
    }

    // 令牌完成中断
    if(K60.USB0->ISTAT_Bit.TOKDNE)
    {
            LED_SET_TimeOut_DATA(&LEDs.USB);
        // USB 处理函数
        handlers[K60.USB0->STAT_Bit.ENDP](K60.USB0->STAT);

        // 清除令牌完成中断
        //K60.USB0->ISTAT_Bit.TOKDNE=1;
        K60.USB0->ISTAT=0x08;
    }

    // SLEEP
    if(K60.USB0->ISTAT_Bit.SLEEP)
    {
        // 清除SLEEP中断
            //K60.USB0->ISTAT_Bit.SLEEP=1;
            K60.USB0->ISTAT=0x10;
    }

    // 错误
    if(K60.USB0->ISTAT_Bit.ERROR)
        {

            //K60.USB0->ISTAT_Bit.ERROR=1;
            K60.USB0->ISTAT=0x02;
            while(1);
    }
    //EnableInterrupts;
}
void USB_Reset_Handler(void)
{      

        K60.USB0->CTL_Bit.ODDRST=1;

    //禁止所有端点
    for(int i=0;i<16;i++)
    {
            K60.USB0->ENDPOINT[i].ENDPT=0;

            USB_States.EndPointStatus.EndPoint[i].Data=0;
            USB_States.EndPointStatus.EndPoint[i].EVEN=0;
            USB_States.EndPointStatus.EndPoint[i].ODD=0;
            USB_States.EndPointStatus.EndPoint[i].Status=0;
    }

   

    //K60.USB0->USBTRC0|=0x40;//强制设置第6位为1
    //端点0

    Table[BDT_INDEX(0, Rx, ODDx)].Addr = &USB_States.Buff_0[0][0];
    Table[BDT_INDEX(0, Rx, ODDx)].Desc = BDT_DESC2(ENDP_SIZE, 1);

    Table[BDT_INDEX(0, Rx, EVENx)].Addr = &USB_States.Buff_1[0][0];
    Table[BDT_INDEX(0, Rx, EVENx)].Desc = BDT_DESC2(ENDP_SIZE, 0);

    Table[BDT_INDEX(0, Tx, ODDx)].Addr=&USB_States.Buff_0_tx[0][0];
    Table[BDT_INDEX(0, Tx, ODDx)].Desc = 0;

    Table[BDT_INDEX(0, Tx, EVENx)].Addr=&USB_States.Buff_0_tx[1][0];
    Table[BDT_INDEX(0, Tx, EVENx)].Desc = 0;
   

    // 使能 EP0
    K60.USB0->ENDPOINT[0].ENDPT=0x0D;

    K60.USB0->CTL_Bit.ODDRST=0;


    // 清除所有的错误
    K60.USB0->ERRSTAT=0xFF;


    // 清除所有的中断标志
    K60.USB0->ISTAT=0xFF;

    // USB设备地址
    K60.USB0->ADDR=0x00;

    // 使能所有的错误中断
    K60.USB0->ERREN=0xFF;

    // USB模块中断使能
    K60.USB0->INTEN_Bit.TOKDNEEN=1;
    K60.USB0->INTEN_Bit.SOFTOKEN=1;
    K60.USB0->INTEN_Bit.ERROREN=1;
    K60.USB0->INTEN_Bit.USBRSTEN=1;

    K60.USB0->CTL_Bit.TXSUSPENDTOKENBUSY=0;
}

169535d1f195bdd163.png (202.15 KB )

169535d1f195bdd163.png

使用特权

评论回复
评论
哥是个传奇 2019-7-5 20:18 回复TA
我也遇到这个问题,重新插拔usb是可以正常建立连接的,问题是PC关闭再开启之后就不行了,需要再次拔掉USB再次插入才行,你可能没有明白楼主的问题 
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

7

帖子

0

粉丝