Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
 
Искандер_61
0 / 0 / 1
Регистрация: 28.09.2013
Сообщений: 60
Завершенные тесты: 2
1

STM32F205 Работа с USB

09.08.2019, 17:02. Просмотров 444. Ответов 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
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.08.2019, 17:02
Ответы с готовыми решениями:

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

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

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

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

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

20
Humanoid
Почетный модератор
10076 / 3945 / 367
Регистрация: 12.06.2008
Сообщений: 11,527
09.08.2019, 23:04 2
Могу предположить, что подтяжка линии D+ осуществляется внешним резистором, который жёстко припаян. При перезагрузке STM забыл, что он подключен, а компьютер этого не заметил и продолжает пытаться с ним работать. Могу предположить, что когда после этого передёрнули устройство, то ОС компьютера не успела удалить старый COM-порт и новый создался с другим номером.
Цитата Сообщение от Искандер_61 Посмотреть сообщение
Как правильно перезагрузить устройство, чтобы оно нормально определялось по USB.
Если моё предыдущее предположение верно, то надо дёрнуть подтяжку при загрузке МК. Но если резистор просто запаян между D+ и 3.3В, то этого сделать не получится. Я обычно этот резистор подключаю через p-канальный транзистор специально для этих целей.
1
COKPOWEHEU
1572 / 1065 / 248
Регистрация: 09.09.2017
Сообщений: 4,367
09.08.2019, 23:38 3
В vusb это делается удерживанием состояния SE0 (D+ = D- = лог.0). Причем это работает лучше, чем управление подтяжкой!
1
Искандер_61
0 / 0 / 1
Регистрация: 28.09.2013
Сообщений: 60
Завершенные тесты: 2
10.08.2019, 11:53  [ТС] 4
Цитата Сообщение от Humanoid Посмотреть сообщение
Могу предположить, что подтяжка линии D+ осуществляется внешним резистором, который жёстко припаян.
Устройство разводил не я. Там подтяжки вообще никакой не было. Я подтянул D+ через 1,5КОм к VBUS. Буду переделывать подтяжку и дергать.
Благодарю, буду копать, если возникнут вопросы напишу, да и если получиться с подтяжкой решить вопрос, тоже напишу сюда
0
10.08.2019, 11:53
Humanoid
Почетный модератор
10076 / 3945 / 367
Регистрация: 12.06.2008
Сообщений: 11,527
10.08.2019, 12:47 5
Действительно, я почему-то раньше не подумал. Можно в самом начале программы (ещё до инициализации USB) перевести пин D+ в режим GPIO (PushPull или OpenDrain) и выставить его в 0 на какое-то время. И тогда не нужно управление подтяжкой. А после этого уже можно инициализировать USB.
А я не подумав развёл уже две платы с лишним транзистором, хотя можно было без него обойтись
0
ValeryS
Модератор
7820 / 5819 / 758
Регистрация: 14.02.2011
Сообщений: 19,944
Завершенные тесты: 1
10.08.2019, 15:44 6
Цитата Сообщение от Искандер_61 Посмотреть сообщение
Я подтянул D+ через 1,5КОм к VBUS.
подтяни к любой ножке и 0 нет инициализации 1 есть, так же как делал Humanoid, только без транзистора, по моему мнению лишний он
а у HAL есть специальный каллбэк для подключения линии УСБ, имени я сейчас не помню

Добавлено через 1 минуту
Цитата Сообщение от Искандер_61 Посмотреть сообщение
Устройство разводил не я. Там подтяжки вообще никакой не было.
странно это без подтяжки никакой USB работать не будет
0
Искандер_61
0 / 0 / 1
Регистрация: 28.09.2013
Сообщений: 60
Завершенные тесты: 2
12.08.2019, 10:04  [ТС] 7
Цитата Сообщение от ValeryS Посмотреть сообщение
подтяни к любой ножке и 0 нет инициализации 1 есть
Вот так и сделал. И теперь всё заработало. При перезагрузке вновь появляются устройства. Благодарю всех.
0
Искандер_61
0 / 0 / 1
Регистрация: 28.09.2013
Сообщений: 60
Завершенные тесты: 2
13.08.2019, 12:08  [ТС] 8
И всё-таки взываю на помощь к форумчанам.
Решив этот вопрос с подтяжкой и перезагрузкой устройства. Появилась чутка другая проблема.
Запускаем устройство, вставляем USB и диспетчер устройств показывает, что определено 3 новых устройства*.
Открываем VCP порт - пишем пару команд (CLI), получаем ответы - тут всё хорошо.
Перезагружаем устройство с помощью команды "reset". И немного ждем. VCP - отваливается не надолго.
Далее вытаскиваем USB-кабель и вставляем его обратно. Появляется ТОЛЬКО флешка! VCP не появляется.
И тут я в ступоре уже второй день сижу и не могу понять. Такое ощущение, что устройство заново не хочет настраиваться. Может кто подскажет, откуда начать поиски проблемы?
*Думал, что два CDC конфликтуют друг с другом убрал RNDIS - история не изменилась.
0
ValeryS
Модератор
7820 / 5819 / 758
Регистрация: 14.02.2011
Сообщений: 19,944
Завершенные тесты: 1
13.08.2019, 15:39 9
Цитата Сообщение от Искандер_61 Посмотреть сообщение
Перезагружаем устройство с помощью команды "reset". И немного ждем. VCP - отваливается не надолго.
Далее вытаскиваем USB-кабель и вставляем его обратно. Появляется ТОЛЬКО флешка! VCP не появляется.
И тут я в ступоре уже второй день сижу и не могу понять.
запусти УСБ снифер и посмотри какие пакеты хост передает\ получает в каждом случае
мне нравится USBLyzer
Цитата Сообщение от Искандер_61 Посмотреть сообщение
Решив этот вопрос с подтяжкой и перезагрузкой устройства.
а подтяжку правильно включаешь \ выключаешь? в коллбэк функции?
0
_SayHello
723 / 430 / 138
Регистрация: 30.07.2015
Сообщений: 1,442
13.08.2019, 16:59 10
Искандер_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
Искандер_61
0 / 0 / 1
Регистрация: 28.09.2013
Сообщений: 60
Завершенные тесты: 2
13.08.2019, 17:05  [ТС] 11
Цитата Сообщение от ValeryS Посмотреть сообщение
а подтяжку правильно включаешь \ выключаешь? в коллбэк функции?
Я подтяжку включаю, только перед инициализацией USB, в самом старте программе.
Цитата Сообщение от ValeryS Посмотреть сообщение
запусти УСБ снифер и посмотри какие пакеты хост передает
А вот тут он интересные вещи показывает:
При первом включении всё шикарно определяется и работает, а вот при переподключении USB-кабеля, дескриптор с какого-то перепоя меняется. Картинки скидываю.
Плюс заметил, что если на одном устройстве пробегает команда "Close", то на другом данная команда отсутствует (пока не разобрался как узнать, кто-есть кто).
===============================
И еще замечание:
В файле usbd_usr.c есть команды, отображающие что произошло: я перенаправил вывод на дебажный USART.
И вот, что получаю:
Код
Device reset
Device reset
Device configured
После отсоединения кабеля:
Код
Device suspended
Подсоединяем еще раз кабель:
Код
Device suspended
Device reset
Device reset
Device configured
0
Миниатюры
STM32F205 Работа с USB   STM32F205 Работа с USB  
Искандер_61
0 / 0 / 1
Регистрация: 28.09.2013
Сообщений: 60
Завершенные тесты: 2
13.08.2019, 17:10  [ТС] 12
Цитата Сообщение от _SayHello Посмотреть сообщение
а еще вроде была проблема, что если мы подруибили CDC и открыли терминал на этот порт, то если мы выдернем шнурок не закрыв порт в терминале, то при включении устройство не определится.
Спасибо за развернутый ответ.
Дело в том, что я даже порт не открываю я просто смотрю появившиеся порты в программе SmarTTY или же в диспетчере устройств.
0
ValeryS
Модератор
7820 / 5819 / 758
Регистрация: 14.02.2011
Сообщений: 19,944
Завершенные тесты: 1
13.08.2019, 17:50 13
Цитата Сообщение от Искандер_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
Искандер_61
0 / 0 / 1
Регистрация: 28.09.2013
Сообщений: 60
Завершенные тесты: 2
13.08.2019, 17:59  [ТС] 14
Цитата Сообщение от ValeryS Посмотреть сообщение
ищи функцию HAL_PCDEx_SetConnectionState
Я, конечно, щас пошустрю что-то похожее, но у меня не HAL а SPL - это раз.
А два, я сейчас порулил и вручную подтягивал на землю этот пин. Всё тоже самое. Появляется флешка, а vcp-порт отваливается.
И три: Что скажешь по поводу дескрипторов? Как вообще может такое происходить?
0
ValeryS
Модератор
7820 / 5819 / 758
Регистрация: 14.02.2011
Сообщений: 19,944
Завершенные тесты: 1
13.08.2019, 18:14 15
Цитата Сообщение от Искандер_61 Посмотреть сообщение
но у меня не HAL а SPL - это раз.
c SPL уже года три не работал
подниму старые проекты может что то найду
Цитата Сообщение от Искандер_61 Посмотреть сообщение
А два, я сейчас порулил и вручную подтягивал на землю этот пин.
ну и ? после этого идут запросы от хоста и на них он должен получить ответ за определенное время, иначе отключает устройство
как это можно вручную синхронизировать?
и еще
Цитата Сообщение от Искандер_61 Посмотреть сообщение
я перенаправил вывод на дебажный USART.
выключи время много занимает можно не успеть
0
_SayHello
723 / 430 / 138
Регистрация: 30.07.2015
Сообщений: 1,442
13.08.2019, 18:21 16
Искандер_61,
Цитата Сообщение от Искандер_61 Посмотреть сообщение
подтяжку включаю, только перед инициализацией USB, в самом старте программе.
А если дернуть подтяжку после инициализации USB? Ведь если подтянуть до, то хост начнет кидать запросы в то время когда устройство еще не готово.
0
Искандер_61
0 / 0 / 1
Регистрация: 28.09.2013
Сообщений: 60
Завершенные тесты: 2
13.08.2019, 18:23  [ТС] 17
Цитата Сообщение от ValeryS Посмотреть сообщение
ну и ?
Я написал, что всё тож самое - vcp отваливается.
Цитата Сообщение от ValeryS Посмотреть сообщение
как это можно вручную синхронизировать?
Да я понимаю, что никак! Даже если в отладке идти пошагово, то отваливается всё устройство.
0
ValeryS
Модератор
7820 / 5819 / 758
Регистрация: 14.02.2011
Сообщений: 19,944
Завершенные тесты: 1
13.08.2019, 18:23 18
вот нашел
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
Почетный модератор
10076 / 3945 / 367
Регистрация: 12.06.2008
Сообщений: 11,527
13.08.2019, 23:10 19
Цитата Сообщение от Искандер_61 Посмотреть сообщение
Что скажешь по поводу дескрипторов? Как вообще может такое происходить?
Как объявлена переменная с дескрипторами? Как const или нет? Если без const, то она хранится в ОЗУ и теоретически вы могли где-то случайно повредить эту память. Хотя непонятно, почему при первой загрузке память не повреждается, а при перезагрузке уже повреждается.
0
Искандер_61
0 / 0 / 1
Регистрация: 28.09.2013
Сообщений: 60
Завершенные тесты: 2
14.08.2019, 12:01  [ТС] 20
Цитата Сообщение от 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
14.08.2019, 12:01
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.08.2019, 12:01

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

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

Модуль EMW3162 (STM32F205 + WIFI BroadCom BCM43362)
&lt;Изображение удалено&gt; &lt;Изображение удалено&gt; Компания MXCHIP выпустила модуль...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru