ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
27 сентября
1464572 Топик полностью
il-2 (20.09.2024 09:06, просмотров: 168) ответил il-2 на Отличия в USB-Host между STM32F и GD32F, про которые я знаю ->
По просьбе 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;