Jump to content

    
Eddy_Em

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

Recommended Posts

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(...) - это фейк. 

Share this post


Link to post
Share on other sites
52 minutes ago, Eddy_Em said:

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

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

Share this post


Link to post
Share on other sites
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-режим мне никогда не понадобится, из-за чего его особенности я не изучала, оставив без внимания.

Share this post


Link to post
Share on other sites
4 часа назад, Xenia сказал:

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

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

Share this post


Link to post
Share on other sites
47 минут назад, AleksBak сказал:

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

 

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

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

Share this post


Link to post
Share on other sites
1 час назад, Xenia сказал:

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

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

Share this post


Link to post
Share on other sites
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

 

 

 

Share this post


Link to post
Share on other sites

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

Edited by GenaSPB

Share this post


Link to post
Share on other sites

Да, действительно у внутреннего 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 поддержкой. "В споре рождается истина".

Share this post


Link to post
Share on other sites
1 час назад, AleksBak сказал:

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

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

Share this post


Link to post
Share on other sites
49 минут назад, Сергей Борщ сказал:

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

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

Share this post


Link to post
Share on other sites
3 hours ago, Сергей Борщ said:

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

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

Share this post


Link to post
Share on other sites
19 hours ago, mov said:

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

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

 

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.