Перейти к содержанию
    

совсем недавно кто-то запускал тут ЛА и прочую фигню, ему там много советов давали)...

Я давал. :rolleyes:

Терзают смутные сомненья, что перегрузил я микроконтроллер работой. Программа в ОЗУ работает, быстрее, чем из флэш-памяти. Может, перекрыл какой-нибудь отладочный путь... Попробую из флэш.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вдруг взяло и заработало. :laughing: ЛА показывает. Ничего, вроде не делал, не считая того, что перепробовал все свои платы и проекты. :rolleyes:

Теперь пойду в USB. В нем тоже что-то ЛА показывает, но как-то пинка все ждет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Опять не работает ЛА. Чувствую, дело в температуре, влажности, и частоте. Вечером проверю.

 

Еще одним чудом поделюсь, по теме. Не могу выключить компьютер, пока подключена плата F3Discivery с запущенным проектом CDC.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

драйвер CDC - вещь суровая, у меня есть RS485 - виртуальный ком порт через USB, ну то есть CDC. Помехи вешают его так, что ноутбук треба выключать жестким сбросом через удержание кнопки питания, ничего не помогает, даже снять задачу и прочее, выключить тоже нельзя, стоит с черным экраном и жужит хоть всю ночь.... А еще плюсом идут БИОСы с пробуждением по USB, в винде много накрутить можно...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По поводу логического анализатора вырисовывается следующая картина. У меня Дискавери висит на USB проводе постоянно, и включается вместе с компьютером. Так вот, чтобы ЛА заработал, нужно переткнуть USB кабель в Дискавери (убрать питание на короткое время). После этого ЛА показывает сигналы. :laughing:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот функция из 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)

Изменено пользователем den_po

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если кому ещё интересно, то вот:

Внутри CDC_Transmit_FS нужно самостоятельно выполнить нужные действия. Например, скопировать или дописать содержимое Buf в UserTxBufferFS.

Внутри CDC_Receive_FS нужно обработать пришедшие по USB данные. Чтобы следующий пакет успешно принялся, нужно после обработки данных (в главном цикле либо тут же в CDC_Receive_FS) вызвать USBD_CDC_ReceivePacket(hUsbDevice_0)

очень интересно!

с передачей более менее понятно, а вот с приемом данных не совсем. где у Вас вызывается CDC_Receive_FS? у меня в проекте, например, эта функция вызывается один раз - при инициализации, в функии MX_USB_DEVICE_Init.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Её не нужно самостоятельно вызывать, это колбэк, он вызывается при поступлении данных. А вот сообщать, что мы готовы принимать очередной пакет, нужно уже самому с помощью USBD_CDC_ReceivePacket.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня внутри бесконечного цикла работает такой код. 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, уж не с целью ли запутать простое.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Её не нужно самостоятельно вызывать, это колбэк, он вызывается при поступлении данных. А вот сообщать, что мы готовы принимать очередной пакет, нужно уже самому с помощью USBD_CDC_ReceivePacket.

так я и спрашиваю, где она у Вас вызывается? весь путь по которому CDC_Transmit_FS вызывается, он ведь должен вести в конце концов к OTG_HS_IRQHandler? там обрабатывается флаг прихода данных, вызывается куча функций и в конце концов CDC_Transmit_FS, так ведь должно быть? у меня CDC_Transmit_FS из OTG_FS_IRQHandler не вызывается.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

так я и спрашиваю, где она у Вас вызывается? весь путь по которому 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)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Давайте для начала определимся, 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)

что за табличка кстати?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

извините перепутал, 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
};

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А может, при инициализации срабатывает прерывание? Данные в МК чем посылаются?

хм, может, ну и что. данные посылаю из фирменной тестовой программы

 

Я писал уже, после вызова 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
};

такая табличка у меня есть

Изменено пользователем Atlantis-

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...