реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> STM32L151 USB, Нет стабильной работы на разных платах
Zeal0t
сообщение Sep 1 2017, 06:37
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 35
Регистрация: 28-06-13
Пользователь №: 77 311



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

Разрабатывается устройство на 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 - Sep 1 2017, 06:38
Go to the top of the page
 
+Quote Post
Forger
сообщение Sep 1 2017, 06:54
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 729
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(Zeal0t @ Sep 1 2017, 09:37) *
Что посмотреть и в какую сторону хотя бы копать?

Аппаратная часть одинаковая?
Go to the top of the page
 
+Quote Post
Zeal0t
сообщение Sep 1 2017, 07:06
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 35
Регистрация: 28-06-13
Пользователь №: 77 311



Цитата(Forger @ Sep 1 2017, 09:54) *
Аппаратная часть одинаковая?

В USB - да. Единственное что на конечной плате стоит развязка для него на USBLC6-2 но это не может влиять на работу процессора.
Есть отличия в разводке светодиодов и мелочевки но они к USB не имеют отношения и на процесс работы USB так же не влияют.
Есть подозрение что при монтаже платы "пережарили" CPU и это как то "задело" область памяти которую использует USB но что бы так выборочно что только для EP3 - странно.
Go to the top of the page
 
+Quote Post
Obam
сообщение Sep 1 2017, 07:37
Сообщение #4


Знающий
****

Группа: Участник
Сообщений: 653
Регистрация: 14-11-14
Пользователь №: 83 663



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

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

Сообщение отредактировал Obam - Sep 1 2017, 07:38


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
VladislavS
сообщение Sep 1 2017, 08:19
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 332
Регистрация: 14-04-05
Из: Москва
Пользователь №: 4 140



Цитата(Zeal0t @ Sep 1 2017, 09:37) *
EP3 отправляет эти данные только 1 первый раз и больше работать не желает.

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

А зачем так много EP задействовано? Для CDC вроде как EP0 - Control (Enumerate & Control CDC), EP1 - Bulk (CDC Data туда<->сюда), EP2 - Interrupt.
Go to the top of the page
 
+Quote Post
Zeal0t
сообщение Sep 1 2017, 08:52
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 35
Регистрация: 28-06-13
Пользователь №: 77 311



Цитата(VladislavS @ Sep 1 2017, 11:19) *
Какой статус после этого у 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


Go to the top of the page
 
+Quote Post
Zeal0t
сообщение Sep 1 2017, 14:06
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 35
Регистрация: 28-06-13
Пользователь №: 77 311



В качестве продолжения темы.
Скачал STM32 Cube. Сделал небольшой проект с USB CDC.
Работает зараза )))
Буду смотреть что там наворочено и сравнивать со своей реализацией...
Go to the top of the page
 
+Quote Post
VladislavS
сообщение Sep 1 2017, 14:31
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 332
Регистрация: 14-04-05
Из: Москва
Пользователь №: 4 140



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

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

Если в дескрипторах написали правильно, то должно и так работать. Но вообще, точки двунаправленные. Для CDC достаточно одной точки Bulk на приём/передачу и одной Interrupt. Ну и EP0 для всех системных вопросов. Сделайте как в кубе дескрипторы и используемые точки.
Go to the top of the page
 
+Quote Post
uriy
сообщение Sep 1 2017, 18:49
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 2 308
Регистрация: 30-11-05
Из: Ижевск
Пользователь №: 11 606



Проверьте еще реальную частоту тактовой частоты 48 МГц, лучше через вывод MCO.
Допуск насколько помню не такой уже жесткий - 0,25%. Мало ли.
Go to the top of the page
 
+Quote Post
Zeal0t
сообщение Sep 2 2017, 05:21
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 35
Регистрация: 28-06-13
Пользователь №: 77 311



Цитата(VladislavS @ Sep 1 2017, 17:31) *
После того как точка что-то передаст (вернее хост у неё заберёт) в статусе выставляется CTR_TX. У вас он в нуле. Это что-то другое вы поймали.

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


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

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

Цитата(uriy @ Sep 1 2017, 21:49) *
Проверьте еще реальную частоту тактовой частоты 48 МГц, лучше через вывод MCO.
Допуск насколько помню не такой уже жесткий - 0,25%. Мало ли.


запросы через EP0 проходят и обрабатываются корректно
устройство на хосте видно
все данные верные
устройство принимает все пакеты от хоста через EP2
проблема только в том, что не могу передать хосту более чем 1 раз ответ через EP3
Go to the top of the page
 
+Quote Post
vlad_new
сообщение Sep 2 2017, 09:16
Сообщение #11


Местный
***

Группа: Участник
Сообщений: 213
Регистрация: 24-06-10
Пользователь №: 58 127



При смене камня, часто меняется и размер стека.
Go to the top of the page
 
+Quote Post
Zeal0t
сообщение Sep 2 2017, 09:45
Сообщение #12


Участник
*

Группа: Участник
Сообщений: 35
Регистрация: 28-06-13
Пользователь №: 77 311



Цитата(vlad_new @ Sep 2 2017, 12:16) *
При смене камня, часто меняется и размер стека.


Теоретически камень тот же.
Только в другом корпусе.
Ну и соответственно у него поболее FLASH и памяти. Но это вряд ли влияет на работу USB т.к. в проекте в настройках специально установлены значения по размеру FLASH и памяти от маленького камня.
Других отличий у них нет или они такие (что возможно и влияет на работу USB) что я не нашел.
стэк и куча стоят по 0x400.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th November 2017 - 01:49
Рейтинг@Mail.ru


Страница сгенерированна за 0.0131 секунд с 7
ELECTRONIX ©2004-2016