Golikov 0 24 июля, 2014 Опубликовано 24 июля, 2014 · Жалоба совсем недавно кто-то запускал тут ЛА и прочую фигню, ему там много советов давали)... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 24 июля, 2014 Опубликовано 24 июля, 2014 · Жалоба совсем недавно кто-то запускал тут ЛА и прочую фигню, ему там много советов давали)... Я давал. :rolleyes: Терзают смутные сомненья, что перегрузил я микроконтроллер работой. Программа в ОЗУ работает, быстрее, чем из флэш-памяти. Может, перекрыл какой-нибудь отладочный путь... Попробую из флэш. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 24 июля, 2014 Опубликовано 24 июля, 2014 · Жалоба Вдруг взяло и заработало. :laughing: ЛА показывает. Ничего, вроде не делал, не считая того, что перепробовал все свои платы и проекты. :rolleyes: Теперь пойду в USB. В нем тоже что-то ЛА показывает, но как-то пинка все ждет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 25 июля, 2014 Опубликовано 25 июля, 2014 · Жалоба Опять не работает ЛА. Чувствую, дело в температуре, влажности, и частоте. Вечером проверю. Еще одним чудом поделюсь, по теме. Не могу выключить компьютер, пока подключена плата F3Discivery с запущенным проектом CDC. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 25 июля, 2014 Опубликовано 25 июля, 2014 · Жалоба драйвер CDC - вещь суровая, у меня есть RS485 - виртуальный ком порт через USB, ну то есть CDC. Помехи вешают его так, что ноутбук треба выключать жестким сбросом через удержание кнопки питания, ничего не помогает, даже снять задачу и прочее, выключить тоже нельзя, стоит с черным экраном и жужит хоть всю ночь.... А еще плюсом идут БИОСы с пробуждением по USB, в винде много накрутить можно... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 26 июля, 2014 Опубликовано 26 июля, 2014 · Жалоба По поводу логического анализатора вырисовывается следующая картина. У меня Дискавери висит на USB проводе постоянно, и включается вместе с компьютером. Так вот, чтобы ЛА заработал, нужно переткнуть USB кабель в Дискавери (убрать питание на короткое время). После этого ЛА показывает сигналы. :laughing: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
den_po 0 30 июля, 2014 Опубликовано 30 июля, 2014 (изменено) · Жалоба Вот функция из usbd_cdc_if.c /** uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len) ... Вопрос - как?! Как используется параметр Buf? А вот еще один шедевр оттуда же. static int8_t CDC_Receive_FS (uint8_t* Buf, uint32_t *Len) ... Это означает, что мне нужно поработать там своей головой? Если кому ещё интересно, то вот: Внутри CDC_Transmit_FS нужно самостоятельно выполнить нужные действия. Например, скопировать или дописать содержимое Buf в UserTxBufferFS. Внутри CDC_Receive_FS нужно обработать пришедшие по USB данные. Чтобы следующий пакет успешно принялся, нужно после обработки данных (в главном цикле либо тут же в CDC_Receive_FS) вызвать USBD_CDC_ReceivePacket(hUsbDevice_0) Изменено 30 июля, 2014 пользователем den_po Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dima1060 0 31 июля, 2014 Опубликовано 31 июля, 2014 · Жалоба Если кому ещё интересно, то вот: Внутри CDC_Transmit_FS нужно самостоятельно выполнить нужные действия. Например, скопировать или дописать содержимое Buf в UserTxBufferFS. Внутри CDC_Receive_FS нужно обработать пришедшие по USB данные. Чтобы следующий пакет успешно принялся, нужно после обработки данных (в главном цикле либо тут же в CDC_Receive_FS) вызвать USBD_CDC_ReceivePacket(hUsbDevice_0) очень интересно! с передачей более менее понятно, а вот с приемом данных не совсем. где у Вас вызывается CDC_Receive_FS? у меня в проекте, например, эта функция вызывается один раз - при инициализации, в функии MX_USB_DEVICE_Init. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
den_po 0 31 июля, 2014 Опубликовано 31 июля, 2014 · Жалоба Её не нужно самостоятельно вызывать, это колбэк, он вызывается при поступлении данных. А вот сообщать, что мы готовы принимать очередной пакет, нужно уже самому с помощью USBD_CDC_ReceivePacket. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 31 июля, 2014 Опубликовано 31 июля, 2014 · Жалоба У меня внутри бесконечного цикла работает такой код. User - это кнопка. По нажатию кнопки принимается последовательность символов, и выдается обратно. User_old = User; User = GPIOA->IDR & 0x0001; if (!User_old && User) { USBD_CDC_SetRxBuffer(&hUsbDeviceFS, Buf_Ch); USBD_CDC_ReceivePacket(&hUsbDeviceFS); USBD_CDC_SetTxBuffer(&hUsbDeviceFS, Buf_Ch, 8); USBD_CDC_TransmitPacket(&hUsbDeviceFS); do { User_old = User; User = GPIOA->IDR & 0x0001; } while (!User_old && !User); } Это - чисто экспериментальный проект, попытка разобраться с USB в STM32. Но как-то слишком накручено в этом Cube, уж не с целью ли запутать простое. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dima1060 0 31 июля, 2014 Опубликовано 31 июля, 2014 · Жалоба Её не нужно самостоятельно вызывать, это колбэк, он вызывается при поступлении данных. А вот сообщать, что мы готовы принимать очередной пакет, нужно уже самому с помощью USBD_CDC_ReceivePacket. так я и спрашиваю, где она у Вас вызывается? весь путь по которому CDC_Transmit_FS вызывается, он ведь должен вести в конце концов к OTG_HS_IRQHandler? там обрабатывается флаг прихода данных, вызывается куча функций и в конце концов CDC_Transmit_FS, так ведь должно быть? у меня CDC_Transmit_FS из OTG_FS_IRQHandler не вызывается. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
den_po 0 31 июля, 2014 Опубликовано 31 июля, 2014 · Жалоба так я и спрашиваю, где она у Вас вызывается? весь путь по которому 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) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dima1060 0 31 июля, 2014 Опубликовано 31 июля, 2014 · Жалоба Давайте для начала определимся, 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 куда надо)) Вызывается колбэк не напрямую, а через табличку указателей, которая регистрируется в функции MX_USB_DEVICE_Init (usb_device.c) что за табличка кстати? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
den_po 0 31 июля, 2014 Опубликовано 31 июля, 2014 · Жалоба извините перепутал, CDC_Receive_FS конечно. у меня проект для STM32F429ZI (точнее для платы Discovery с ним), так вот там CDC_Receive_FS вызывается только при инициализации, а в прерывании - нет. теперь, зная Вашу цепочку, я наверное смогу прописать вызов CDC_Receive_FS куда надо)) А может, при инициализации срабатывает прерывание? Данные в МК чем посылаются? Я писал уже, после вызова CDC_Receive_FS нужно вызывать USBD_CDC_ReceivePacket, иначе следующий пакет не примется. Точно дело не в этом? что за табличка кстати? USBD_CDC_ItfTypeDef USBD_Interface_fops_FS = { CDC_Init_FS, CDC_DeInit_FS, CDC_Control_FS, CDC_Receive_FS }; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Dima1060 0 31 июля, 2014 Опубликовано 31 июля, 2014 (изменено) · Жалоба А может, при инициализации срабатывает прерывание? Данные в МК чем посылаются? хм, может, ну и что. данные посылаю из фирменной тестовой программы Я писал уже, после вызова 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 нигде больше нет USBD_CDC_ItfTypeDef USBD_Interface_fops_FS = { CDC_Init_FS, CDC_DeInit_FS, CDC_Control_FS, CDC_Receive_FS }; такая табличка у меня есть Изменено 31 июля, 2014 пользователем Atlantis- Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться