【项目笔记_答题器】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)

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

Published by

风君子

独自遨游何稽首 揭天掀地慰生平