Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/21: Рейтинг темы: голосов - 21, средняя оценка - 5.00
0 / 0 / 1
Регистрация: 28.09.2013
Сообщений: 61

STM32F205 Работа с USB

09.08.2019, 17:02. Показов 4448. Ответов 20

Студворк — интернет-сервис помощи студентам
Товарищи возникла проблема с работой по USB и STM32F205.
Создал я, значит, дескриптор на три устройства: MSC, CDC #1 & RNDIS (CDC #2)
Кликните здесь для просмотра всего текста

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
__ALIGN_BEGIN static uint8_t USBD_HID_CDC_CfgDesc[USB_HID_CDC_CONFIG_DESC_SIZ] __ALIGN_END =
{
  0x09, /* bLength: Configuration Descriptor size */
  USB_CONFIGURATION_DESCRIPTOR_TYPE, /* bDescriptorType: Configuration */
  DESCRIPTOR_TOTAL_LENGTH, /* wTotalLength: Bytes returned */
  0x00,
  USB_NUM_INTERFACES, /*bNumInterfaces: 5 interfaces (4 for CDC, 1 for MSC)*/
  0x01,         /*bConfigurationValue: Configuration value*/
  CONFIG_STRING_INDEX,         /*iConfiguration: Index of string descriptor describing
  the configuration*/
  0x80 | 0x00,         /*bmAttributes: bus powered and Support Remote Wake-up */
  0x32,         /*MaxPower 100 mA: this current is used for detecting Vbus*/
 
  /************** Mass Storage Class Descriptor ****************/
  /* 09 */
  0x09,         /*bLength: Interface Descriptor size*/
  USB_INTERFACE_DESCRIPTOR_TYPE,/*bDescriptorType: Interface descriptor type*/
  MSC_INTERFACE,         /*bInterfaceNumber: Number of Interface*/
  0x00,         /*bAlternateSetting: Alternate setting*/
  0x02,         /*bNumEndpoints*/
  0x08,         /*bInterfaceClass: MSC*/
  0x06,         /*bInterfaceSubClass : 1=BOOT, 0=no boot*/
  0x50,         /*nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse*/
  INTF_STRING_INDEX + 0,            /*iInterface: Index of string descriptor*/
  ////////////////////
  0x07,  
  USB_ENDPOINT_DESCRIPTOR_TYPE,
  MSC0_INEP_ADDR,
  0x02,         // bmAttributes, interrupt transfers
  0x40,
  0x00,
  0x00,
  ////////////////////
  0x07,
  USB_ENDPOINT_DESCRIPTOR_TYPE,
  MSC0_OUTEP_ADDR,
  0x02,
  0x40,
  0x00,
  0x00,
  ////////////////////
 
        /************** CDC0 Class Descriptor ****************/
    /******** /IAD should be positioned just before the CDC interfaces ******
                IAD to associate the two CDC interfaces */
 
  0x08, /* bLength */
  0x0B, /* bDescriptorType */
  CDC0_COMM_INTERFACE, /* bFirstInterface */
  0x02, /* bInterfaceCount */
  0x02, /* bFunctionClass */
  0x02, /* bFunctionSubClass */
  0x01, /* bFunctionProtocol */
    INTF_STRING_INDEX + 1, /* iFunction (Index of string descriptor describing this function) */
 
   /*Interface Descriptor */
  0x09,   /* bLength: Interface Descriptor size */
  USB_INTERFACE_DESCRIPTOR_TYPE,  /* bDescriptorType: Interface */
  /* Interface descriptor type */
  CDC0_COMM_INTERFACE,   /* bInterfaceNumber: Number of Interface */
  0x00,   /* bAlternateSetting: Alternate setting */
  0x01,   /* bNumEndpoints: One endpoints used */
  0x02,   /* bInterfaceClass: Communication Interface Class */
  0x02,   /* bInterfaceSubClass: Abstract Control Model */
  0x01,   /* bInterfaceProtocol: Common AT commands */
  INTF_STRING_INDEX + 1,   /* iInterface: */
 
  /*Header Functional Descriptor*/
  0x05,   /* bLength: Endpoint Descriptor size */
  0x24,   /* bDescriptorType: CS_INTERFACE */
  0x00,   /* bDescriptorSubtype: Header Func Desc */
  0x10,   /* bcdCDC: spec release number */
  0x01,
 
  /*Call Management Functional Descriptor*/
  0x05,   /* bFunctionLength */
  0x24,   /* bDescriptorType: CS_INTERFACE */
  0x01,   /* bDescriptorSubtype: Call Management Func Desc */
  0x00,   /* bmCapabilities: D0+D1 */
  CDC0_DATA_INTERFACE,   /* bDataInterface: 2 */
 
  /*ACM Functional Descriptor*/
  0x04,   /* bFunctionLength */
  0x24,   /* bDescriptorType: CS_INTERFACE */
  0x02,   /* bDescriptorSubtype: Abstract Control Management desc */
  0x02,   /* bmCapabilities */
 
  /*Union Functional Descriptor*/
  0x05,   /* bFunctionLength */
  0x24,   /* bDescriptorType: CS_INTERFACE */
  0x06,   /* bDescriptorSubtype: Union func desc */
  CDC0_COMM_INTERFACE,   /* bMasterInterface: Communication class interface */
  CDC0_DATA_INTERFACE,   /* bSlaveInterface0: Data Class Interface */
 
  /*Endpoint 2 Descriptor*/
  0x07,                           /* bLength: Endpoint Descriptor size */
  USB_ENDPOINT_DESCRIPTOR_TYPE,   /* bDescriptorType: Endpoint */
  CDC0_INTEP_ADDR,                     /* bEndpointAddress */
  0x03,                           /* bmAttributes: Interrupt */
  LOBYTE(CDC_CMD_PACKET_SZE),     /* wMaxPacketSize: */
  HIBYTE(CDC_CMD_PACKET_SZE),
  0xFF,                           /* bInterval: */
 
  /*Data class interface descriptor*/
  0x09,   /* bLength: Endpoint Descriptor size */
  USB_INTERFACE_DESCRIPTOR_TYPE,  /* bDescriptorType: */
  CDC0_DATA_INTERFACE,   /* bInterfaceNumber: Number of Interface */
  0x00,   /* bAlternateSetting: Alternate setting */
  0x02,   /* bNumEndpoints: Two endpoints used */
  0x0A,   /* bInterfaceClass: CDC */
  0x00,   /* bInterfaceSubClass: */
  0x00,   /* bInterfaceProtocol: */
  0x00,   /* iInterface: */
 
  /*Endpoint OUT Descriptor*/
  0x07,   /* bLength: Endpoint Descriptor size */
  USB_ENDPOINT_DESCRIPTOR_TYPE,      /* bDescriptorType: Endpoint */
  CDC0_OUTEP_ADDR,                            /* bEndpointAddress */
  0x02,                              /* bmAttributes: Bulk */
  LOBYTE(CDC_DATA_MAX_PACKET_SIZE),  /* wMaxPacketSize: */
  HIBYTE(CDC_DATA_MAX_PACKET_SIZE),
  0xFF,                             /* bInterval: ignore for Bulk transfer */
 
  /*Endpoint IN Descriptor*/
  0x07,   /* bLength: Endpoint Descriptor size */
  USB_ENDPOINT_DESCRIPTOR_TYPE,     /* bDescriptorType: Endpoint */
  CDC0_INEP_ADDR,                        /* bEndpointAddress */
  0x02,                             /* bmAttributes: Bulk */
  LOBYTE(CDC_DATA_MAX_PACKET_SIZE),  /* wMaxPacketSize: */
  HIBYTE(CDC_DATA_MAX_PACKET_SIZE),
  0x00,                              /* bInterval */
/*---------------------------------------------------------------------------*/
 
        /************** CDC1 Class Descriptor ****************/
    /******** /IAD should be positioned just before the CDC interfaces ******
                IAD to associate the two CDC interfaces */
 
      0x08, /* bLength */
      0x0B, /* bDescriptorType */
      CDC1_COMM_INTERFACE, /* bFirstInterface */
      0x02, /* bInterfaceCount */
      0xE0, /* bFunctionClass */
      0x01, /* bFunctionSubClass */
      0x03, /* bFunctionProtocol */
      INTF_STRING_INDEX + 2, /* iFunction (Index of string descriptor describing this function) */
 
       /*Interface Descriptor */
      0x09,   /* bLength: Interface Descriptor size */
      USB_INTERFACE_DESCRIPTOR_TYPE,  /* bDescriptorType: Interface */
      /* Interface descriptor type */
      CDC1_COMM_INTERFACE,   /* bInterfaceNumber: Number of Interface */
      0x00,   /* bAlternateSetting: Alternate setting */
      0x01,   /* bNumEndpoints: One endpoints used */
      0xE0,   /* bInterfaceClass: Communication Interface Class */
      0x01,   /* bInterfaceSubClass: Abstract Control Model */
      0x03,   /* bInterfaceProtocol: Common AT commands */
      INTF_STRING_INDEX + 2,   /* iInterface: */
 
      /*Header Functional Descriptor*/
      0x05,   /* bLength: Endpoint Descriptor size */
      0x24,   /* bDescriptorType: CS_INTERFACE */
      0x00,   /* bDescriptorSubtype: Header Func Desc */
      0x10,   /* bcdCDC: spec release number */
      0x01,
 
      /*Call Management Functional Descriptor*/
      0x05,   /* bFunctionLength */
      0x24,   /* bDescriptorType: CS_INTERFACE */
      0x01,   /* bDescriptorSubtype: Call Management Func Desc */
      0x00,   /* bmCapabilities: D0+D1 */
      CDC1_DATA_INTERFACE,   /* bDataInterface: 2 */
 
      /*ACM Functional Descriptor*/
      0x04,   /* bFunctionLength */
      0x24,   /* bDescriptorType: CS_INTERFACE */
      0x02,   /* bDescriptorSubtype: Abstract Control Management desc */
      0x00,   /* bmCapabilities */
 
      /*Union Functional Descriptor*/
      0x05,   /* bFunctionLength */
      0x24,   /* bDescriptorType: CS_INTERFACE */
      0x06,   /* bDescriptorSubtype: Union func desc */
      CDC1_COMM_INTERFACE,   /* bMasterInterface: Communication class interface */
      CDC1_DATA_INTERFACE,   /* bSlaveInterface0: Data Class Interface */
 
      /*Endpoint 2 Descriptor*/
      0x07,                           /* bLength: Endpoint Descriptor size */
      USB_ENDPOINT_DESCRIPTOR_TYPE,   /* bDescriptorType: Endpoint */
      CDC1_INTEP_ADDR,                     /* bEndpointAddress */
      0x03,                           /* bmAttributes: Interrupt */
      LOBYTE(CDC_CMD_PACKET_SZE),     /* wMaxPacketSize: */
      HIBYTE(CDC_CMD_PACKET_SZE),
      0x01,                           /* bInterval: */
 
      /*Data class interface descriptor*/
      0x09,   /* bLength: Endpoint Descriptor size */
      USB_INTERFACE_DESCRIPTOR_TYPE,  /* bDescriptorType: */
      CDC1_DATA_INTERFACE,   /* bInterfaceNumber: Number of Interface */
      0x00,   /* bAlternateSetting: Alternate setting */
      0x02,   /* bNumEndpoints: Two endpoints used */
      0x0A,   /* bInterfaceClass: CDC */
      0x00,   /* bInterfaceSubClass: */
      0x00,   /* bInterfaceProtocol: */
      0x00,   /* iInterface: */
 
      /*Endpoint OUT Descriptor*/
      0x07,   /* bLength: Endpoint Descriptor size */
      USB_ENDPOINT_DESCRIPTOR_TYPE,      /* bDescriptorType: Endpoint */
      CDC1_OUTEP_ADDR,                            /* bEndpointAddress */
      0x02,                              /* bmAttributes: Bulk */
      LOBYTE(CDC_DATA_MAX_PACKET_SIZE),  /* wMaxPacketSize: */
      HIBYTE(CDC_DATA_MAX_PACKET_SIZE),
      0x00,                             /* bInterval: ignore for Bulk transfer */
 
      /*Endpoint IN Descriptor*/
      0x07,   /* bLength: Endpoint Descriptor size */
      USB_ENDPOINT_DESCRIPTOR_TYPE,     /* bDescriptorType: Endpoint */
      CDC1_INEP_ADDR,                        /* bEndpointAddress */
      0x02,                             /* bmAttributes: Bulk */
      LOBYTE(CDC_DATA_MAX_PACKET_SIZE),  /* wMaxPacketSize: */
      HIBYTE(CDC_DATA_MAX_PACKET_SIZE),
      0x00,                              /* bInterval */
/*---------------------------------------------------------------------------*/
};

Запускаешь устройство, подключаешь устройство по USB и ВУАЛЯ!!! Три устройства определяются и работают (кроме одного - RNDIS, так как неправильно сконфигурирован, а точнее вообще не сконфигурирован).
И всё работает прекрасно. Флешка определяется - файлы вижу. Виртуальный ком-порт работает - данные шлются.
НО!
После перезагрузки устройства не вынимая кабеля устройство становиться неопознанным.
Далее после переподключения кабеля появиться моя флешка, но ком-порт уже отвалился и подключится я к нему не могу.
Кто подскажет куда копать? Как правильно перезагрузить устройство, чтобы оно нормально определялось по USB.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.08.2019, 17:02
Ответы с готовыми решениями:

STM32f205 && USB MSC HOST
Привет форумчане. Решил выбросить из некоего своего проекта SD-карточку, но у меня прошивка через нее обновляется :-/ не фонтан. Ну что-ж...

STM32F205 USB HOST подключение клавиатуры (проблемы)(решено)
Всем доброго утра, уже неделю рою интернет, использую метод "Вариантстного Программирования" (метод тыка) и прочее. Толку ноль, словно...

STM32f205 КЗ по питанию
Запаял stm32f205 в lqfp64 корпусе на макетную плату. Все VDD + VBOT соединил вместе с + пит, VSS - вместе на землю, VCAP - через...

20
Почетный модератор
 Аватар для Humanoid
11551 / 4346 / 452
Регистрация: 12.06.2008
Сообщений: 12,452
09.08.2019, 23:04
Могу предположить, что подтяжка линии D+ осуществляется внешним резистором, который жёстко припаян. При перезагрузке STM забыл, что он подключен, а компьютер этого не заметил и продолжает пытаться с ним работать. Могу предположить, что когда после этого передёрнули устройство, то ОС компьютера не успела удалить старый COM-порт и новый создался с другим номером.
Цитата Сообщение от Искандер_61 Посмотреть сообщение
Как правильно перезагрузить устройство, чтобы оно нормально определялось по USB.
Если моё предыдущее предположение верно, то надо дёрнуть подтяжку при загрузке МК. Но если резистор просто запаян между D+ и 3.3В, то этого сделать не получится. Я обычно этот резистор подключаю через p-канальный транзистор специально для этих целей.
1
 Аватар для COKPOWEHEU
4078 / 2676 / 432
Регистрация: 09.09.2017
Сообщений: 11,887
09.08.2019, 23:38
В vusb это делается удерживанием состояния SE0 (D+ = D- = лог.0). Причем это работает лучше, чем управление подтяжкой!
1
0 / 0 / 1
Регистрация: 28.09.2013
Сообщений: 61
10.08.2019, 11:53  [ТС]
Цитата Сообщение от Humanoid Посмотреть сообщение
Могу предположить, что подтяжка линии D+ осуществляется внешним резистором, который жёстко припаян.
Устройство разводил не я. Там подтяжки вообще никакой не было. Я подтянул D+ через 1,5КОм к VBUS. Буду переделывать подтяжку и дергать.
Благодарю, буду копать, если возникнут вопросы напишу, да и если получиться с подтяжкой решить вопрос, тоже напишу сюда
0
Почетный модератор
 Аватар для Humanoid
11551 / 4346 / 452
Регистрация: 12.06.2008
Сообщений: 12,452
10.08.2019, 12:47
Действительно, я почему-то раньше не подумал. Можно в самом начале программы (ещё до инициализации USB) перевести пин D+ в режим GPIO (PushPull или OpenDrain) и выставить его в 0 на какое-то время. И тогда не нужно управление подтяжкой. А после этого уже можно инициализировать USB.
А я не подумав развёл уже две платы с лишним транзистором, хотя можно было без него обойтись
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,852
10.08.2019, 15:44
Цитата Сообщение от Искандер_61 Посмотреть сообщение
Я подтянул D+ через 1,5КОм к VBUS.
подтяни к любой ножке и 0 нет инициализации 1 есть, так же как делал Humanoid, только без транзистора, по моему мнению лишний он
а у HAL есть специальный каллбэк для подключения линии УСБ, имени я сейчас не помню

Добавлено через 1 минуту
Цитата Сообщение от Искандер_61 Посмотреть сообщение
Устройство разводил не я. Там подтяжки вообще никакой не было.
странно это без подтяжки никакой USB работать не будет
0
0 / 0 / 1
Регистрация: 28.09.2013
Сообщений: 61
12.08.2019, 10:04  [ТС]
Цитата Сообщение от ValeryS Посмотреть сообщение
подтяни к любой ножке и 0 нет инициализации 1 есть
Вот так и сделал. И теперь всё заработало. При перезагрузке вновь появляются устройства. Благодарю всех.
0
0 / 0 / 1
Регистрация: 28.09.2013
Сообщений: 61
13.08.2019, 12:08  [ТС]
И всё-таки взываю на помощь к форумчанам.
Решив этот вопрос с подтяжкой и перезагрузкой устройства. Появилась чутка другая проблема.
Запускаем устройство, вставляем USB и диспетчер устройств показывает, что определено 3 новых устройства*.
Открываем VCP порт - пишем пару команд (CLI), получаем ответы - тут всё хорошо.
Перезагружаем устройство с помощью команды "reset". И немного ждем. VCP - отваливается не надолго.
Далее вытаскиваем USB-кабель и вставляем его обратно. Появляется ТОЛЬКО флешка! VCP не появляется.
И тут я в ступоре уже второй день сижу и не могу понять. Такое ощущение, что устройство заново не хочет настраиваться. Может кто подскажет, откуда начать поиски проблемы?
*Думал, что два CDC конфликтуют друг с другом убрал RNDIS - история не изменилась.
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,852
13.08.2019, 15:39
Цитата Сообщение от Искандер_61 Посмотреть сообщение
Перезагружаем устройство с помощью команды "reset". И немного ждем. VCP - отваливается не надолго.
Далее вытаскиваем USB-кабель и вставляем его обратно. Появляется ТОЛЬКО флешка! VCP не появляется.
И тут я в ступоре уже второй день сижу и не могу понять.
запусти УСБ снифер и посмотри какие пакеты хост передает\ получает в каждом случае
мне нравится USBLyzer
Цитата Сообщение от Искандер_61 Посмотреть сообщение
Решив этот вопрос с подтяжкой и перезагрузкой устройства.
а подтяжку правильно включаешь \ выключаешь? в коллбэк функции?
0
 Аватар для _SayHello
874 / 535 / 175
Регистрация: 30.07.2015
Сообщений: 1,739
13.08.2019, 16:59
Искандер_61,
Цитата Сообщение от Искандер_61 Посмотреть сообщение
Далее вытаскиваем USB-кабель и вставляем его обратно. Появляется ТОЛЬКО флешка! VCP не появляется.
Когда разбирался с USB у меня была проблема, если отключить питание устройства когда шнурок в ПК, а затем включить то CDC не распознавался заново.
Дело было вот какое, линия D+ была подтянута к VBUS. Когда пропадало питание устройства линия D+ была все равно подтянута. Драйвер не заметил переподключения устройства, а посчитал (это я так думаю), что устройство просто перестало отвечать. Ресет устройтва происходит когда состояние линии D+ меняется с 0 в 1 (если я правильно помню). Когда мы кабель выдергиваем и вставляем заново, то так и происходит.
Как я решил проблему:
Завел подтяжку D+ на пин а не на VBUS.
При включении устройства, инициализирую пин на выход и ставлю 0. Инициализирую USB и затем поднимаю пин в 1. Таким образом сообщаю хосту, что готов общаться.
Вот вроде кусок из того проекта.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
void AVSCom_USBConnectionPin_Init(GPIO_TypeDef * GPIOx, uint32_t pin)
{
    USBConnectionPinPort = GPIOx;
    USBConnectionPin = pin;
 
    SetPortRCC(GPIOx);
 
    GPIO_InitTypeDef pins;
 
    pins.GPIO_Pin   =   pin;
    pins.GPIO_Mode  =   GPIO_Mode_OUT;
    pins.GPIO_OType =   GPIO_OType_PP;
    pins.GPIO_PuPd  =   GPIO_PuPd_NOPULL;
    pins.GPIO_Speed =   GPIO_Speed_2MHz;
    GPIO_Init(GPIOx, &pins);
 
    GPIO_ResetBits(GPIOx, pin);
}
 
 
void AVSCom_Init(Communication_TypeDef * Com)
{
    AVSCom_USBConnectionPin_Init(GPIOA, GPIO_Pin_9);
    Set_System();                                           /**< Initializes pins of USB */
    Set_USBClock();                                         /**< Set RCC of device USB */
    USB_Interrupts_Config();                                /**< Configurate interrupts of USB */
    USB_Init();                                             /**< Configure CDC descriptors */
 
    AVSCom_USBConnectionPin_Set(); /*Pull D+ Up*/
 
    Com->ComSemaphore = xSemaphoreCreateBinary();           /**< Create semaphore that shows end of message */
    Flags.ReadyToReceive = true;
}
можо подтянуть к VBUS через транзистор и дергать его.

Добавлено через 10 минут
Искандер_61, а еще вроде была проблема, что если мы подруибили CDC и открыли терминал на этот порт, то если мы выдернем шнурок не закрыв порт в терминале, то при включении устройство не определится. Пока мы не освободим порт и снова переподключим устройство. Тут я не понял как решать проблему. В своей программе, я просто закрываю порт, если устройство не ответило в течение таймаута.
0
0 / 0 / 1
Регистрация: 28.09.2013
Сообщений: 61
13.08.2019, 17:05  [ТС]
Цитата Сообщение от ValeryS Посмотреть сообщение
а подтяжку правильно включаешь \ выключаешь? в коллбэк функции?
Я подтяжку включаю, только перед инициализацией USB, в самом старте программе.
Цитата Сообщение от ValeryS Посмотреть сообщение
запусти УСБ снифер и посмотри какие пакеты хост передает
А вот тут он интересные вещи показывает:
При первом включении всё шикарно определяется и работает, а вот при переподключении USB-кабеля, дескриптор с какого-то перепоя меняется. Картинки скидываю.
Плюс заметил, что если на одном устройстве пробегает команда "Close", то на другом данная команда отсутствует (пока не разобрался как узнать, кто-есть кто).
===============================
И еще замечание:
В файле usbd_usr.c есть команды, отображающие что произошло: я перенаправил вывод на дебажный USART.
И вот, что получаю:
Code
1
2
3
Device reset
Device reset
Device configured
После отсоединения кабеля:
Code
1
Device suspended
Подсоединяем еще раз кабель:
Code
1
2
3
4
Device suspended
Device reset
Device reset
Device configured
Миниатюры
STM32F205 Работа с USB   STM32F205 Работа с USB  
0
0 / 0 / 1
Регистрация: 28.09.2013
Сообщений: 61
13.08.2019, 17:10  [ТС]
Цитата Сообщение от _SayHello Посмотреть сообщение
а еще вроде была проблема, что если мы подруибили CDC и открыли терминал на этот порт, то если мы выдернем шнурок не закрыв порт в терминале, то при включении устройство не определится.
Спасибо за развернутый ответ.
Дело в том, что я даже порт не открываю я просто смотрю появившиеся порты в программе SmarTTY или же в диспетчере устройств.
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,852
13.08.2019, 17:50
Цитата Сообщение от Искандер_61 Посмотреть сообщение
Я подтяжку включаю, только перед инициализацией USB, в самом старте программе.
так это неправильно
ищи функцию HAL_PCDEx_SetConnectionState
вот как она реализована у меня

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/**
  * @brief Software Device Connection
  * @param hpcd: PCD handle
  * @param state: Connection state (0: disconnected / 1: connected)
  * @retval None
  */
void HAL_PCDEx_SetConnectionState(PCD_HandleTypeDef *hpcd, uint8_t state)
{
  /* USER CODE BEGIN 6 */
  if (state == 1)
  {
    /* Configure Low connection state. */
        HAL_GPIO_WritePin(USBEnable_GPIO_Port,USBEnable_Pin, GPIO_PIN_SET);
  }
  else
  {
    /* Configure High connection state. */
        HAL_GPIO_WritePin(USBEnable_GPIO_Port,USBEnable_Pin, GPIO_PIN_RESET);
  }
  /* USER CODE END 6 */
}
у меня она в файле usbd_conf.c
0
0 / 0 / 1
Регистрация: 28.09.2013
Сообщений: 61
13.08.2019, 17:59  [ТС]
Цитата Сообщение от ValeryS Посмотреть сообщение
ищи функцию HAL_PCDEx_SetConnectionState
Я, конечно, щас пошустрю что-то похожее, но у меня не HAL а SPL - это раз.
А два, я сейчас порулил и вручную подтягивал на землю этот пин. Всё тоже самое. Появляется флешка, а vcp-порт отваливается.
И три: Что скажешь по поводу дескрипторов? Как вообще может такое происходить?
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,852
13.08.2019, 18:14
Цитата Сообщение от Искандер_61 Посмотреть сообщение
но у меня не HAL а SPL - это раз.
c SPL уже года три не работал
подниму старые проекты может что то найду
Цитата Сообщение от Искандер_61 Посмотреть сообщение
А два, я сейчас порулил и вручную подтягивал на землю этот пин.
ну и ? после этого идут запросы от хоста и на них он должен получить ответ за определенное время, иначе отключает устройство
как это можно вручную синхронизировать?
и еще
Цитата Сообщение от Искандер_61 Посмотреть сообщение
я перенаправил вывод на дебажный USART.
выключи время много занимает можно не успеть
0
 Аватар для _SayHello
874 / 535 / 175
Регистрация: 30.07.2015
Сообщений: 1,739
13.08.2019, 18:21
Искандер_61,
Цитата Сообщение от Искандер_61 Посмотреть сообщение
подтяжку включаю, только перед инициализацией USB, в самом старте программе.
А если дернуть подтяжку после инициализации USB? Ведь если подтянуть до, то хост начнет кидать запросы в то время когда устройство еще не готово.
0
0 / 0 / 1
Регистрация: 28.09.2013
Сообщений: 61
13.08.2019, 18:23  [ТС]
Цитата Сообщение от ValeryS Посмотреть сообщение
ну и ?
Я написал, что всё тож самое - vcp отваливается.
Цитата Сообщение от ValeryS Посмотреть сообщение
как это можно вручную синхронизировать?
Да я понимаю, что никак! Даже если в отладке идти пошагово, то отваливается всё устройство.
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,852
13.08.2019, 18:23
вот нашел
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/*******************************************************************************
* Function Name  : PowerOn
* Description    :
* Input          : None.
* Output         : None.
* Return         : USB_SUCCESS.
*******************************************************************************/
void USB_Cable_Config (FunctionalState NewState)
{
 
  if (NewState != DISABLE)
    UsbEnable();
  else
    UsbDisable();
}
она вызывается из функций PowerOff и PowerOn
но я совершенно не помню рукописные это функции или входят в комплект SPL
C
1
2
3
4
5
6
7
8
void UsbEnable(void)
{
 USB_ENABLE_PORT->BSRR=USB_ENABLE_PIN;
}
void UsbDisable(void)
{
 USB_ENABLE_PORT->BRR=USB_ENABLE_PIN;
}
0
Почетный модератор
 Аватар для Humanoid
11551 / 4346 / 452
Регистрация: 12.06.2008
Сообщений: 12,452
13.08.2019, 23:10
Цитата Сообщение от Искандер_61 Посмотреть сообщение
Что скажешь по поводу дескрипторов? Как вообще может такое происходить?
Как объявлена переменная с дескрипторами? Как const или нет? Если без const, то она хранится в ОЗУ и теоретически вы могли где-то случайно повредить эту память. Хотя непонятно, почему при первой загрузке память не повреждается, а при перезагрузке уже повреждается.
0
0 / 0 / 1
Регистрация: 28.09.2013
Сообщений: 61
14.08.2019, 12:01  [ТС]
Цитата Сообщение от Humanoid Посмотреть сообщение
Как объявлена переменная с дескрипторами? Как const или нет?
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/* USB Standard Device Descriptor */
__ALIGN_BEGIN uint8_t USBD_DeviceDesc[USB_SIZ_DEVICE_DESC] __ALIGN_END = {
  0x12,                         /* bLength */
  USB_DEVICE_DESCRIPTOR_TYPE,   /* bDescriptorType */
  0x00,                         /* bcdUSB */
  0x02,
  0xEF,                         /* bDeviceClass */
  0x02,                         /* bDeviceSubClass */
  0x01,                         /* bDeviceProtocol */
  USB_OTG_MAX_EP0_SIZE,         /* bMaxPacketSize */
  LOBYTE(USBD_VID),             /* idVendor */
  HIBYTE(USBD_VID),             /* idVendor */
  LOBYTE(USBD_PID),             /* idVendor */
  HIBYTE(USBD_PID),             /* idVendor */
  0x00,                         /* bcdDevice rel. 2.00 */
  0x02,
  USBD_IDX_MFC_STR,             /* Index of manufacturer string */
  USBD_IDX_PRODUCT_STR,         /* Index of product string */
  USBD_IDX_SERIAL_STR,          /* Index of serial number string */
  USBD_CFG_MAX_NUM              /* bNumConfigurations */
};                              /* USB_DeviceDescriptor */
Вот сейчас сижу и думаю смеяться мне или плакать.
ValeryS, подтяжка оказалась не причем.
Действительно проблема оказалась в дескрипторе. Вот такой костыль я придумал в прерывании и всё теперь работает. Правда чуть позже буду выяснять по какой причине и где меняется этот дескриптор. Сейчас пока другая задача стоит.
C
1
2
3
4
5
6
7
8
9
10
11
12
#ifdef USE_USB_OTG_HS
void OTG_HS_IRQHandler(void)
#else
void OTG_FS_IRQHandler(void)
#endif
{   
    USBD_DeviceDesc[4] = 0xEF;
    USBD_DeviceDesc[5] = 0x02;
    taskENTER_CRITICAL_FROM_ISR();
    USBD_OTG_ISR_Handler(&USB_OTG_dev);
    taskEXIT_CRITICAL_FROM_ISR(0);
}
Добавлено через 51 минуту
Всё оказалось проще! Не нужны были костыли. Достаточно было указать const в определении дескриптора, как и написал Humanoid.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
__ALIGN_BEGIN const uint8_t USBD_DeviceDesc[USB_SIZ_DEVICE_DESC] __ALIGN_END = {
  0x12,                         /* bLength */
  USB_DEVICE_DESCRIPTOR_TYPE,   /* bDescriptorType */
  0x00,                         /* bcdUSB */
  0x02,
  0xEF,                         /* bDeviceClass */
  0x02,                         /* bDeviceSubClass */
  0x01,                         /* bDeviceProtocol */
  USB_OTG_MAX_EP0_SIZE,         /* bMaxPacketSize */
  LOBYTE(USBD_VID),             /* idVendor */
  HIBYTE(USBD_VID),             /* idVendor */
  LOBYTE(USBD_PID),             /* idVendor */
  HIBYTE(USBD_PID),             /* idVendor */
  0x00,                         /* bcdDevice rel. 2.00 */
  0x02,
  USBD_IDX_MFC_STR,             /* Index of manufacturer string */
  USBD_IDX_PRODUCT_STR,         /* Index of product string */
  USBD_IDX_SERIAL_STR,          /* Index of serial number string */
  USBD_CFG_MAX_NUM              /* bNumConfigurations */
};                              /* USB_DeviceDescriptor */
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.08.2019, 12:01
Помогаю со студенческими работами здесь

STM32F205 SIM5320E
Доброго времени суток! Не пинайте, вопрос по модему, может кто сталкивался. Существует следующая проблема: конфигурируем модем в режиме...

АЦП stm32f205
Не работает АЦП stm32f205. Собственные мысли, где может быть ошибка, кончились, поэтому обращаюсь с просьбой помочь разобраться. Пытаюсь...

NES эмулятор на stm32f205
Заделал тут девайсину. В общем то - спортивный интерес. Код был взят у китайцев (waves nes). Немного переработан и вот.. ...

STM32f205 + STMCube + Audio Example
Нашел такую замечательную прогу, как STMCube. С помощью ее сгенерировал проект USB HID - все работает. Но вот с Oudyo классом проблема -...

Работа с USB-token или usb с премудростями
Доброго пятничного утра всем! Сначала опишу что есть и как это выглядит, а потом опишу что нужно) Есть проект, в нем будут...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru