Zeal0t 0 1 сентября, 2017 Опубликовано 1 сентября, 2017 (изменено) · Жалоба Добрый день Столкнулся с проблемой, у которой не могу понять причину. Разрабатывается устройство на 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 больше работать не желает. Причем на отладочной плате этот проект работает без проблем. Что посмотреть и в какую сторону хотя бы копать? Спасибо. Изменено 1 сентября, 2017 пользователем Zeal0t Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 19 1 сентября, 2017 Опубликовано 1 сентября, 2017 · Жалоба Что посмотреть и в какую сторону хотя бы копать? Аппаратная часть одинаковая? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Zeal0t 0 1 сентября, 2017 Опубликовано 1 сентября, 2017 · Жалоба Аппаратная часть одинаковая? В USB - да. Единственное что на конечной плате стоит развязка для него на USBLC6-2 но это не может влиять на работу процессора. Есть отличия в разводке светодиодов и мелочевки но они к USB не имеют отношения и на процесс работы USB так же не влияют. Есть подозрение что при монтаже платы "пережарили" CPU и это как то "задело" область памяти которую использует USB но что бы так выборочно что только для EP3 - странно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Obam 34 1 сентября, 2017 Опубликовано 1 сентября, 2017 (изменено) · Жалоба Глянуть в эрраты целевого проца и дублёра. Сдуть "пережареный", установить "свеженький" (; Изменено 1 сентября, 2017 пользователем Obam Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 36 1 сентября, 2017 Опубликовано 1 сентября, 2017 · Жалоба EP3 отправляет эти данные только 1 первый раз и больше работать не желает. Какой статус после этого у EP3? А зачем так много EP задействовано? Для CDC вроде как EP0 - Control (Enumerate & Control CDC), EP1 - Bulk (CDC Data туда<->сюда), EP2 - Interrupt. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Zeal0t 0 1 сентября, 2017 Опубликовано 1 сентября, 2017 · Жалоба Какой статус после этого у 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Zeal0t 0 1 сентября, 2017 Опубликовано 1 сентября, 2017 · Жалоба В качестве продолжения темы. Скачал STM32 Cube. Сделал небольшой проект с USB CDC. Работает зараза ))) Буду смотреть что там наворочено и сравнивать со своей реализацией... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 36 1 сентября, 2017 Опубликовано 1 сентября, 2017 · Жалоба После того как точка что-то передаст (вернее хост у неё заберёт) в статусе выставляется CTR_TX. У вас он в нуле. Это что-то другое вы поймали. разве не так? поправьте как нужно? Если в дескрипторах написали правильно, то должно и так работать. Но вообще, точки двунаправленные. Для CDC достаточно одной точки Bulk на приём/передачу и одной Interrupt. Ну и EP0 для всех системных вопросов. Сделайте как в кубе дескрипторы и используемые точки. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
uriy 5 1 сентября, 2017 Опубликовано 1 сентября, 2017 · Жалоба Проверьте еще реальную частоту тактовой частоты 48 МГц, лучше через вывод MCO. Допуск насколько помню не такой уже жесткий - 0,25%. Мало ли. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Zeal0t 0 2 сентября, 2017 Опубликовано 2 сентября, 2017 · Жалоба После того как точка что-то передаст (вернее хост у неё заберёт) в статусе выставляется CTR_TX. У вас он в нуле. Это что-то другое вы поймали. Если в дескрипторах написали правильно, то должно и так работать. Но вообще, точки двунаправленные. Для CDC достаточно одной точки Bulk на приём/передачу и одной Interrupt. Ну и EP0 для всех системных вопросов. Сделайте как в кубе дескрипторы и используемые точки. На скриншотах регистры при входе в конечную точку. До того как данные будут записаны в буфер EP и выставлен флаг для передачи. После выполнения этих операций CTR_TX действительно выставится и затем сбросится но только 1 первый раз. Далее процесс передачи не работает в не зависимости сколько данных записываем. Дескрипторы верные. EP0 корректно отрабатывает все запросы и устройство на хосте видно корректно. Со всеми описаниями и данными. Проверьте еще реальную частоту тактовой частоты 48 МГц, лучше через вывод MCO. Допуск насколько помню не такой уже жесткий - 0,25%. Мало ли. запросы через EP0 проходят и обрабатываются корректно устройство на хосте видно все данные верные устройство принимает все пакеты от хоста через EP2 проблема только в том, что не могу передать хосту более чем 1 раз ответ через EP3 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vlad_new 1 2 сентября, 2017 Опубликовано 2 сентября, 2017 · Жалоба При смене камня, часто меняется и размер стека. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Zeal0t 0 2 сентября, 2017 Опубликовано 2 сентября, 2017 · Жалоба При смене камня, часто меняется и размер стека. Теоретически камень тот же. Только в другом корпусе. Ну и соответственно у него поболее FLASH и памяти. Но это вряд ли влияет на работу USB т.к. в проекте в настройках специально установлены значения по размеру FLASH и памяти от маленького камня. Других отличий у них нет или они такие (что возможно и влияет на работу USB) что я не нашел. стэк и куча стоят по 0x400. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться