#c #usb #stm32 #hid #stm32cubemx
Вопрос:
как у тебя дела? Надеюсь, с вами все в порядке =)
Мое приложение было разработано с использованием пакета прошивки версии V. 10.1 . Мне было предложено обновить прошивку для использования пакета прошивки V1.11.1. Когда я обновился, несколько вещей испортились, включая пользовательский идентификатор.
Вот что происходит:
В функции CUSTOM_HID_OutEvent_FS мое устройство распознает полученный пакет с помощью
USBD_CUSTOM_HID_SendReport. Это отлично работало с версией V1.10.1. Теперь, когда я обновил, весь мой USB-комм испортился после первого отправленного подтверждения. После первого отправленного пакета мое приложение не может ни получить, ни отправить данные через USB . Если я удалю отправку ACK, я смогу непрерывно получать данные.
Что я заметил после обновления:
Библиотеки печатных плат и USB LL были изменены. После долгой отладки я заметил, что эта конкретная функция все испортила: PCD_EP_ISR_Handler.
Эта функция изменилась с обновления V1.10.1 на V1.11.1. Я изучил эту функцию и поток USB-кода и обнаружил изменение, которое вернуло мой USB-комм к работе. Это последние строки функции EP_ISR_Handler:
if ((ep->type == EP_TYPE_BULK) amp;amp; ((wEPVal amp; USB_EP_KIND) == 0U))
{
/* multi-packet on the NON control IN endpoint */
TxByteNbre = (uint16_t)PCD_GET_EP_TX_CNT(hpcd->Instance, ep->num);
if (ep->xfer_len > TxByteNbre)
{
ep->xfer_len -= TxByteNbre;
}
else
{
ep->xfer_len = 0U;
}
/* Zero Length Packet? */
if (ep->xfer_len == 0U)
{
/* TX COMPLETE */
#if (USE_HAL_PCD_REGISTER_CALLBACKS == 1U)
hpcd->DataInStageCallback(hpcd, ep->num);
#else
HAL_PCD_DataInStageCallback(hpcd, ep->num);
#endif /* USE_HAL_PCD_REGISTER_CALLBACKS */
}
else
{
/* Transfer is not yet Done */
ep->xfer_buff = TxByteNbre;
ep->xfer_count = TxByteNbre;
(void)USB_EPStartXfer(hpcd->Instance, ep);
}
}
/* Double Buffer Iso/bulk IN (bulk transfer Len > Ep_Mps) */
else
{
(void)HAL_PCD_EP_DB_Transmit(hpcd, ep, wEPVal);
}
}
Что вернуло мой USB-комм к работе, так это изменение HAL_PCD_EP_DB_Transmit на HAL_PCD_EP_Transmit в последних строках приведенного выше фрагмента кода.
Я далек от того, чтобы быть экспертом по USB, и, честно говоря, я не знаю, как именно влияет это изменение функции на поток USB. Что я знаю, так это то, что я не должен изменять драйверы ST для работы моего приложения.
Мой пользовательский HID уже работал, следуя учебнику, доступному на YouTube-канале ST. Я использую настройки usb точно так, как описано в руководстве для 64-байтовых пакетов.
Вещи, которые я уже пробовал:
-> Created a project with V1.11.1 only using CUSTOM Hid. Got the same behaviour.
-> Tried to use V1.11.0. Got the same behaviour.
All that explained, does someone could give me a hint of what should i do? I NEED to update the firmware pack to a newest version.