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

 
 
> Переподключение USB VCP для stm32f105
Still Enemy
сообщение Mar 13 2015, 13:13
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 66
Регистрация: 29-01-15
Из: Нижний Новгород
Пользователь №: 84 817



Дано: есть ПЛИС на базе МК stm32105. К ней прикручен usb, программно поднят cdc по примерам от st и допилены операции приёма/передачи. В неопределённый момент usb кабель выдергивается(возможно даже в момент передачи/приёма, но это не суть). Через некоторое время подключается обратно.
Найти:
1)как программно отлавливать отключение usb кабеля? что при этом не плохо бы сделать?
2)как собственно программно отлавливать обратно подключенный кабель?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 14)
Still Enemy
сообщение Mar 14 2015, 12:39
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 66
Регистрация: 29-01-15
Из: Нижний Новгород
Пользователь №: 84 817



Вообще ни у кого ни одной идеи нет? Никто не сталкивался с такой проблемой?
Go to the top of the page
 
+Quote Post
smalcom
сообщение Mar 14 2015, 20:11
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 292
Регистрация: 26-06-07
Пользователь №: 28 718



VBUS вообщето пропадает.
Go to the top of the page
 
+Quote Post
toweroff
сообщение Mar 14 2015, 20:53
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Цитата(smalcom @ Mar 14 2015, 23:11) *
VBUS вообщето пропадает.

если куда нужно подключен wink.gif
а то просто на питание вешают
Go to the top of the page
 
+Quote Post
A. Fig Lee
сообщение Mar 14 2015, 23:38
Сообщение #5


Знающий
****

Группа: Участник
Сообщений: 974
Регистрация: 4-04-08
Из: далека
Пользователь №: 36 467



В ст шной библиотеке есть ивенты и на дисконнект и на ресет и так далее


--------------------
Верить нельзя никому, даже себе. Мне - можно.
Go to the top of the page
 
+Quote Post
toweroff
сообщение Mar 14 2015, 23:47
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Цитата(A. Fig Lee @ Mar 15 2015, 02:38) *
В ст шной библиотеке

для филпсов не видел...
error, sof, reset, power, suspend, resume... disconnect не видел
корки разные, но события-то должны быть? покажите
Go to the top of the page
 
+Quote Post
Still Enemy
сообщение Mar 16 2015, 09:23
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 66
Регистрация: 29-01-15
Из: Нижний Новгород
Пользователь №: 84 817



Цитата(A. Fig Lee @ Mar 15 2015, 02:38) *
В ст шной библиотеке есть ивенты и на дисконнект и на ресет и так далее

Хорошо, я глянул в дебаге как что происходит при отключении/включении кабеля
1 подключение кабеля: после прерывания почему то сваливается в Handle Suspend Interrupt, затем Handle Reset Interrupt->Handle Enumeration done Interrupt->Handle Reset Interrupt->Handle Enumeration done Interrupt. Всё хорошо, устройство определилось
1 отключение кабеля: кидает USBSUSP в регистре OTG_FS_GINTSTS и собственно обрабатывается Handle Suspend Interrupt.
2 подключение: Handle Suspend Interrupt->Handle Reset Interrupt->Handle Enumeration done. Но устройство не определяется как положено, а висит как Unknown Device.
Все последующие подключения/отключения никаких прерываний не кидают.
И тут самое интересное, что в обработчике прерываний есть Handle Connection event Interrupt и Handle Disconnection event Interrupt, но в эти обработчики программа не попадает за всё то время, в которое я делал эти манипуляции.
Если вы знаете, что есть эти ивенты, то возможно вы знаете как ими пользоваться? Знаете почему при отключении сваливается в Handle Suspend Interrupt. Расскажите пожалуйста или скажите как поправить, что бы всё работало.

Сообщение отредактировал Still Enemy - Mar 16 2015, 13:32
Go to the top of the page
 
+Quote Post
Still Enemy
сообщение Mar 16 2015, 13:32
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 66
Регистрация: 29-01-15
Из: Нижний Новгород
Пользователь №: 84 817



Я полазил по коду. В обработчик Connection/Disconnection event Interrupt программа в действительности и не может пройти, ибо замаскированы SRQINT и OTGINT. Хотя собственно эти обработчики, кроме как сброс бита прерывания, ничего не делают.
Почему входит в Suspend mode тоже понятно:
Цитата
Выдержка из usb nutshell.
Вход в Suspend Mode
Устройство USB приостанавливается (переходит в режим Suspend), когда на шине нет активности более чем 3.0 мс. В течение следующих 7 мс устройство должно отключиться, и не потреблять ток больше, чем заданный ток suspend. Таким образом, через 10 мс после прекращения активности шины ток потребления от неё не должен превышать suspend current. Для поддержания состояния соединения к приостановленному хабу или хосту, устройство во время режима Suspend должно все еще предоставлять питание на pull up нагрузочный резистор, определяющий выбор скорости.

Но всё равно не понятно чего не хватает устройству для работы... Почему то при повторном подключении кабеля обрабатывается один раз Handle Reset Interrupt->Handle Enumeration done, а не два раза как при первом соединении. Хотя почему кидает USBSUSP при первом подключении кабеля, так и не стало ясно. Так же почему то перестало кидать прерывание USBSUSP при отключении кабеля, чудеса... И еще не понятно, почему не формируются прерывания при подключении/отключении кабеля после второго подключения кабеля. Вопросов много, ответов нет...
Go to the top of the page
 
+Quote Post
toweroff
сообщение Mar 16 2015, 15:05
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



А устройство после отключения кабеля остается с включенным Pullup к D+? Возможно, там собака порылась
Go to the top of the page
 
+Quote Post
Still Enemy
сообщение Mar 16 2015, 16:08
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 66
Регистрация: 29-01-15
Из: Нижний Новгород
Пользователь №: 84 817



Цитата(toweroff @ Mar 16 2015, 18:05) *
А устройство после отключения кабеля остается с включенным Pullup к D+? Возможно, там собака порылась

Возможно, завтра попробую на работе. Но в usb nutshell написано обратное. Или я не правильно понял?
Цитата
Выдержка из usb nutshell.
Вход в Suspend Mode
Устройство USB приостанавливается (переходит в режим Suspend), когда на шине нет активности более чем 3.0 мс. В течение следующих 7 мс устройство должно отключиться, и не потреблять ток больше, чем заданный ток suspend. Таким образом, через 10 мс после прекращения активности шины ток потребления от неё не должен превышать suspend current. Для поддержания состояния соединения к приостановленному хабу или хосту, устройство во время режима Suspend должно все еще предоставлять питание на pull up нагрузочный резистор, определяющий выбор скорости.


Сообщение отредактировал Still Enemy - Mar 16 2015, 16:08
Go to the top of the page
 
+Quote Post
Still Enemy
сообщение Mar 17 2015, 09:04
Сообщение #11


Участник
*

Группа: Участник
Сообщений: 66
Регистрация: 29-01-15
Из: Нижний Новгород
Пользователь №: 84 817



Цитата(toweroff @ Mar 16 2015, 18:05) *
А устройство после отключения кабеля остается с включенным Pullup к D+? Возможно, там собака порылась

Пробовал софтварно отключать подтяжку, после отключения кабеля кидает HardFault_Handler в startup_stm32f105xc.s
Go to the top of the page
 
+Quote Post
smalcom
сообщение Mar 18 2015, 09:13
Сообщение #12


Профессионал
*****

Группа: Свой
Сообщений: 1 292
Регистрация: 26-06-07
Пользователь №: 28 718



во. значит по событию ПО пытается вызвать неопределённый обработчик.
Go to the top of the page
 
+Quote Post
Still Enemy
сообщение Mar 18 2015, 10:35
Сообщение #13


Участник
*

Группа: Участник
Сообщений: 66
Регистрация: 29-01-15
Из: Нижний Новгород
Пользователь №: 84 817



Цитата(smalcom @ Mar 18 2015, 12:13) *
во. значит по событию ПО пытается вызвать неопределённый обработчик.

Я на самом деле просто делал видимо не правильно. Я подтяжку вырубал с помощью регистра GCCFG и сбрасывал бит VBUSBSEN. После чего вылетало Hard Fault.
Я почитал, правильно было сбрасывать потяжку софтаврным дисконектом в регистре DCTL выставлял единицу в бит SDIS. Ничего не поменялось кароч.
Go to the top of the page
 
+Quote Post
Still Enemy
сообщение May 21 2015, 08:24
Сообщение #14


Участник
*

Группа: Участник
Сообщений: 66
Регистрация: 29-01-15
Из: Нижний Новгород
Пользователь №: 84 817



Хочу поднять старую тему, ибо я решил проблему. Может быть это кому и поможет.
Не знаю как у других, но у меня вылетал Hard Fault, после функции free(), собственно сразу же после повторного присоединения кабеля.
Так что её тупо надо закомментить, потому как она смысловой нагрузки не несёт(только отрицательную нагрузку).
Вызов этой функции лежит в usbd_cdc.c в функции USBD_CDC_DeInit:
Код
static uint8_t  USBD_CDC_DeInit (USBD_HandleTypeDef *pdev,
                                 uint8_t cfgidx)
{
  uint8_t ret = 0;
  
  /* Open EP IN */
  USBD_LL_CloseEP(pdev,
              CDC_IN_EP);
  
  /* Open EP OUT */
  USBD_LL_CloseEP(pdev,
              CDC_OUT_EP);
  
  /* Open Command IN EP */
  USBD_LL_CloseEP(pdev,
              CDC_CMD_EP);
  
  
  /* DeInit  physical Interface components */
  if(pdev->pClassData != NULL)
  {
    ((USBD_CDC_ItfTypeDef *)pdev->pUserData)->DeInit();
    //USBD_free(pdev->pClassData);
    pdev->pClassData = NULL;
  }

Примерно так должно быть.
Причина глюка проста: по задумке разработчиков HAL драйверов, указатель pdev->pClassData должен освобождаться из динамической памяти функцией free, хотя никакими функциями типа calloc, malloc память не выделялась. Да и вообще в данных драйверах никакого управления памятью нет. Так что будет достаточно строчки pdev->pClassData = NULL, чтобы всё работало!

Сообщение отредактировал Still Enemy - May 21 2015, 08:24
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 21 2015, 10:25
Сообщение #15


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Нет, так лучше не чинить. Если потом все же по каким-то причинам захочется динамического выделения, то пользователь пойдет править USBD_malloc и USBD_free, не подозревая, что вызов USBD_free закоменнтирован. И получит утечку памяти. Так что лучше закомментировать вызов free(). Ну а то, что останется вызов лишней пустой функции - так такого Г в этом коде навалом, никто и не заметит несколько лишних байтов.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 07:06
Рейтинг@Mail.ru


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