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

Как все-таки правильно делать CDC на STM32?

On 2/11/2020 at 9:16 PM, Xenia said:

 

Коль уж разговор об этом в теме зашел, то помогите тогда и мне :). Будучи закоренелой AVR-овщицей, с мая прошлого года стала осваивать STM32, потеряв надежду на то, что Microchip продолжит дело Atmel'а в области AVR-контроллеров с повышенной производительностью (Тиньки и малоногие Меги нового образца не в счет - они погоды не делают). Ну, а поскольку по здешним понятиям я - гуру :), то освоение даётся мне легко, за исключением ... USB CDC девайса. Не хочет он у меня работать. Причем, я хочу от него совсем малого - пусть в девайс-менеджере хотя бы желтый треугольничек покажет после подключения к компьютеру - но и этого нет, не чувствует компьютер мой девайс. Гуглить гуглила и советам этим следовала, но всё без толку.  Проекты с GitHub так и вовсе не компилятся - чего-то из среды не хватает. Как назло примеров для моего STM32F407 в CubeMX нет, хотя для USB HID девайса они есть. Примеры для других STM32F4 сплошь на HS (high spеed), а для FS (full speed) их нет, а в переделанном виде они у меня не работают.

 

С железом у меня всё в порядке, т.к. в случае USB HID девайса (FS) USB-порт работает нормально.

 

Может кто поделится примером проектика, чтобы USB CDC девайс определялся? Мне неважно, что передает он и что принимает, лишь бы компьютер его узнавал, как Virtual COM port.

Возможно, уже неактуально.
Пофиксил те же траблы. Кубовские драйвера доставляют неимоверно. Удивляет, что на форумах я не нашел описания данного жестокого бага от STM.
STM32F407, USB FS CDC device, Firmvire Packsges STM32Cube FW_F4 V1.25.0.
RTOS

Танцы с бубном:

1-е па) 

Для CDC нужно установить 
#define APP_RX_DATA_SIZE  64
#define APP_TX_DATA_SIZE  64

Куб был пойман на том, что может установить другое значение.

2-е па) Собственно, сам баг. Молодцы STMы залепили в функцию USBD_CDC_Init(...), которая вызывается в прерывании от USB, вызов USBD_malloc(...) со всеми вытекающими.
Т.е., надо - объявить статическую структутру USBD_CDC_HandleTypeDef  myClassCDC;
- закомментить /* hcdc = USBD_malloc(sizeof(USBD_CDC_HandleTypeDef)); */

и проинициализировать   hcdc = &myClassCDC;

- В функции  USBD_CDC_DeInit(...) закомментировать уже ненужный вызов USBD_free()

 

После этого CDC начинает работать, как настоящий.

З.Ы. Огромное количество бесплатных советов, что надо перед началом главного цикла вызвать USBD_CDC_Init(...) - это фейк. 

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


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

Мыши плакали, кололись, но продолжали пользоваться калокубом…

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


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

52 minutes ago, Eddy_Em said:

Мыши плакали, кололись, но продолжали пользоваться калокубом…

Чем ещё можно пользоваться вместо калокуба для STM32 по Вашему мнению ?

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


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

1 час назад, a_electronic сказал:

Возможно, уже неактуально.

 

Действительно, я уже разобралась с ситуацией. Ближе всего к истине оказался пост GenaSPB :

в котором он обратил мое внимание на то, что порт OTG_HS может работать в FS-режиме. Тогда как производители плат (преимущественно китайские, которые я люблю за их дешевизну :)) разводят на USB-разъем обычно порт OTG_FS. С ними я прежде ни раз работала и решила, что так оно и должно быть. Непредвиденная ситуация возникла у меня, когда столкнулась с платой STM32F429I-DISCO  (на этот раз уже не китайской), где на USB-разъем был выведен на порт OTG_HS.  Это явилось для меня неожиданностью, т.к. я точно знала, что эта плата работает в режиме FS, а для режима HS ей нужна внешняя поддержка.

 

Ситуация усугубилась тем, что в CubeMX аббревиатуры FS и HS обозначали не скорость, а имена портов. Потому я настойчиво заказывала FS-конфигурацию, тогда как наружу был выведен порт OTG_HS. Оттого-то CDC на плате STM32F429I-DISCO у меня не работал, хотя отлично работал на китайских платах. Кроме того, негативную роль сыграло и мое знакомство с пресловутым STM32F103 :), у которого порта OTG_HS нет совсем. Отсюда сложилось впечатление, что HS-режим мне никогда не понадобится, из-за чего его особенности я не изучала, оставив без внимания.

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


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

4 часа назад, Xenia сказал:

Непредвиденная ситуация возникла у меня, когда столкнулась с платой STM32F429I-DISCO  (на этот раз уже не китайской), где на USB-разъем был выведен на порт OTG_HS.  Это явилось для меня неожиданностью, т.к. я точно знала, что эта плата работает в режиме FS, а для режима HS ей нужна внешняя поддержка.

Это как это? OTG HS работает через внешнюю м/с драйвера (это ULPI драйвер например USB3300 и т.п.).

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


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

47 минут назад, AleksBak сказал:

Это как это? OTG HS работает через внешнюю м/с драйвера (это ULPI драйвер например USB3300 и т.п.).

 

В том-то и дело, что порт OTG_HS способен работать еще и в режиме FS, и тогда во внешнем драйвере он не нуждается.

Вот и на плате STM32F429I-DISCO порт OTG_HS был припаян к разъему, но в демо-программе был запрограммирован на режим FS. Но я-то о том сперва не знала, а потому и не додумалась сначала, что надо OTG_HS выбирать, хотя мне FS-режим был нужен.

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


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

1 час назад, Xenia сказал:

В том-то и дело, что порт OTG_HS способен работать еще и в режиме FS, и тогда во внешнем драйвере он не нуждается.

Что-то не верится. По-моему все-таки неверно это. Тяжелая информация и тем более на ночь сейчас. Возможно это и так. Возможно это в самом Cube так, а не в контроллере. На HS скорости контроллер физически не сможет принимать данные и какой тогда смысл в такой "подмене"? На HS режиме работы имеются DMA, а на FS их нету. Я посмотрю/поизучаю/проверю и если не прав, то приношу извинения. 

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


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

18 минут назад, AleksBak сказал:

Что-то не верится. По-моему все-таки неверно это. Тяжелая информация и тем более на ночь сейчас. Возможно это и так. Возможно это в самом Cube так, а не в контроллере. На HS скорости контроллер физически не сможет принимать данные и какой тогда смысл в такой "подмене"? На HS режиме работы имеются DMA, а на FS их нету. Я посмотрю/поизучаю/проверю и если не прав, то приношу извинения. 

 

Вопрос, чтобы работать в режиме HS, вообще не ставился! Вполне очевидно, что STM32F429 в одиночку с ним не справится. Странная ситуация сложилась только оттого, что режим FS был реализован через порт OTG_HS, а не через OTG_FS, как следовало бы ожидать. Причем, ножки контроллера, относящиеся к OTG_HS и OTG_FS разные! Тогда как DMA может быть использован в обоих режимах. На картинке диалог из CubeMX, где OTG_HS заставляют работать в FS-режиме.

OTG_HS_in_FS_mode.png

 

 

 

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


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

DMA в 429 (собственный контроллер) есть только в USB_OTG_HS - вне зависимости от того, HS или FS режим.

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

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


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

Да, действительно у внутреннего OTG_HS есть и "свои" отдельные пины DP/DM:

Table 260. OTG_HS input/output pins
Signal name		Signal type             Description
OTG_HS_DP 		Digital input/output    USB OTG D+ line
OTG_HS_DM		Digital input/output    USB OTG D- line
OTG_HS_ID		Digital input           USB OTG ID
OTG_HS_VBUS		Analog input            USB OTG VBUS
  ...

Не знал (не обращал внимания на это). Видимо один из смыслов в них - чтобы использовать внутренний full-speed USB PHY с DMA поддержкой. "В споре рождается истина".

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


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

1 час назад, AleksBak сказал:

Видимо один из смыслов в них - чтобы использовать внутренний full-speed USB PHY с DMA поддержкой.

А я полагал, что смысл в них - иметь второй USB без внешних микросхем если достаточно небольшой скорости. Я, например, в одном проекте реализовал на нем USB host для подключения GPS-приемника, а на USB-FS реализовал USB device для подключения к компу.

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


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

49 минут назад, Сергей Борщ сказал:

в одном проекте реализовал на нем USB host для подключения GPS-приемника, а на USB-FS реализовал USB device для подключения к компу.

Круто (реально). Контроллеры - крутая вещь все-таки.

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


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

3 hours ago, Сергей Борщ said:

А я полагал, что смысл в них - иметь второй USB без внешних микросхем если достаточно небольшой скорости. Я, например, в одном проекте реализовал на нем USB host для подключения GPS-приемника, а на USB-FS реализовал USB device для подключения к компу.

На github нет случайно его ?

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


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

19 hours ago, mov said:

Чем ещё можно пользоваться вместо калокуба для STM32 по Вашему мнению ?

Сниппетами, вестимо! УМВР. Вот немножко моего: под F103 и под F0xx.

 

 

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


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

2 hours ago, AleksBak said:

Круто (реально). Контроллеры - крутая вещь все-таки.

Микроконтроллеры.

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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