【项目笔记_答题器】rp552d usb hid 在seewo win10 设备上启动无法识别

问题描述

现在的问题是,我们已经出货的设备在普通的电脑上都能正常识别,但是在西沃的平板上面的时候容易出现USB链接异常

STM32103VB + STB + USB 普通的设备库

在这里插入图片描述
在这里插入图片描述

出现问题的描述:

  1. 普通电脑上概率的出现,在已经接好USB的情况下启动,出现电脑无法识别的问题

这个在不同系统上测试有不同的效果, 也有多次出现上电之后反复断开连接多次会出现失败的问题


修改思路一:监测连接状态

这个思路是在高速版USB的版本中的一个出来断连的一个思路,于是在普通设备库中查找相关的变量

// usb_pwr.c
__IO uint32_t bDeviceState = UNCONNECTED; /* USB device status */

typedef enum _DEVICE_STATE
{
  UNCONNECTED,
  ATTACHED,
  POWERED,
  SUSPENDED,
  ADDRESSED,
  CONFIGURED
} DEVICE_STATE;

于是此处在发现在上电之后这个状态基本不成功,于是有如下处理

/* 在 main 函数中 while 循环中添加如下处理 */
if ((bsp_get_systick() - usb_run_time) > 15000)
{
	b_print("[ %10u ]usb: dev_s:%d\r\n", bsp_get_systick(), dev_s);
	if (dev_s != CONFIGURED)
	{
		usb_connect_s = 0;
		 GPIO_ResetBits(USB_DISCONNECT, USB_DISCONNECT_PIN);
		 b_print("usb: reset:%d\r\n", dev_s);
		 //BEEP_EN();
		 bsp_hw_delay_ms(300);
		 //BEEP_DISEN();
		 //USB 初始化
		 USB_Interrupts_Config();
		 Set_USBClock();
		 USB_Init();
		 //GPIO_SetBits(USB_DISCONNECT, USB_DISCONNECT_PIN);
	}
	usb_run_time = bsp_get_systick();
}

测试发现

此方法确实有效,在一般的电脑上电偶然能出现USB链接多次的情况,就是上电的时候有多次断开与链接的系统声音

注意:此处的15s 是一个极其重要的时间刻度,测试发现如果这个断开连接的时间如果太短(测试过10s),断开连接几次之后最后还是会出现未识别的状态:【猜测这个时间短断连多次之后,系统会放弃响应次设备的断连操作,导致看似这个断开连接的检测操作有时候会无效】


后记

当决定使用这个方式出现现场问题的时候,未来方便方便线程老师确认我们设备的连接状态,于是我们想修改这个USB的处理,想在连接成功的时候,来这个蜂鸣器提示音【之前这个提示音是在设备初始化完成之后会有提示,现在改为:USB连接成功之后提示,因为中间可能有几次USB断开连接的电脑提示音,我们的设备增加提示音可能效果会好一点】

记录所有的修改

/*******************************************************************************
  * @file    : main.c
  * @author  : Sam.wu
  * @version : v1.0.0
*******************************************************************************/
#include "main.h"
#include "usb_istr.h"
#include "platform_config.h"

/*******************************************************************************
  * 其他任务相关的变量
*******************************************************************************/
volatile uint32_t usb_run_time = 0;
volatile uint32_t usb_connect_s = 0;
uint32_t dev_s;

extern uint32_t USB_bDeviceState(void);

int main(void)
{
  u8 err = 0;
  ErrorStatus ret;
  uint32_t zlgt02_ver = 0;
  uint8_t i;
  //关闭中断
  GPIO_ResetBits(USB_DISCONNECT, USB_DISCONNECT_PIN);
  DISABLE_ALL_IRQ();
  //系统初始化
  Set_System();
  log_init();
  bsp_device_id_init();
  USB_Cable_Config(DISABLE);
  /*******************************************************************************
  * 加密等器件初始化
  *******************************************************************************/
  ENABLE_ALL_IRQ();
  /*******************************************************************************
  * 其他外设初始化
  *******************************************************************************/
  // USB初始化: 将USB初始化放在外设初始化的后面
  USB_Interrupts_Config();
  Set_USBClock();
  USB_Init();
  usb_run_time = bsp_get_systick();

  while (1)
  {
    /*******************************************************************************
    * 其他 任务运行函数
    *******************************************************************************/
    /* USB 链接状态监测 */
    dev_s = USB_bDeviceState();
    if (dev_s != CONFIGURED)
    {
      ledOn(LRED);
      bsp_hw_delay_ms(500);
      ledOff(LRED);
      bsp_hw_delay_ms(500);
      if ((bsp_get_systick() - usb_run_time) > 15000)
      {
        b_print("[ %10u ]usb: dev_s:%d\r\n", bsp_get_systick(), dev_s);
        if (dev_s != CONFIGURED)
        {
          usb_connect_s = 0;
          GPIO_ResetBits(USB_DISCONNECT, USB_DISCONNECT_PIN);
          b_print("usb: reset:%d\r\n", dev_s);
          //BEEP_EN();
          bsp_hw_delay_ms(300);
          //BEEP_DISEN();
          //USB初始化
          USB_Interrupts_Config();
          Set_USBClock();
          USB_Init();
          //GPIO_SetBits(USB_DISCONNECT, USB_DISCONNECT_PIN);
        }
        usb_run_time = bsp_get_systick();
      }
    }
    else
    {
      if (usb_connect_s == 0)
      {
        BEEP_EN();
        bsp_hw_delay_ms(300);
        BEEP_DISEN();
        usb_connect_s = 1;
      }
    }
  }
}
/*********************************END OF FILE**********************************/

经过测试,竟然发现在程序在,seewo 的设备上连接正常了,seewo 无论是开机测试还是重启测试再也没有出现

  1. 断连多次
  2. 无法识别

每次开机或者上电都是一次性连接完成,断连的检测逻辑一次都没有触发过

分析:这个生效的很可能是 连接设备成功之后的那个蜂鸣之后的延时 bsp_hw_delay_ms(300)

对于这个问题,暂时无法解释,先记录一下!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值