CH32V307的USB主設(shè)備 如何快速檢測 外部是否有U盤插入?

我們在IAP 升級程序中,需要初始化USB設(shè)備,然后調(diào)用 IAP_Main_Deal()函數(shù)檢測U盤是不是插入,如果失敗就再次調(diào)用這個函數(shù),指導(dǎo)200次之后,升級沒成功則跳轉(zhuǎn)到APP執(zhí)行。

這樣浪費了大量的時間,大概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);
????????????//如果成功升級會直接跳轉(zhuǎn)到APP
????????????IAP_Main_Deal();
????????????
????????}
????????//升級沒成功跳轉(zhuǎn)到APP
????????IAP_Jump_APP();
????}

我想了個辦法,就是先將USB_DM USB_DP這兩根線設(shè)置為輸入信號, 如果檢測到這兩根線上任意一根為高電平則說明有設(shè)備連接上來了,這時候我再重新初始化為USB主機設(shè)備升級。我的檢測程序如下,但是沒有成功。以下是我的檢測程序。請問我這個程序哪里不對哈,該怎么修改哈?

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);
}


您好,可以參考下圖調(diào)用該函數(shù)檢測是否有設(shè)備接入。

image.png


就是這個函數(shù)檢測速度太慢了啊,耗時幾秒鐘了都,我的APP需要盡快接管,客戶等太久不愿意,所以需要能繞開USB協(xié)議快速檢測是否有U盤插入的 狀態(tài)。請問我的方法有沒問題,錯在哪里?如何修改呢?


你可以使用示波器觀察DPDM數(shù)據(jù)線。猜測是因為USB閃存盤連接后也需要一定時間啟動并發(fā)出信號,導(dǎo)致識別不到。


您好,正常USB引腳作為USB使用時,無法作為其他功能使用,否則會對USB產(chǎn)生影響。2樓回復(fù)所提到的設(shè)備插入檢測函數(shù)一般插入就會檢測,不會有你所提到的幾秒的延時,我這邊用EVT主機操作U盤的例程測試過,插入就會立馬檢測到設(shè)備插入,你可以用EVT例程測試下。若是你的程序有延時,應(yīng)該是某個地方有問題。若你想按照自己配置的那個函數(shù)進行檢測,建議檢測后再重新進行USB的初始化,這樣我這邊測試也是可行的,設(shè)備插入后,會返回高電平1值,然后再進行USB初始化,沒有設(shè)備插入式,檢測返回值0,該函數(shù)我測試是沒問題的。


只有登錄才能回復(fù),可以選擇微信賬號登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频