Перейти к содержанию
    

STM32L151 USB

Добрый день

Столкнулся с проблемой, у которой не могу понять причину.

 

Разрабатывается устройство на STM32L151CB. Среда разработки IAR если важно.

Для связи с верхним уровнем реализован USB.

На USB реализован и работает CDC по которому бегает modbus протокол.

3 конечные точки:

EP1 - для служебных запросов CDC протокола

EP2 - прием данных по USB от хоста

EP3 - отправка данных по USB хосту

 

Что бы не ждать производство и не терять время проект был начат на отладочной плате STM32L-DISCOVERY.

На плате запаян STM32L151RC что в сущности тоже самое что и в конечном устройстве но в другом корпусе и с более большой памятью программ.

 

Проблема заключается в следующем.

 

На отладочной плате все хорошо работает, потерь нет, скорость устраивает.

В Wireshark вижу все пакеты USB без ошибок и с корректными данными.

Верхний софт тоже видит все данные из modbus протокола.

 

Переносим проект на конечное устройство изменив в настройках проекта тип процессора.

И в отладчике и в Wireshark вижу начальный обмен по 0 точке USB.

Все данные корректные и совпадают с пакетами отладочной платы.

COM порт в системе появляется и работает.

Отправляем из программы windows на этот порт пакеты modbus.

Пакеты видно в отладчике и Wireshark. Пакеты корректные.

А вот дальше происходит нечто странное.

При отправке данных хостом EP2 эти данные видит. Программа формирует ответ и отправляет его через EP3.

EP3 отправляет эти данные только 1 первый раз и больше работать не желает.

При повторных запросах от хоста EP2 видит данные всегда. Но EP3 больше работать не желает.

Причем на отладочной плате этот проект работает без проблем.

 

Что посмотреть и в какую сторону хотя бы копать?

 

Спасибо.

Изменено пользователем Zeal0t

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что посмотреть и в какую сторону хотя бы копать?

Аппаратная часть одинаковая?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Аппаратная часть одинаковая?

В USB - да. Единственное что на конечной плате стоит развязка для него на USBLC6-2 но это не может влиять на работу процессора.

Есть отличия в разводке светодиодов и мелочевки но они к USB не имеют отношения и на процесс работы USB так же не влияют.

Есть подозрение что при монтаже платы "пережарили" CPU и это как то "задело" область памяти которую использует USB но что бы так выборочно что только для EP3 - странно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Глянуть в эрраты целевого проца и дублёра.

 

Сдуть "пережареный", установить "свеженький" (;

Изменено пользователем Obam

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

EP3 отправляет эти данные только 1 первый раз и больше работать не желает.

Какой статус после этого у EP3?

 

А зачем так много EP задействовано? Для CDC вроде как EP0 - Control (Enumerate & Control CDC), EP1 - Bulk (CDC Data туда<->сюда), EP2 - Interrupt.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Какой статус после этого у EP3?

 

А зачем так много EP задействовано? Для CDC вроде как EP0 - Control (Enumerate & Control CDC), EP1 - Bulk (CDC Data туда<->сюда), EP2 - Interrupt.

 

EP0 - системная для всего USB

EP1 - control для CDC (у меня не используется)

EP2 - прием данных от хоста

EP3 - передача данных хосту

 

разве не так? поправьте как нужно?

 

на картинке:

- точка останова при входе в EP3

- 1: сразу после запуска программы. я так понимаю это windows запрашивает у устройства данные на предмет того что могло остаться в буфере передачи COM-порта

- 2: отработала точка EP2. данные готовы обработаны и готовы для отправки хосту. записываем данные в буфер контрольной точки и отправляем. данные уходят корректно.

- 3: данные на шаге 2 были отправлены. я так понимаю что это USB-стэк вызывает контрольную точку что бы узнать нужно ли что то еще отправить. т.к. данных больше нет - ничего не делаем.

- 4: повторение пункта 2 - отработала точка EP2. повторяем все действия из 2 пункта но данные не уходят. совсем.

 

и далее все то же самое. точка EP3 более не отправит данные до сброса USB

 

usb.png

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В качестве продолжения темы.

Скачал STM32 Cube. Сделал небольшой проект с USB CDC.

Работает зараза )))

Буду смотреть что там наворочено и сравнивать со своей реализацией...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

После того как точка что-то передаст (вернее хост у неё заберёт) в статусе выставляется CTR_TX. У вас он в нуле. Это что-то другое вы поймали.

 

разве не так? поправьте как нужно?

Если в дескрипторах написали правильно, то должно и так работать. Но вообще, точки двунаправленные. Для CDC достаточно одной точки Bulk на приём/передачу и одной Interrupt. Ну и EP0 для всех системных вопросов. Сделайте как в кубе дескрипторы и используемые точки.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Проверьте еще реальную частоту тактовой частоты 48 МГц, лучше через вывод MCO.

Допуск насколько помню не такой уже жесткий - 0,25%. Мало ли.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

После того как точка что-то передаст (вернее хост у неё заберёт) в статусе выставляется CTR_TX. У вас он в нуле. Это что-то другое вы поймали.

 

Если в дескрипторах написали правильно, то должно и так работать. Но вообще, точки двунаправленные. Для CDC достаточно одной точки Bulk на приём/передачу и одной Interrupt. Ну и EP0 для всех системных вопросов. Сделайте как в кубе дескрипторы и используемые точки.

 

На скриншотах регистры при входе в конечную точку. До того как данные будут записаны в буфер EP и выставлен флаг для передачи. После выполнения этих операций CTR_TX действительно выставится и затем сбросится но только 1 первый раз. Далее процесс передачи не работает в не зависимости сколько данных записываем.

 

Дескрипторы верные. EP0 корректно отрабатывает все запросы и устройство на хосте видно корректно. Со всеми описаниями и данными.

 

Проверьте еще реальную частоту тактовой частоты 48 МГц, лучше через вывод MCO.

Допуск насколько помню не такой уже жесткий - 0,25%. Мало ли.

 

запросы через EP0 проходят и обрабатываются корректно

устройство на хосте видно

все данные верные

устройство принимает все пакеты от хоста через EP2

проблема только в том, что не могу передать хосту более чем 1 раз ответ через EP3

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

При смене камня, часто меняется и размер стека.

 

Теоретически камень тот же.

Только в другом корпусе.

Ну и соответственно у него поболее FLASH и памяти. Но это вряд ли влияет на работу USB т.к. в проекте в настройках специально установлены значения по размеру FLASH и памяти от маленького камня.

Других отличий у них нет или они такие (что возможно и влияет на работу USB) что я не нашел.

стэк и куча стоят по 0x400.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...