#usb #stm32 #enumeration #packet
#usb #stm32 #перечисление #пакет
Вопрос:
Я переношу USB-драйвер с устройства STM32F4 на устройство STM32L4. Это почти работает. Во время перечисления он отправляет и получает информацию, но данные не совсем совпадают с данными из «простого» проекта, созданного STM Cube. Я использую одинаковые настройки в обоих проектах, но получаю странные результаты.
Я потерял неделю, пытаясь найти решение, возможно, у кого-то здесь была похожая проблема, и он может мне помочь. Извините за изображения, но нет другого способа опубликовать некоторую информацию на SO
Как вы можете видеть, пакеты почти одинаковы, но не идентичны. После 25-й передачи плата останавливается и принимает только очень ограниченное количество запросов
Оба файла, формирующие wireshark (в форматах wireshark и text), находятся здесь:
https://gitlab.com/diymat/usb-problem/tree/master
Файлы ep * находятся на моем порту, сгенерированном stmcdc * — STM Cube. Оба были запущены с использованием одного и того же оборудования.
Комментарии:
1. Не перепостируйте!
Ответ №1:
Это та же конфигурация часов? Нормально ли работает clk USb 48 МГц? Использование non crystal или ext osc для подключения USB с частотой 48 МГц обычно приводит к проблеме на больших xfer, даже на F4 не могу сказать для l4, поэтому может показаться, что он работает с hid и довольно коротким пакетом, но начинает неправильно вести себя для больших xfer
Ответ №2:
Итак, я хотел бы быть немного более полезным, но мне определенно понадобилось бы больше информации, чтобы указать вам правильное направление. При этом может быть несколько ошибок, поэтому я постараюсь рассказать о том, что я могу придумать. Давайте начнем с некоторых из наиболее очевидных.
Конфигурация часов / аппаратное обеспечение могут вызывать проблемы из-за неисправных компонентов или неправильного выбора программного / аппаратного обеспечения. Это может вызвать ряд проблем, но это может быть симптомом этого.
Если вы используете сгенерированное промежуточное программное обеспечение FATFS от ST, небольшой размер стека внутри конфигурации L4 может вызвать именно эту проблему. это может работать до тех пор, пока регистр ПК не получит ошибочную ошибку, которая может привести к какому-либо сбою, или, в некоторых случаях, просто неверный результат, возвращаемый внутри FATFS, или периферийный код USB из ST, и это вернет грязный сектор в окне USB, считанный из FATFS, что приведет к завершению операций на периферийном устройстве.
Я вижу, вы используете STM32Cube, поэтому вы можете редактировать размер стека и кучи, открыв файл startup_stm32l475xx.s
и отредактируйте два, как вы считаете нужным для вашего приложения.
; Amount of memory (in bytes) allocated for Stack
; Tailor this value to your application needs
; <h> Stack Configuration
; <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>
Stack_Size EQU 0x400
AREA STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem SPACE Stack_Size
__initial_sp
; <h> Heap Configuration
; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>
Heap_Size EQU 0x200
Попробуйте увеличить размер стека и посмотрите, что произойдет. Удачи в поиске вашего решения!