|
STM32CubeMX и USB CDC, какие функции использовать? |
|
|
|
 |
Ответов
|
Jul 31 2014, 07:49
|
Местный
  
Группа: Участник
Сообщений: 491
Регистрация: 18-05-11
Пользователь №: 65 102

|
Цитата(den_po @ Jul 31 2014, 11:33)  Её не нужно самостоятельно вызывать, это колбэк, он вызывается при поступлении данных. А вот сообщать, что мы готовы принимать очередной пакет, нужно уже самому с помощью USBD_CDC_ReceivePacket. так я и спрашиваю, где она у Вас вызывается? весь путь по которому CDC_Transmit_FS вызывается, он ведь должен вести в конце концов к OTG_HS_IRQHandler? там обрабатывается флаг прихода данных, вызывается куча функций и в конце концов CDC_Transmit_FS, так ведь должно быть? у меня CDC_Transmit_FS из OTG_FS_IRQHandler не вызывается.
|
|
|
|
|
Jul 31 2014, 08:08
|
Частый гость
 
Группа: Участник
Сообщений: 139
Регистрация: 9-11-12
Из: Санкт-Петербург
Пользователь №: 74 315

|
Цитата(Atlantis- @ Jul 31 2014, 11:49)  так я и спрашиваю, где она у Вас вызывается? весь путь по которому CDC_Transmit_FS вызывается, он ведь должен вести в конце концов к OTG_HS_IRQHandler? там обрабатывается флаг прихода данных, вызывается куча функций и в конце концов CDC_Transmit_FS, так ведь должно быть? у меня CDC_Transmit_FS из OTG_FS_IRQHandler не вызывается. Давайте для начала определимся, CDC_Transmit_FS или CDC_Receive_FS. CDC_Transmit_FS вызывается по желанию. Я пробовал и из главного цикла, и из CDC_Receive_FS. CDC_Receive_FS в моём случае (stm32f072) вызывается по такой цепочке: USB_IRQHandler -> HAL_PCD_IRQHandler -> PCD_EP_ISR_Handler -> HAL_PCD_DataOutStageCallback -> USBD_LL_DataOutStage -> USBD_CDC_DataOut -> CDC_Receive_FS. Вызывается колбэк не напрямую, а через табличку указателей, которая регистрируется в функции MX_USB_DEVICE_Init (usb_device.c)
|
|
|
|
|
Jul 31 2014, 08:29
|
Местный
  
Группа: Участник
Сообщений: 491
Регистрация: 18-05-11
Пользователь №: 65 102

|
Цитата(den_po @ Jul 31 2014, 12:08)  Давайте для начала определимся, CDC_Transmit_FS или CDC_Receive_FS. CDC_Transmit_FS вызывается по желанию. Я пробовал и из главного цикла, и из CDC_Receive_FS. CDC_Receive_FS в моём случае (stm32f072) вызывается по такой цепочке: USB_IRQHandler -> HAL_PCD_IRQHandler -> PCD_EP_ISR_Handler -> HAL_PCD_DataOutStageCallback -> USBD_LL_DataOutStage -> USBD_CDC_DataOut -> CDC_Receive_FS. Вызывается колбэк не напрямую, а через табличку указателей, которая регистрируется в функции MX_USB_DEVICE_Init (usb_device.c) извините перепутал, CDC_Receive_FS конечно. у меня проект для STM32F429ZI (точнее для платы Discovery с ним), так вот там CDC_Receive_FS вызывается только при инициализации, а в прерывании - нет. теперь, зная Вашу цепочку, я наверное смогу прописать вызов CDC_Receive_FS куда надо)) Цитата(den_po @ Jul 31 2014, 12:08)  Вызывается колбэк не напрямую, а через табличку указателей, которая регистрируется в функции MX_USB_DEVICE_Init (usb_device.c) что за табличка кстати?
|
|
|
|
|
Jul 31 2014, 10:05
|
Частый гость
 
Группа: Участник
Сообщений: 139
Регистрация: 9-11-12
Из: Санкт-Петербург
Пользователь №: 74 315

|
Цитата(Atlantis- @ Jul 31 2014, 12:29)  извините перепутал, CDC_Receive_FS конечно. у меня проект для STM32F429ZI (точнее для платы Discovery с ним), так вот там CDC_Receive_FS вызывается только при инициализации, а в прерывании - нет. теперь, зная Вашу цепочку, я наверное смогу прописать вызов CDC_Receive_FS куда надо)) А может, при инициализации срабатывает прерывание? Данные в МК чем посылаются? Я писал уже, после вызова CDC_Receive_FS нужно вызывать USBD_CDC_ReceivePacket, иначе следующий пакет не примется. Точно дело не в этом? Цитата(Atlantis- @ Jul 31 2014, 12:29)  что за табличка кстати? Код USBD_CDC_ItfTypeDef USBD_Interface_fops_FS = { CDC_Init_FS, CDC_DeInit_FS, CDC_Control_FS, CDC_Receive_FS };
|
|
|
|
|
Jul 31 2014, 10:42
|
Местный
  
Группа: Участник
Сообщений: 491
Регистрация: 18-05-11
Пользователь №: 65 102

|
Цитата(den_po @ Jul 31 2014, 14:05)  А может, при инициализации срабатывает прерывание? Данные в МК чем посылаются? хм, может, ну и что. данные посылаю из фирменной тестовой программы Цитата(den_po @ Jul 31 2014, 14:05)  Я писал уже, после вызова CDC_Receive_FS нужно вызывать USBD_CDC_ReceivePacket, иначе следующий пакет не примется. Точно дело не в этом? я прикрутил прием данных в USBD_LL_DataOutStage, после отправки второго пакета тестовая программа виснет, видимо нет подтверждения или еще чего. причем USBD_CDC_ReceivePacket меня не спас. ой, сейчас поробовал - уже не виснет=))) можете показать содержимое функции USBD_LL_DataOutStage, а то у меня там никакой USBD_CDC_DataOut нет, она фигурирует только в структуре Код /* CDC interface class callbacks structure */ USBD_ClassTypeDef USBD_CDC = { USBD_CDC_Init, USBD_CDC_DeInit, USBD_CDC_Setup, NULL, /* EP0_TxSent, */ USBD_CDC_EP0_RxReady, USBD_CDC_DataIn, USBD_CDC_DataOut, NULL, NULL, NULL, USBD_CDC_GetHSCfgDesc, USBD_CDC_GetFSCfgDesc, USBD_CDC_GetOtherSpeedCfgDesc, USBD_CDC_GetDeviceQualifierDescriptor, }; причем USBD_CDC опять нигде не фигурирует, только в Код #define USBD_CDC_CLASS &USBD_CDC , а USBD_CDC_CLASS нигде больше нет Цитата(den_po @ Jul 31 2014, 14:05)  Код USBD_CDC_ItfTypeDef USBD_Interface_fops_FS = { CDC_Init_FS, CDC_DeInit_FS, CDC_Control_FS, CDC_Receive_FS }; такая табличка у меня есть
Сообщение отредактировал Atlantis- - Jul 31 2014, 11:32
|
|
|
|
|
Jul 31 2014, 12:18
|
Частый гость
 
Группа: Участник
Сообщений: 139
Регистрация: 9-11-12
Из: Санкт-Петербург
Пользователь №: 74 315

|
Цитата(Atlantis- @ Jul 31 2014, 14:42)  я прикрутил прием данных в USBD_LL_DataOutStage Вот этого не понял Цитата(Atlantis- @ Jul 31 2014, 14:42)  можете показать содержимое функции USBD_LL_DataOutStage, а то у меня там никакой USBD_CDC_DataOut нет, она фигурирует только в структуре Так там тоже через таблички всё идёт. Предложение. Проверьте свежесгенерированный кубом код, измените только эти две функции: Код static int8_t CDC_Receive_FS (uint8_t* Buf, uint32_t *Len) { /* USER CODE BEGIN 7 */ CDC_Transmit_FS(Buf, *Len); USBD_CDC_ReceivePacket(hUsbDevice_0); return (USBD_OK); /* USER CODE END 7 */ } uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len) { uint8_t result = USBD_OK; /* USER CODE BEGIN 8 */ memcpy(UserTxBufferFS,Buf,Len); USBD_CDC_SetTxBuffer(hUsbDevice_0, UserTxBufferFS, Len); result = USBD_CDC_TransmitPacket(hUsbDevice_0); /* USER CODE END 8 */ return result; } Должно эхом возвращать то, что принимает. Хе, сейчас вот наткнулся на баг в F0 Код USBD_StatusTypeDef USBD_LL_Init (USBD_HandleTypeDef *pdev) { ... hpcd_USB_FS.Init.dev_endpoints = 8; Код PCD_EPTypeDef IN_ep[5]; /*!< IN endpoint parameters */ PCD_EPTypeDef OUT_ep[5]; /*!< OUT endpoint parameters */ Из-за этого херится чужая память.
|
|
|
|
|
Aug 1 2014, 05:55
|
Местный
  
Группа: Участник
Сообщений: 491
Регистрация: 18-05-11
Пользователь №: 65 102

|
Цитата(den_po @ Jul 31 2014, 16:18)  Хе, сейчас вот наткнулся на баг в F0 Код USBD_StatusTypeDef USBD_LL_Init (USBD_HandleTypeDef *pdev) { ... hpcd_USB_FS.Init.dev_endpoints = 8; Код PCD_EPTypeDef IN_ep[5]; /*!< IN endpoint parameters */ PCD_EPTypeDef OUT_ep[5]; /*!< OUT endpoint parameters */ Из-за этого херится чужая память. у меня так Код hpcd_USB_OTG_HS.Init.dev_endpoints = 11; Код PCD_EPTypeDef IN_ep[15]; /*!< IN endpoint parameters */ PCD_EPTypeDef OUT_ep[15]; /*!< OUT endpoint parameters */ Цитата Конкретно предложенный мной вариант не работает? сейчас перетащил свою обработку в CDC_Receive_HS, хм все работает
|
|
|
|
Сообщений в этой теме
ViKo STM32CubeMX и USB CDC Jul 14 2014, 18:00 Integro посмотрите в файле usbd_cdc_if.c,
CDC_Transmit_FS... Jul 15 2014, 11:38 ViKo Цитата(Integro @ Jul 15 2014, 14:38) посм... Jul 15 2014, 20:01  Integro Цитата(ViKo @ Jul 15 2014, 23:01) Пробова... Jul 16 2014, 07:50 ViKo Из мейн функции не видны. Можно инклюдами заголово... Jul 16 2014, 08:19 Integro Цитата(ViKo @ Jul 16 2014, 11:19) Из мейн... Jul 16 2014, 12:49 ViKo Кабы я умел программировать USB в STM32, стал бы я... Jul 16 2014, 16:18 Integro Цитата(ViKo @ Jul 16 2014, 19:18) Кабы я ... Jul 17 2014, 15:06 ViKo Вот функция из usbd_cdc_if.c
Код/**
* @brief CD... Jul 20 2014, 10:14 Integro Цитата(ViKo @ Jul 20 2014, 13:14) ...
Ха,... Jul 23 2014, 08:12  ViKo Цитата(Integro @ Jul 23 2014, 11:12) Ха, ... Jul 24 2014, 12:19   Tahoe Цитата(ViKo @ Jul 24 2014, 16:19) Пытался... Jul 24 2014, 14:32    ViKo Цитата(Tahoe @ Jul 24 2014, 17:32) Ну да,... Jul 24 2014, 14:51 den_po Цитата(ViKo @ Jul 20 2014, 14:14) Вот фун... Jul 30 2014, 20:37  Atlantis- Цитата(den_po @ Jul 31 2014, 00:37) Если ... Jul 31 2014, 06:17  Atlantis- Цитата(den_po @ Jul 31 2014, 00:37) Если ... Oct 20 2014, 08:12 Golikov A. а галочки дебуг и трейс информация, 0 оптимизация ... Jul 24 2014, 12:25 ViKo Цитата(Golikov A. @ Jul 24 2014, 15:25) а... Jul 24 2014, 13:05 Golikov A. совсем недавно кто-то запускал тут ЛА и прочую фиг... Jul 24 2014, 19:02 ViKo Цитата(Golikov A. @ Jul 24 2014, 22:02) с... Jul 24 2014, 19:05 ViKo Вдруг взяло и заработало. ЛА показывает. Ничего,... Jul 24 2014, 21:11 ViKo Опять не работает ЛА. Чувствую, дело в температуре... Jul 25 2014, 08:54 Golikov A. драйвер CDC - вещь суровая, у меня есть RS485 - ви... Jul 25 2014, 20:37 ViKo По поводу логического анализатора вырисовывается с... Jul 26 2014, 11:39       Atlantis- Цитата(den_po @ Jul 31 2014, 16:18) Вот э... Jul 31 2014, 12:33        den_po Цитата(Atlantis- @ Jul 31 2014, 16:3... Jul 31 2014, 13:53 ViKo У меня внутри бесконечного цикла работает такой ко... Jul 31 2014, 07:36 Atlantis- ЦитатаПроверьте свежесгенерированный кубом код, из... Aug 1 2014, 11:08 den_po CDC_Transmit_FS нужно вызывать самостоятельно, ког... Aug 1 2014, 11:29 Atlantis- Цитата(den_po @ Aug 1 2014, 15:29) CDC_Tr... Aug 1 2014, 12:02 den_po Думаю, ерунда может приходить, если отправляются д... Aug 2 2014, 13:01 den_po Баг с мусором в F0 почти убрал. В функции usbd_con... Aug 3 2014, 00:16 Vsevolod Gromov Цитата(Предыдущий баг - должно быть 15, а не 5)
Н... Oct 15 2014, 16:29  den_po Цитата(Vsevolod Gromov @ Oct 15 2014, 20... Oct 17 2014, 20:26   Vsevolod Gromov Цитата(den_po @ Oct 18 2014, 00:26) Там д... Oct 20 2014, 10:23 den_po Последняя проблема - моя ошибка. Просто драйвер на... Aug 6 2014, 12:19 rudy_b Вопрос на ту же тему. Поднял Midware USB CDC (HAL)... Nov 14 2015, 16:43
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|