Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Виртуальный COM через USB для МК STR912FAW44
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
kray
Здравствуйте,

на плате для определенного изделия на базе старого микроконтроллера STR912FAW44 появилась необходимость прикрутить
виртуальный COM порт для usb.

Первым делом я решил посмотреть есть ли примеры создания виртуального COM порта, нашел пример на сайте ST.

Т.к. я пользуюсь keil3 для компиляции программы то выбрал готовый проект

"\um0290\str91x demos\Virtual Com Port\project\RVMDK".


Для ПК я установил драйвера предназначавшиеся для stm32, взял отсюдого.

Прошив данный пример в плату с МК STR912FAW44, и соединившись с хостом ПК (windows 7 64bit) никакой реакции, в диспетчере устройств ПК вообще
ничего не происходит при соединении по usb ПК и МК. Пробовал подключиться к старому ноутбуку (windows XP) там такая же ситуации ПК вообще не видит
МК, никакого com порта не появляется.

Далее я скачал документ UM0290 отсюдого чтобы прочитать более подробно о примере предоставленном ST.
На с.54 написана краткаz инструкция запуска примера:
1)Load the application and run it on the evaluation board
2) Plug the USB cable into the PC
3) Indicate to the PC the location of the stmcdc.inf file (already provided in the Kit)

С первыми 2 пунктами все понятно. А вот в 3ем пункте ни совсем понятно, откуда взять файл stmcdc.inf ?
У меня ведь нет evolution board. Возможно из-за этого ПК и не распознает мой МК с прошитым примером для виртуального com порта.



Подскажите пожалуйста, что можно сделать в данной ситуации, чтобы хост (ПК) распознал МК в качестве виртуального com порта ?
Или где можно взять stmcdc.inf ? И Каким образом нужно сделать: "Indicate to the PC the location of the stmcdc.inf file" ?

Заранее спасибо всем за помощь.
Genadi Zawidowski
Если у Вас в менеджере устройств не появилось неопознанного устройства - то третий пункт еще рано выполнять. Ошибка где0то в двух предыдущих.

Поищите у ST файл en.stsw-stm32102.zip - как драйвер может помочь.
kray
Цитата(Genadi Zawidowski @ Jan 1 2017, 17:41) *
Если у Вас в менеджере устройств не появилось неопознанного устройства - то третий пункт еще рано выполнять. Ошибка где0то в двух предыдущих.


Спасибо за ответ, Genadi Zawidowski, т.е. если прошивка работает, то в диспетчере устройств должно появиться устройство даже без драйвера на ПК (хосте) ?


Цитата(Genadi Zawidowski @ Jan 1 2017, 17:41) *
Поищите у ST файл en.stsw-stm32102.zip - как драйвер может помочь.


Genadi Zawidowski, для STR9 уже есть свой пример проекта для usb драйвера. Но он почему-то не работает вообще, ПК его не распознает после прошивки.
Вопрос нужно ли этот пример как то допиливать под свою плату ? Потому как плата не стандартная, а под конкретное изделие.
Или же что-то с примером ни так ?
Genadi Zawidowski
Цитата(kray @ Jan 1 2017, 17:51) *
Спасибо за ответ, Genadi Zawidowski, т.е. если прошивка работает, то в диспетчере устройств должно появиться устройство даже без драйвера на ПК (хосте) ?

Да. С разными надписями в зависимости от степени работоспособности.
Например, если прошивка только подключит резистор с +3.3 к сигналу USB D+, то появится неопознанное устройство в разделе Universal Serial Bus Controllers.
А если устройство отдает дескрипторы как компорт с отсутствующими INF файлами - уже в соответствующем разделе. Кстати, под Windows10 никаких INF не требуется - взлетает само.

ps: Про STRxxx ничего не знаю.
AlexandrY
Цитата(Genadi Zawidowski @ Jan 1 2017, 18:12) *
Кстати, под Windows10 никаких INF не требуется - взлетает само.


Сами придумали?
Как операционке узнать какой драйвер применить без INF файла?
Посмотрел на MSDN. Там никто INF файлов под Win 10 не отменял.

На STR912 я делал драйвер виртуального порта, отлично работал.
Вот для такой платы :

Но он был сделан на базе довольно дорогой RTOS.
Но могу INF файл показать.
Dr.Alex
Цитата(AlexandrY @ Jan 1 2017, 21:19) *
Как операционке узнать какой драйвер применить без INF файла?

Например дривер WinUSB начиная с 8-ки может подхватываться сам
(устройство должно иметь соответствующий дескриптор).
Так что возможно и некоторые другие дрова так же умеют.
kray
Цитата(Genadi Zawidowski @ Jan 1 2017, 19:12) *
Да. С разными надписями в зависимости от степени работоспособности.
Например, если прошивка только подключит резистор с +3.3 к сигналу USB D+, то появится неопознанное устройство в разделе Universal Serial Bus Controllers.
А если устройство отдает дескрипторы как компорт с отсутствующими INF файлами - уже в соответствующем разделе. Кстати, под Windows10 никаких INF не требуется - взлетает само.

ps: Про STRxxx ничего не знаю.


Спасибо за подсказку, Genadi Zawidowski. Т.е. в моем случае получается что нужно смотреть непосредственно на инициализацию
usb ? Судя по тому что при подключении по usb моей платы к ПК ничего не происходит в диспетчере устройств, получается
что на usb со стороны платы (т.е. usb контроллера на МК STR912FAW44) вообще не включается, вроде как на него не подается тактирование или что-то в этом роде ?

Цитата(AlexandrY @ Jan 1 2017, 21:19) *
Сами придумали?
Как операционке узнать какой драйвер применить без INF файла?
Посмотрел на MSDN. Там никто INF файлов под Win 10 не отменял.

На STR912 я делал драйвер виртуального порта, отлично работал.
Вот для такой платы :

Но он был сделан на базе довольно дорогой RTOS.
Но могу INF файл показать.


Спасибо за ответ, AlexandrY. Да у меня плата примерно такая же, т.е. она не является стандартной платой от ST типа Discovery а сделано под определенно изделие,
т.е. ни общего назначения.

Не могли бы вы подсказать как вы начинали программировать usb для str9, с чего начинали копать ?
Мне интересна ваша методология.
Также было бы хорошо если бы вы мне скинули откуда вы брали материалы чтобы начать программировать usb контроллер.
Заранее спасибо большое.
controller_m30
В инете есть отладочная плата от Olimex для STR912FW44, и к ней схема.
Там к шине USB, к линии D+ подключен подтягивающий резистор 1.5к (резистор подключается к +3.3в! Это важно!).
Судя по этой схеме, для работы с USB, контроллер использует внешний подтягивающий резистор. Значит и вам, в вашей схеме, нужно подключить такой же резистор. И два резистора по 22 Ом поставьте, как на схеме, не помешают.

После установки резистора, Windows начнёт реагировать на подключение. А дальше видно будет.
AlexandrY
Цитата(kray @ Jan 1 2017, 22:16) *
Не могли бы вы подсказать как вы начинали программировать usb для str9, с чего начинали копать ?
Мне интересна ваша методология.


Я брал те же примеры виртуального COM порта от ST что и вы.
И адаптировал их под RTOS, чтобы прерывания могли использовать конвейеры и события.

Вот функция инициализации если это поможет.
Резистор 1.5 к не все время подключен к D+ , а только после инициализации USB контроллера.
Все как рекомендует ST.

Код
void VCom_Port_init(void)
{
  USBBTABLE_TypeDef *usbtbl = USBTBL;

  usb_dev_info.control_state = 2;
  usb_dev_info.cur_conf = 0;

  SCU->PCGRO    = SCU->PCGRO &  ~BIT(9); // Выключить тактирование USB
  SCU->PCGRO = SCU->PCGRO | BIT(9);      // Включить тактирование USB
  USB->USB_CNTR = BIT(1) + BIT(0);       // Enter Power down mode + 1: Force a reset of the USB Peripheral
  NU_Sleep(1);
  USB->USB_CNTR = BIT(0);
  USB->USB_CNTR = 0;
  USB->USB_ISTR = 0;                     // Очистить все флаги прерываний      
  NU_Sleep(1);

  USB->USB_DADDR  = 0x80;
  USB->USB_BTABLE = 0;
  usbtbl->ADDR0  = (ENDP0_RXADDR<<16) + ENDP0_TXADDR;
  usbtbl->CONT0  = LSHIFT((0x20 + (Device_Property.max_packet_size >> 5)),10 + 16);


  USB->USB_EP0R = BIT(13)  //
                  + BIT(12)  // 11 - VALID: this Endpoint is enabled for reception.
                  //+ BIT(10)
                  + BIT(9);  // 01 - Endpoint CONTROL type


  usb_interrupt_mask = IMR_MSK;
  USB->USB_CNTR      = IMR_MSK;          // set interrupts mask
  usb_dev_info.current_feature = Virtual_Com_Port_ConfigDescriptor[7];

  Set_IRQ_interrupt(INT_USBLP, PRIO_USBLP, (void*)USBLP_IRQHandler);
  Set_IRQ_interrupt(INT_USBHP, PRIO_USBHP, (void*)USBHP_IRQHandler);


  Set_usb_ctl_pin();

  while ( usb_dev_info.cur_conf == 0 ) NU_Sleep(10);  // Wait until device is configured
  usb_dev_state = CONFIGURED;
}

kray
Цитата(controller_m30 @ Jan 2 2017, 00:24) *
В инете есть отладочная плата от Olimex для STR912FW44, и к ней схема.
Там к шине USB, к линии D+ подключен подтягивающий резистор 1.5к (резистор подключается к +3.3в! Это важно!).
Судя по этой схеме, для работы с USB, контроллер использует внешний подтягивающий резистор. Значит и вам, в вашей схеме, нужно подключить такой же резистор. И два резистора по 22 Ом поставьте, как на схеме, не помешают.

После установки резистора, Windows начнёт реагировать на подключение. А дальше видно будет.


Спасибо большое, controller_m30. Не хотел я загромождать свой пост лишней информации (как мне показалось), но думаю стоит упомянуть.
До этого на моей плате уже стоял драйвер для виртуального com порта, но программировался он очень давно для usb 1.1. И на современных
ПК под windows 7, windows 8 при соединении платы с ПК com порт определяется, но не хочет запускаться, ошибка 10 ("Не удается запустить устройство").
Копаться в чужом коде, где никакой документации кроме скудных комментариев нет мне показалось достаточно сложным.
Поэтому я решил попробовать запустить готовый пример под STR9, который предоставляется непосредственно STMicroelectronics и отталкиваться уже от него.

К чему я это виду, со схемой скорее всего все норм, в том плане, что если правильно все инициализировать то usb порт появляется в ПК (как я упоминал выше
предыдущий драйвер для виртуального com порта ПК-ом распознается, просто работает неправильно),
хоть и не совсем корректно. Т.е. видимо нужно провести правильную инициализацию, а в готовом примере этого не делается.
Genadi Zawidowski
Цитата
Сами придумали?

В контексте данного обсуждения надеюсь понятно, что речь идет о появлении в системе виртуальных компортов для подключенных устройств, что прикидываются USB COMMUNICATION DEVICE CLASS.

Я сам удивился, но тем не менее... что за драйвер однозначно понятно - usbser.sys.
Это не отменяет возможность использования INF для получения устройства с какими-то свойствами отличающимися от умалчиваемых (например, название, место в дереве устройств, где оно отображается).
Причем, мое устройство ничем не прикидывается - VendorID = 0xFFFF

Цитата
Посмотрел на MSDN. Там никто INF файлов под Win 10 не отменял.

Гляньте в эту статью MSDN - https://msdn.microsoft.com/en-us/library/wi...6(v=vs.85).aspx

Цитата
If you want to load Usbser.sys automatically, set the class code to 02 and subclass code to 02 in the Device Descriptor. For more information, see USB communications device class (or USB CDC) Specification found on the USB DWG website. With this approach, you are not required to distribute INF files for your device because the system uses Usbser.inf.
kray
Цитата(AlexandrY @ Jan 2 2017, 01:18) *
Я брал те же примеры виртуального COM порта от ST что и вы.
И адаптировал их под RTOS, чтобы прерывания могли использовать конвейеры и события.



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



Цитата(AlexandrY @ Jan 2 2017, 01:18) *
Резистор 1.5 к не все время подключен к D+ , а только после инициализации USB контроллера.
Все как рекомендует ST.


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

AlexandrY
Цитата(kray @ Jan 2 2017, 00:54) *
Спасибо большое за пример, AlexandrY, буду его изучать.
Подскажите пожалуйста где можно найти информацию об упомянутых вами "конвеерах и событиях" ?


Про то как пользоваться RTOS здесь хорошо написано.

Цитата(kray @ Jan 2 2017, 00:54) *
Если вам не трудно не могли бы вы указать где про это написано в референс мануал я не смог найти, возможно не внимательно смотрел кончено.


Я увидел это не в мануале, а в их исходниках.
AlexandrY
Цитата(Genadi Zawidowski @ Jan 2 2017, 00:47) *
Гляньте в эту статью MSDN - https://msdn.microsoft.com/en-us/library/wi...6(v=vs.85).aspx


Ну так вы неверно выразили мысль.

Надо было сказать, что Win 10 имеет теперь собственный встроенный usbser.INF файл.
И он лезет по умолчанию если вы зазевались и не инсталлировали свой INF файл.

А usbser.INF присвивает безличные описания портам. Что доставляет неудобства.
kray
AlexandrY, спасибо большое за ссылки буду изучать.

Еще один вопрос, вы свой проект на основе STR9 не пробовали подключать к современным ПК с win7, win8 и более с usb 2.0 и 3.0 ?
Он у вас нормально работает с нынешними ПК ?

Спрашиваю потому что до этого у меня уже на плате стоял usb драйвер для STR912FAW44 и со старыми ПК он работает отлично, а
вот с новыми не хочет работать (выше в одном из комментариев я уже описывал эту проблему). Это и сподвигло начать ковыряться в
usb модуле для этого МК.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.