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

[复制链接]
2205|13
 楼主| nice9273 发表于 2019-6-26 22:02 来自手机 | 显示全部楼层 |阅读模式
本帖最后由 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 | 显示全部楼层
检查复位电路。
 楼主| nice9273 发表于 2019-6-27 09:14 来自手机 | 显示全部楼层
yiyigirl2014 发表于 2019-6-26 23:23
要做到上电重新复位。

stm32 做了上电复位电路的。你具体说的是那个复位电路。
waveforms 发表于 2019-6-27 11:20 | 显示全部楼层
PC重启会不会USB就没断电
zhangpf0 发表于 2019-6-27 14:42 | 显示全部楼层
waveforms 发表于 2019-6-27 11:20
PC重启会不会USB就没断电

很有可能,不是每个电脑断电后,USB也跟着断电的
 楼主| nice9273 发表于 2019-6-27 15:30 来自手机 | 显示全部楼层
本帖最后由 nice9273 于 2019-6-27 17:56 编辑
waveforms 发表于 2019-6-27 11:20
PC重启会不会USB就没断电


关机在开机,也不会识别,肯定断电从新上电了
 楼主| nice9273 发表于 2019-6-27 15:32 来自手机 | 显示全部楼层
而且我用短接帽模拟usb插拔 没有一次能识别,只有插拔usb接口才能识别。大家玩stm32 usb遇到过吗
 楼主| nice9273 发表于 2019-6-27 15:32 来自手机 | 显示全部楼层
而且我用短接帽模拟usb插拔 没有一次能识别,只有插拔usb接口才能识别。大家玩stm32 usb遇到过吗
 楼主| nice9273 发表于 2019-6-28 11:10 来自手机 | 显示全部楼层
本帖最后由 nice9273 于 2019-6-28 11:19 编辑

沉了吗,有大神帮忙分析下吗
哥是个传奇 发表于 2019-7-5 11:53 | 显示全部楼层
nice9273 发表于 2019-6-28 11:10
沉了吗,有大神帮忙分析下吗

有没有解决呢 遇到了同亚的问题
leihen0525 发表于 2019-7-5 17:35 | 显示全部楼层
是因为USB复位这一块设计有问题,正常情况下,只要USB主识别到USB从节点插入,会发送一个复位信号给USB从,USB从模块会捕捉到这个信号,然后复位USB从模块寄存器等相关配置,然后USB主会分配一个地址号给从,然后USB从会开始重新枚举配置符,最后根据PC的驱动建立USB端点连接。
下面是我的代码 这个例子是演示这个过程的
  1. void USB0_IRQHandler(void)
  2. {
  3.         //DisableInterrupts;
  4.         // 检测USB 模块是否解析到有效的复位。
  5.     if(K60.USB0->ISTAT_Bit.USBRST)
  6.     {
  7.         USB_Reset_Handler();
  8.         //EnableInterrupts;
  9.         return;
  10.     }

  11.     if(K60.USB0->ISTAT_Bit.SOFTOK)
  12.     {
  13.             //K60.USB0->ISTAT_Bit.SOFTOK=1;
  14.             K60.USB0->ISTAT=0x04;
  15.     }

  16.     // 检测STALL
  17.     if(K60.USB0->ISTAT_Bit.STALL)
  18.     {
  19.             if(K60.USB0->ENDPOINT[0].ENDPT_Bit.EPSTALL)
  20.             {
  21.                     K60.USB0->ENDPOINT[0].ENDPT_Bit.EPSTALL=0;
  22.             }
  23.             K60.USB0->ISTAT=0x80;
  24.             //K60.USB0->ISTAT_Bit.STALL=1;
  25.     }

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

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

  36.     // SLEEP
  37.     if(K60.USB0->ISTAT_Bit.SLEEP)
  38.     {
  39.         // 清除SLEEP中断
  40.             //K60.USB0->ISTAT_Bit.SLEEP=1;
  41.             K60.USB0->ISTAT=0x10;
  42.     }

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

  46.             //K60.USB0->ISTAT_Bit.ERROR=1;
  47.             K60.USB0->ISTAT=0x02;
  48.             while(1);
  49.     }
  50.     //EnableInterrupts;
  51. }
  1. void USB_Reset_Handler(void)
  2. {      

  3.         K60.USB0->CTL_Bit.ODDRST=1;

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

  8.             USB_States.EndPointStatus.EndPoint[i].Data=0;
  9.             USB_States.EndPointStatus.EndPoint[i].EVEN=0;
  10.             USB_States.EndPointStatus.EndPoint[i].ODD=0;
  11.             USB_States.EndPointStatus.EndPoint[i].Status=0;
  12.     }

  13.    

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

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

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

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

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

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

  27.     K60.USB0->CTL_Bit.ODDRST=0;


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


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

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

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

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

  41.     K60.USB0->CTL_Bit.TXSUSPENDTOKENBUSY=0;
  42. }
169535d1f195bdd163.png

评论

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

本版积分规则

1

主题

7

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部