CH32V307的USB主设备 如何快速检测 外部是否有U盘插入?

我们在IAP 升级程序中,需要初始化USB设备,然后调用 IAP_Main_Deal()函数检测U盘是不是插入,如果失败就再次调用这个函数,指导200次之后,升级没成功则跳转到APP执行。

这样浪费了大量的时间,大概2秒-4秒左右。这个200次还不能少,少于200次则有时候能成功有时候不能升级成功,有没有什么办法,能快速检测这个USB的接口是否有U盘插入呢?



    
    int main()
    {
       //升级程序
        for(int k=0;k<200;k++)
        {
            printf("Check UsB:%d\r\n",k);
            if(k%50==0)
            GPIOC->OUTDR^=(GPIO_Pin_10 | GPIO_Pin_11);
            Delay_Ms(1);
            //如果成功升级会直接跳转到APP
            IAP_Main_Deal();
            
        }
        //升级没成功跳转到APP
        IAP_Jump_APP();
    }

我想了个办法,就是先将USB_DM USB_DP这两根线设置为输入信号, 如果检测到这两根线上任意一根为高电平则说明有设备连接上来了,这时候我再重新初始化为USB主机设备升级。我的检测程序如下,但是没有成功。以下是我的检测程序。请问我这个程序哪里不对哈,该怎么修改哈?

int USB_DetectDevice(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
    GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_11 | GPIO_Pin_12; //端口配置
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;           //IO口速度为50MHz
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    Delay_Ms(10);
    printf("USB_Detect:%8.8X\r\n",GPIOA->INDR & (GPIO_Pin_11 | GPIO_Pin_12));
    //如果有U盘插入,由于1.5K上拉电阻的存在,PA11和PA12必有一根线为高电平, 
    return GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_11 | GPIO_Pin_12);
}


您好,可以参考下图调用该函数检测是否有设备接入。

image.png


就是这个函数检测速度太慢了啊,耗时几秒钟了都,我的APP需要尽快接管,客户等太久不愿意,所以需要能绕开USB协议快速检测是否有U盘插入的 状态。请问我的方法有没问题,错在哪里?如何修改呢?


你可以使用示波器观察DPDM数据线。猜测是因为USB闪存盘连接后也需要一定时间启动并发出信号,导致识别不到。


您好,正常USB引脚作为USB使用时,无法作为其他功能使用,否则会对USB产生影响。2楼回复所提到的设备插入检测函数一般插入就会检测,不会有你所提到的几秒的延时,我这边用EVT主机操作U盘的例程测试过,插入就会立马检测到设备插入,你可以用EVT例程测试下。若是你的程序有延时,应该是某个地方有问题。若你想按照自己配置的那个函数进行检测,建议检测后再重新进行USB的初始化,这样我这边测试也是可行的,设备插入后,会返回高电平1值,然后再进行USB初始化,没有设备插入式,检测返回值0,该函数我测试是没问题的。


只有登录才能回复,可以选择微信账号登录