Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32 USBTMC host?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
khach
Добрый день!
Возникла необходимость организовать общение STM32F4 с измерительным прибором по USB. Прибор при работе с копьютером использует NI VISA, т.е скорее всего соответсвует классу USBTMC (test and measurement). В связи с этим разыскиваются исходники ХОСТА для STM32F4 для класса USBTMC. Или выслушаю советы по допилке существующих хостов под данный класс.
Real_Bastard
Цитата(khach @ Nov 24 2013, 14:46) *
Прибор при работе с копьютером использует NI VISA, т.е скорее всего соответсвует классу USBTMC (test and measurement).

"При решении задачи всегда полезно знать ответ." Я бы начал с установки USB сниффера на PC и разбора протокола. Так Вы узнаете как это должно работать. А дальше можно и СТМный стек пилить. Он конечно ужасный, но разобраться можно.
Еще я бы создал на том же СТМ эмулятор устройства, благо USB девайс сильно проще, и получил бы отладочные сообщения с двух сторон.
khach
Цитата(Real_Bastard @ Dec 11 2013, 15:39) *
"При решении задачи всегда полезно знать ответ." Я бы начал с установки USB сниффера на PC и разбора протокола. Так Вы узнаете как это должно работать. А дальше можно и СТМный стек пилить. Он конечно ужасный, но разобраться можно.

А что там разбираться? Обычный USBTMC- команды SCPI бегут туда, ответ-обратно. Длинные транзакции, асинхронные евенты и пулы неиспользуются, поэтому насколько полно реализован USBTMC в соответствии со стандартом- неизвестно, да и ненужно. Немного криво реализован поиск устройства- ищется что то типа МАК адреса, а потом юзверя спрашивают, хотите ли вы с этим устройством работать, но я попросту раскидываю *IDN на все найденные устройства и с нужным работаю.
Проблема в том, что никогда хост не писал, и как его переделывать- пока имею смутное предположение.
Для референции https://github.com/imrehg/usbtmc лежит стандарт и ажилентовский драйвер-хост для ллинуха.
Real_Bastard
Цитата(khach @ Dec 11 2013, 20:05) *
Проблема в том, что никогда хост не писал, и как его переделывать- пока имею смутное предположение.

Берется демо библиотека Хоста от СТМ. В ее инициализации есть указатель на пользовательский класс _Device_cb.
Необходимо реализовать 4 функции
Цитата
● Init: this function is called at the startup of a class operation for assuring all required
initializations. This includes:
– Parsing interface and endpoint descriptors (please note that the current USB host
library supports only one interface).
– Opening and allocating host channels for non-control endpoints,
– Calling a user callback, in case the device is not supported by the class.
● Denit: this function is called for freeing allocated host channels when re-initializing the
host. It is called when a device is unplugged or in case of unrecovered error.
● Requests: this function implements the class request state machine. It is called during
the HOST_CLASS_REQUEST state. It is used to process initial class requests.
● Machine: implements the class core state machine. It is called during the
HOST_CLASS core state.

В примерах есть реализация этих функций для ХИДа и массСторейджа.

Ну и так же в инициализацию пихается указатель на класс USR_Callbacks, который плюется мессагами типа
Цитата
> USB host Library started.
> Device attached
> High speed detected.
VID:0483h
PID: 3251h

Но с библиотеками от СТМ есть такая проблема, что в них периодически встречаются (или подразумеваются) комментарии в стиле "эта функция могла бы вернуть ошибку, но мы это не реализовали...". Иногда спасает версия посвежее. Как-то две недели пытался понять почему один ЮСБ джойстик работает идеально, а второй подвисает. Оказалось что PIDы DATA0 и DATA1, которые как бы должны чередоваться, этого делать не хотят...
mantech
Цитата(Real_Bastard @ Dec 12 2013, 00:53) *
Берется демо библиотека Хоста от СТМ.


Выскажу свое скромное мнение - все-таки библиотеки и сам хост от СТМ не распологают к таким экспериментам. Может все-таки выбрать микроконтроллер со стандартным контроллером USB типа UHCI-совместимого? Или потренироваться на MS-DOS-совместимых моникомпах, где как раз такие контроллеры...
khach
Цитата(Real_Bastard @ Dec 11 2013, 22:53) *
Необходимо реализовать 4 функции

Спасибо за подробное оъяснение, буду копать в этом направлении.
Вопрос- у меня на демоплате кроеме хоста USB есть эзернет, который более-менее работоспособный. Хотелось бы иметь возможность протоколировать все, что происходит с самописным USB хостом на копме, используя эзернет как отладочный интерфейс. Можете посоветовать протокол эзернета и приложени для компа для такой отладки? Или под какой существующий снифер-отладчик протоклов можно "замаскироваться" ?
Real_Bastard
Не очень понял задачу. Если хочется кидать отладочные сообщения не через UART, а через ETHERNET, то я бы вывел вывод printf в буфер. Буфер отсылал по UDP. А на компе UDP терминалку (Hercules SETUP utility и т.п.).
Вот примерно так (за основу STSW-STM32070 LwIP TCP/IP stack demonstration for STM32F4x7 microcontrollers (AN3966) )...
Код
while (1)
{
    /* Host Task handler */
    USBH_Process(&USB_OTG_Core_dev , &USB_Host);
   /* check if any packet received */
   if (ETH_CheckFrameReceived())
    {
        /* process received ethernet packet */
        LwIP_Pkt_Handle();
    }
   /* handle periodic timers for LwIP */
   LwIP_Periodic_Handle(LocalTime);
   //Проверяем есть ли отладочные сообщения
   textLen= get_new_text(textBuf);
   if (textLen>0) {
    /* allocate pbuf from pool*/
    p = pbuf_alloc(PBUF_TRANSPORT, textLen, PBUF_POOL);
    if (p != NULL ) {
        /* copy data to pbuf */
        pbuf_take(p, (char*) textBuf, textLen);
        /* send udp data */
        udp_send(upcb, p);
        /* free pbuf */
        pbuf_free(p);
    }
   }
}
Golikov A.
на АРМе поднимите ТСР (без ТСР стэка все равно с компом не общатся, даже UDP все равно делать надо, так лучше сразу готовый стэк взять)
потом берете консольную програмку netcat есть и для виндов и для юниксов
она умеет конектиться на ТСР, все что на сокет ТСР внутри проца упало, в ней на экран выводиться,
все что в нее записали на ТСР сокет приходиит.

пихаете текст в езернет и трава не расти....
khach
Цитата(Real_Bastard @ Dec 12 2013, 13:13) *
Не очень понял задачу. Если хочется кидать отладочные сообщения не через UART, а через ETHERNET, то я бы вывел вывод printf в буфер. Буфер отсылал по UDP. А на компе UDP терминалку (Hercules SETUP utility и т.п.).

Такой вариант уже реализован. Но это не совсем то, что надо. Дело в том, что устройство, подключенное к USB хост время от времени падает. Хотелось бы поймать этот момент и подробнее разобраться, какова предистория падения. Т.е или нужен аппаратный USB снифер, или сэмулировать снифер программно, при этом хотелось бы оболочку для анализа результатов работы снифера использовать готовую. Типа vusb-analyzer , https://github.com/desowin/usbpcap или OpenVizsla подобную опенсоурсную.
Real_Bastard
"Curiouser and curiouser!..."
Значит хост у Вас уже есть. В чем тогда задача?
Golikov A.
да что-то я тоже потерял уже нить чего хочет авторsm.gif
khach
Цитата(Real_Bastard @ Dec 12 2013, 14:57) *
"Curiouser and curiouser!..."
Значит хост у Вас уже есть. В чем тогда задача?

Рабочего хоста нет, есть прототип. Который иногда падает непонятно почему. При работе девайса не на самописном хосте, а на компьютере с включенным usbtrace (нужна версия 2.7 или более новая тогда TMC класс декодируется) устройство тоже иногда зависает, поэтому непонятно, виноват ли самописный хост или фирмварь устройства.
Цитата
да что-то я тоже потерял уже нить чего хочет автор

Автор хочет, чтобы устройство измерителя мощности лазерного излучения Thorlabs PS100 USB работало с автономным контролером и не вешалось по неизвестным причинам.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.