锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

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

时间:2023-08-07 00:37:00 stb11高速板到板连接器

问题描述

现在的问题是,我们运输的设备可以在普通电脑上正常识别,但在西沃的平板电脑上很容易出现USB链接异常

STM32103VB STB USB 普通设备库

在这里插入图片描述

问题描述:

  1. 普通电脑上概率的出现已经接好了USB启动时,电脑无法识别

在不同的系统同的系统中有不同的效果, 也有很多次上电后反复断开连接失败的问题


修改思路1:监控连接状态

这个想法是在高速版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("[ u ]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)

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

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章