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

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Микроконтроллеры » STM32 » Вопросы » USB CDC для STM32F103


USB CDC для STM32F103

Сообщений 31 страница 60 из 94

31

Как вам это описание http://microsin.net/programming/arm-wor … part1.html

32

Читал уже.

33

Эдя, ты главное успокойся, выпей чаю с коньяком. А затем скрупулезно, шаг за шагом...

34

Я на работе неделю на эту херню убил! Надоело!!! Сяду в понедельник и на основе ST'шной библиотеке сделаю эмулятор PL2303. Если там все ОК, то, возможно, немножко подчищу их библиотеку, чтобы такого спагетти-кода не было. Ну или таки займусь уже наконец реанимацией прибора, который глядишь, через месяца полтора уже надо будет вешать на телескоп (там остается на основе шаговика и оптического энкодера сделать эдакий аналог сервопривода)!

35

Eddy_Em написал(а):

(там остается на основе шаговика и оптического энкодера сделать эдакий аналог сервопривода)!

задачи у нас очень близки. почему cdc pl2303?

36

Мне давно хотелось сделать нормальный CDC, который будет /dev/ttyUSBx, а не позорным /dev/ttyACMx. Все-таки, это не модем, а последовательный порт!
Кроме того, "абы было", хочу полную поддержку аппаратного контроля потоком на будущее иметь.

37

вот теперь понятно.
но для озвученных целей больше подходит hid по прерыванию, я использую вирткомпорт лишь по-тому, что есть программы со стороны компа - терминалка и не надо писать что-то свое. насколько понимаю, ваш уровень знаний и умений на порядок выше моего и для вас не составит труда сделать свою "теминалку" под хидинтеррапт. зачем вам вообще cdc...  это так мысли в слух.

38

HID не требует драйверов это плюс и там можно дескрипторы указать свои.
Сижу разбираюсь с верхним уровнем USB, передача и прием Control с подтверждением рукопожатия. Очень похоже как устанавливается соединение в TCP/IP .
Стало интересно добить USB,даже проект на время забросил :)

Начало соединения адрес устройства и конечной точки 0 , которая как понял работает на IN и OUT

http://s5.uploads.ru/t/ZXogR.png

потом передача дескриптора с устройства

http://sd.uploads.ru/t/vQt7u.png

И подтверждение компа об успешном принятии дескриптора

http://sh.uploads.ru/t/5qwnW.png

Самое страшное это куча дескрипторов,там в глазах рибит от них  :

Дескрипторы устройства
Дескрипторы конфигурации
Дескрипторы интерфейса
Дескрипторы конечной точки
Строковые дескрипторы

http://sd.uploads.ru/t/zXYGK.png

Предлагаю ковырнуть https://habr.com/post/208026/ , у меня даже проектик собран под 103c8t6 и Keil (проверю позже выложу,хотя он там раздутый нормально,но для изучения протокола само то) , а потом изучить код от vt и переписать под себя...

http://s9.uploads.ru/t/CTwge.png

Если пишу не по теме,то удалю сообщение...

39

CERGEI написал(а):

...
изучения протокола
...
изучить код

Ирония судьбы в том, что когда ты это изучишь, ни cdc, ни custom hid станут тебе уже не нужны
Весь кипеж вокруг них идёт от тех, кто не в теме
И я настоятельно советую, если хочется usb, но не хочется въезжать, просто ставить чип usb-serial, а не искать и не плодить всякую хрень в инете )

40

Логично :) но все таки можно попробывать, попытка не пытка :)

41

Поперло! Работает.

42

А поделиться?

43

vt написал(а):

...кто не в теме
И я настоятельно советую...

в чем именно заключается "тема"?
почему советуете? чтоб не отвлекаться на от основной задачи, второстепенную переложить на специализированный чип и не париться? 25 functions for 25 cents ?

44

Тем более у меня все платы с микро USB уже готовые. Почему бы этим не воспользоваться для обмена данными с пк.

45

Да, забыл ссылку на код выложить: https://github.com/eddyem/stm32samples/ … lib/usbcdc
Надо бы добавить еще в копирайты автора, у которого я стырил оригинальный код для HID (его, собственно, и переделывал). Уже не помню, откуда стырил, но откуда-то отсюда...

46

У alexsam поди...

47

RA написал(а):

почему советуете?

"Советую, если хочется usb, но не хочется въезжать" [в изучение usb, чтобы сделать свой cdc, то] "просто ставить чип usb-serial"

48

vt написал(а):

"Советую, если хочется usb, но не хочется въезжать" [в изучение usb, чтобы сделать свой cdc, то] "просто ставить чип usb-serial"

не я так не играю... как так? не хочется въезжать...
и взять у alexsam его пример все равно что чип поставить. смотря конечно для чего и кому.

Код:
void uUSBLIB_DataReceivedHandler(uint16_t *Data, uint16_t Length)
{
	uint16_t bf, i=0;	
	while( Length > 0){//читаем что пришло в буфере приема.
    bf = *Data;//забираем 16бит слово
    RxBuff[i++] = (char)*Data++;//забираем младший символ и переводим указатель на следующее 16 битслово
    Length--;//вычитаем из кол-ва символов забраный первый
    if(Length>0){//если символы не закончились
    	RxBuff[i++] = (char)(bf >> 8);//забираем старший символ
    	Length--;//вычитаем из кол-ва символов забраный второй
    }
    if( Length == 0 ) RxBuff[i++] = '\0';	// если символы закончились указываем конец строки    
	}
	++flag;
}
Код:
void comand( void ){
	char *str1 = strtok(RxBuff,"/=%");
	char *str2 = strtok(NULL,"/=%");
	char *str3 = strtok(NULL,"/=%");
	int dec;
	if( str3 == 0 ){dec=0; if (_LineState.L)USBLIB_Transmit((uint16_t *)"not value\r\n", 9+2 );delay_ms(1);}
	else{
    sscanf(str3, "%d", &dec);
    if (_LineState.L)USBLIB_Transmit((uint16_t *)"ok value\r\n", 8+2 );delay_ms(1);
	} 
	if( ( strcmp( "xxx", str1 ) == 0 ) ){
    if (_LineState.L)USBLIB_Transmit((uint16_t *)"ready\r\n", 7 );delay_ms(1);
    if( ( strcmp( "left", str2 ) == 0 ) ){
    	if (_LineState.L)USBLIB_Transmit((uint16_t *)"left\r\n", 4+2 );delay_ms(1);
        
    	if (_LineState.L)USBLIB_Transmit((uint16_t *)"done\r\n", 4+2 );delay_ms(1);
    }
    else if( ( strcmp( "right", str2 ) == 0 ) ){
    	if (_LineState.L)USBLIB_Transmit((uint16_t *)"right\r\n", 5+2 );delay_ms(1);
    	if (_LineState.L)USBLIB_Transmit((uint16_t *)"done\r\n", 4+2 );delay_ms(1);
    }
    else if( ( strcmp( "off", str2 ) == 0 ) ){
    	if (_LineState.L)USBLIB_Transmit((uint16_t *)"off\r\n", 3+2 );delay_ms(1);
    	if (_LineState.L)USBLIB_Transmit((uint16_t *)"done\r\n", 4+2 );delay_ms(1);
    }
    else if( ( strcmp( "on", str2 ) == 0 ) ){
    	if (_LineState.L)USBLIB_Transmit((uint16_t *)"on\r\n", 2+2 );delay_ms(1);
    	if (_LineState.L)USBLIB_Transmit((uint16_t *)"done\r\n", 4+2 );delay_ms(1);
    }
    else if( ( strcmp( "goto", str2 ) == 0 ) ){
    	if (_LineState.L)USBLIB_Transmit((uint16_t *)"goto\r\n", 4+2 );delay_ms(1);
    	if (_LineState.L)USBLIB_Transmit((uint16_t *)"done\r\n", 4+2 );delay_ms(1);
    }
    else{
    	if (_LineState.L)USBLIB_Transmit((uint16_t *)"erroneous command\r\n", 19);delay_ms(1);
    }
	}
	else{
    if (_LineState.L)USBLIB_Transmit((uint16_t *)"error /?\r\n", 8+2 );//delay_ms(10);
	}
	for( int8_t l = wbuf; l>=0; l--){RxBuff[l] = '\0';}
	--flag;
}
Код:
#include "usblib.h"// от alexsam
#define wbuf    	20
char RxBuff[wbuf]={0};
int main(void)
{
	clk_init();
	usb_pinusb_ledusb_init();
	init_driver();
	init_tim3();
  while (1) {
    if(flag)
    	comand();
	}
}

49

vt написал(а):

"Советую, если хочется usb, но не хочется въезжать" [в изучение usb, чтобы сделать свой cdc, то] "просто ставить чип usb-serial"

ну мне кажется что все кто сидят на этом форуме обычно как раз и хотят разобраться в темах. :)

50

RA написал(а):

и взять у alexsam его пример все равно что чип поставить

Конечно нет
Ведь ты ж пока, как я понимаю, только демку alexsam запустил
Вот когда у тебя всё будет крутиться-вертеться, управляться, отображаться и т.п. и при этом бессбойно общаться с компом по usb, вот тогда можно будет о чём-то говорить
Ну а если вдруг не будет бессбойно, то во-первых не факт, что причина будет в коде alexsam
Во-вторых, он ведь никому ничего и не обещал
А в-третьих, навряд ли его код у тебя останется буква в букву нетронутым, и значит, это будет уже не совсем его код, и совсем не его проблемы )

51

vt написал(а):

Конечно нет
Ведь ты ж пока, как я понимаю, только демку alexsam запустил
Вот когда у тебя всё будет крутиться-вертеться, управляться, отображаться и т.п. и при этом бессбойно общаться с компом по usb, вот тогда можно будет о чём-то говорить
Ну а если вдруг не будет бессбойно, то во-первых не факт, что причина будет в коде alexsam
Во-вторых, он ведь никому ничего и не обещал


:rofl:  в любом случае это будут не его проблемы. а так уже все крутится вертится отображается управляется, правда одна ось(имеется ввиду не О.С. а ось того что вращается). есть еще косяк клава сдохла... уж не знаю в чем причина и насколько это возможно было сделать ошибкой передаваемых данных, а они были, многократно и что я там гнал в порт одному богу известно. может совпадение... может какой злющий  :crazy:  хакер... попутал чего... но клава сдохла... аминь.
на бессбойность еще не проверял.

52

Ладно, зря я опять полез в эту тему, не хотел никому ничего навязывать, само получилось, ухожу, ухожу )

53

vt написал(а):

Ладно, зря я опять полез в эту тему, не хотел никому ничего навязывать, само получилось, ухожу, ухожу )

да нет, не надо. то о чем вы говорите, до меня доходит обычно потом, попозже... ну или когда я на грабли наткнусь, на которые, вы уже давно наступали. посему я не воспринимаю ваши посты как навязывание. ваши доводы мне интересны и как я понимаю они не беспочвенны.
с cdc не разбирался, с hid да. но почему я не использую hid писал выше USB CDC для STM32F103 . прекрасно понимаю, что чужой код лучше не юзать бог его знает что-там... но тут то все открыто, а зная hid, можно и копануть cdc, но желания нет. потому что, когда сляпаю свою программулину(если осилю), со стороны компа, будет переезд на hid.

54

Всё это уже давно написал Мерфи, я только адаптирую под конкретные ситуации )

55

vt написал(а):

Всё это уже давно написал Мерфи, я только адаптирую под конкретные ситуации )

интересно. вот это понравилось - Каллаган дал комментарий к закону Мерфи "Мерфи был оптимистом."

56

RA написал(а):

когда сляпаю свою программулину(если осилю), со стороны компа, будет переезд на hid.

Для этого на все компы придется свою "программулину" тащить, а это не всегда может быть удобным. (особенно если к какому-нибудь недотелефону на ондроеде или гей-оси надо будет подключиться)
HID имеет смысл лишь если тебе нужно мышу или клаву эмулировать, во всех остальных случаях он нахрен не нужен! Либо CDC, либо эмуляция флешки (у меня когда-то была задумка сделать эмуляцию флешки с псевдофайловой системой вроде /dev/, /sys/ и им подобных; но готовой реализации ext2 я не встречал, свою же пилить - охренеть сколько времени нужно!).
Ну, а со "своей программулиной" тоже HID нафиг не спекся - удобней будет какой-нибудь custom class сделать и по своему протоколу данные гонять, а не ковыряться в этих восьмибайтных мини-пакетиках хида!

57

Интересно,а у вас через ком порт общается с операционнкой напрямую? Драйвер+программа своя и все это нужно установить.....  Да и то код не ваш,откуда взяли его?

58

Eddy_Em написал(а):

Для этого на все компы придется свою "программулину" тащить, а это не всегда может быть удобным. (особенно если к какому-нибудь недотелефону на ондроеде или гей-оси надо будет подключиться)
HID имеет смысл лишь если тебе нужно мышу или клаву эмулировать, во всех остальных случаях он нахрен не нужен! Либо CDC, либо эмуляция флешки (у меня когда-то была задумка сделать эмуляцию флешки с псевдофайловой системой вроде /dev/, /sys/ и им подобных; но готовой реализации ext2 я не встречал, свою же пилить - охренеть сколько времени нужно!).
Ну, а со "своей программулиной" тоже HID нафиг не спекся - удобней будет какой-нибудь custom class сделать и по своему протоколу данные гонять, а не ковыряться в этих восьмибайтных мини-пакетиках хида!

"...тащить..." ничего никуда не надо.
"....недотелефону на ондроеде или гей-оси..." все для одного компа под одну ось, мне универсальность нах не нужна, не коммерческий продукт.
"... custom class..." тоже нафиг не спекся.
если уж идтить в сторону для всех осей и сразу, то лучше прикрутить к этому делу флэху, а туда все установщики драйверов наложить(покласть :D ) .

59

CERGEI написал(а):

Драйвер+программа своя и все это нужно установить

Я уже несколько раз написал: никакой "программы своей" не нужно! Просто пишем в порт и читаем из него. И "драйвер" давно уже написан, его лишь при конфигурации ядра надо не забыть, чтобы этот модуль собрался.

Да и то код не ваш,откуда взяли его?

Взял чей-то код для HID и переделал его на CDC, вот и все!
Сейчас, учитывая то, что в мастдайке с PL2303 какая-то фигня происходит (похоже, на vendor-запросы надо отвечать что-то конкретное, а не тупо фигню), попробую сделать эмулятор ch340: там вроде все намного проще... Тогда, возможно, и на приставке это заработает (прошивку МК с эмулятором PL2303 я на приставке проверял - что-то не смог с портом состыковаться; а китайский "настоящий" 2303, который у меня вместо отладочного терминала, прошивка приставки вообще не восприняла!), это я на приставке с прошивкой №7 проверял, народ проверил с прошивкой №10 - тоже говорят, не получается полной инициализации...
Полез я в исходники модуля ядра для ch340.

60

RA, у меня уже давно была мысль, что самым удобным в некоторых случаях была бы псевдофайловая система. Т.е. МК должен эмулировать флешку. Только для этого мне нужно где-то достать рабочий код для поддержки ext2 или ext3, иначе самому копаться и все это делать — я так и за 10 лет не успею! Vfat сразу отметается как ущербный и как доступный "из коробки" в приставках, мне этого не нужно.


Вы здесь » Микроконтроллеры » STM32 » Вопросы » USB CDC для STM32F103