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