Задать вопрос

Почему в композитном USB устройстве на stm32f407 (CubeIDE) работает только один endpoint?

Сделал композитное устройство.
Воспользовался статьёй Composite CDC+MSC
Всё бы хорошо, но в зависимости от назначения endpoint-ов работает

на платформе STM32F4xx очереди FIFO настраиваются по-другому.
Нашёл другую полезную ссылку: тоже не помогло.

Мой код лежит здесь
работает очень просто
CDC - работает почти как эхо. Подключаешь терминал -и на любое нажатие клавиши в ответ получаешь
"aba01 "
HID - раз в секунду отправляет "HID " под линуксом это видно cat /dev/hidraw0

В зависимости от назначения Endpoint
#if 0
#define CUSTOM_HID_EPIN_ADDR 0x82U
#define CUSTOM_HID_EPOUT_ADDR 0x02U
#define CDC_IN_EP 0x81U /* EP1 for data IN */
#define CDC_OUT_EP 0x01U /* EP1 for data OUT */
#define CDC_CMD_EP 0x83U /* EP2 for CDC commands */
#else
#define CUSTOM_HID_EPIN_ADDR 0x81U
#define CUSTOM_HID_EPOUT_ADDR 0x01U
#define CDC_IN_EP 0x82U /* EP1 for data IN */
#define CDC_OUT_EP 0x02U /* EP1 for data OUT */
#define CDC_CMD_EP 0x83U /* EP2 for CDC commands */
#endif

Работает либо HID либо CDC. Магический номер ENDPOINTa - 0x81 - он работает

Если заменить HAL_PCDEx_SetTxFiFo(&hpcd_USB_OTG_FS, 1/*Количество FIFO*/, 0x80);
на HAL_PCDEx_SetTxFiFo(&hpcd_USB_OTG_FS, 2/*Количество FIFO*/, 0x80);
По совету StackOverflow

Ситуация меняется.
Работает либо HID либо CDC. Но уже с ENDPOINT - 0x82

Как заставить работать оба ендпоинта - не понимаю.
HAL_PCDEx_SetTxFiFo(&hpcd_USB_OTG_FS, 2/*Количество FIFO*/, 0x40);
Тоже не помогает.
  • Вопрос задан
  • 373 просмотра
Подписаться 1 Средний 2 комментария
Решения вопроса 1
@yslav Автор вопроса
STM32
Ура, до меня дошло.
Я протормозил и не понял как работает HAL_PCDEx_SetTxFiFo(...).
Оказывается, его нужно устанавливать для каждого ендпоинта индивидуально.
Проблема решена !!!
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
veydlin
@veydlin
Мне никогда не жалко средств на свое любопытство
Библиотека от ST это сущий ад, там ничего не работает, даже я находил в ней ошибки
Я в итоге стал использовать tinyusb
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы