【项目笔记_答题器】rp552d usb hid 在seewo win10 设备上启动无法识别
时间:2023-08-07 00:37:00
问题描述
现在的问题是,我们运输的设备可以在普通电脑上正常识别,但在西沃的平板电脑上很容易出现USB链接异常
STM32103VB STB USB 普通设备库
问题描述:
- 普通电脑上概率的出现已经接好了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 无论是开机测试还是重启测试再也没有出现
- 断连多次
- 无法识别
每次开机或者上电都是一次性连接完成,断连的检测逻辑一次都没有触发过
分析:这个生效的很可能是 连接设备成功之后的那个蜂鸣之后的延时 bsp_hw_delay_ms(300)
对于这个问题,暂时无法解释,先记录一下!