По просьбе Oman подниму тему и опишу конкретно свою доработку
библиотеки: Нашел у себя в репозитории коммит с доработкой. там такой комментарий:
Доработка USB для работы с GD32F405
GD32F405 при повторной инициализации стека USB не выдает прерывания Connection Detect (HPRT.PCDET).
Connection Detect удается получить повторно при снятии/подаче питания на входе PA9(USB_VBUS).
Сейчас сделано игнорирование отсутствия запроса HPRT.PCDET в течении 100мс. Работает в таком виде. (usbh_core.c)
Т.е. если Connection Detect не происходит в течении 100мс - то я продолжаю работать как ни в чем не бывало.
Это было почти 2 года назад. В комментарии упоминается только F405 проц, хотя этот проект у меня и для F105 тоже. Возможно - что в F105 такой проблемы не было, а может - она всплыла в F405, а F105 мы в то время еще не использовали.
Файл usbh_core.c имеет функцию USBH_Process():
static uint8_t dev_conn_cnt = 0; // -------- Доработка
void USBH_Process(USB_OTG_CORE_HANDLE *pdev , USBH_HOST *phost)
{
volatile USBH_Status status = USBH_FAIL;
uint8_t slp_delay = 0;
/* check for Host port events */
if (((HCD_IsDeviceConnected(pdev) == 0)|| (HCD_IsPortEnabled(pdev) == 0))&& (phost->gState != HOST_IDLE))
phost->gState = HOST_DEV_DISCONNECTED;
switch (phost->gState)
{
case HOST_IDLE :
{
if (HCD_IsDeviceConnected(pdev))
{
dev_conn_cnt = 0; // -------- Доработка
phost->gState = HOST_WAIT_PRT_ENABLED;
/*wait denounce delay */
USB_OTG_BSP_mDelay(100);
/* Apply a port RESET */
HCD_ResetPort(pdev);
/* User RESET callback*/
phost->usr_cb->ResetDevice();
}
else
{
switch( dev_conn_cnt ) // -------- Доработка
{
case 0: dev_conn_cnt = 20; break;
case 1: pdev->host.ConnSts = 1;
default: --dev_conn_cnt;
}
USB_OTG_BSP_mDelay(5); // -------- Доработка
}
break;
}
Суть доработки - в начале работы стека USB (когда начинается периодический вызов USBH_Process) - с помощью счетчика от 20 до 1 делаем задержку около 100мс (в 5мс интервалах).
По окончании задержки устанавливаем pdev->host.ConnSts = 1;