Allregia 9 22 января, 2012 Опубликовано 22 января, 2012 · Жалоба Не работал раньше с USB, но вот теперь надо. Запустил на демодорде пример из Кейла * Name: vcomdemo.c * Purpose: USB virtual COM port Demo * Version: V1.20 Пример работает. Там USB как Витруальный СОМ-порт, соединяется с реальным UART'ом, и гонят друг в друга. Мне не нужен UART, нужен только виртуальный СОМ через USB, но вот разобраться в этом нагромождении буферов и колбеков пока не могу. (там какая-то тройная или четверная буферизация, причем не все линейно - не могу проследить цепочки). Непонятно - почему связка с UARTом идет в двух местах: в колбеках: void USB_EndPoint2 (uint32_t event) { switch (event) { case USB_EVT_OUT: CDC_BulkOut (); /* data received from Host */ break; case USB_EVT_IN: CDC_BulkIn (); /* data expected from Host */ break; } } в функциях CDC_BulkOut (); и CDC_BulkIn (); но кроме того еще и в основном цикле: while (1) { // Loop forever VCOM_Serial2Usb(); // read serial port and initiate USB event VCOM_CheckSerialState(); VCOM_Usb2Serial(); } // end while Пытался отключить все, связанное с реальным UARTом, и оставить только отправку пакета из 16 байтов с периодом в секунду: USB_WriteEP (CDC_DEP_IN, (unsigned char *)&MyBuf[0], 16); но при этом исчезает сам VCOM в компе. Уж не знаю в чем рыться. Может есть у кого другой пример USB_CDC, попроще? Типа нажал кнопку - отправил байт, пришел байт - зажег светодиод ? Я волшебное слово знаю - "пожалуста" :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nixon 4 23 января, 2012 Опубликовано 23 января, 2012 · Жалоба Я использовал библиотеку LPCUSB от Bertrik Sikken. Вся логика работы очень проста - usbSerialInit(); VCOM_putchar(); VCOM_getchar(); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EugenyAM 0 23 января, 2012 Опубликовано 23 января, 2012 (изменено) · Жалоба Здесь логика работы похожа на работу с UART по прерываниям, только прерывание нужно обрабатывать не на каждый байт, а на буфер конечной точки из 64 байт. Колбеки - это и есть обработчики прерываний, только "отсортированные" по событиям для удобства пользователя. CDC_BulkOut() - обработчик прерываний приема (Out - относительно хоста) CDC_BulkIn() - обработчик прерываний передачи Запуск передачи производится в функции VCOM_Serial2Usb() вызовом USB_WriteEP(...), после этого, если у нас передается меньше 65 байт, в колбеке CDC_BulkIn() надо остановить передачу установкой признака CDC_DepInEmpty = 1, иначе продолжить передачу. Прием полностью происходит через колбек CDC_BulkOut. Чтобы порт на машине появился, не забываем про инициализацию в начале. USB_Init(); // USB Initialization USB_Connect(TRUE); // USB Connect while (!USB_Configuration); // wait until USB is configured Изменено 23 января, 2012 пользователем EugenyAM Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Allregia 9 24 января, 2012 Опубликовано 24 января, 2012 · Жалоба Здесь логика работы похожа на работу с UART по прерываниям, только прерывание нужно обрабатывать не на каждый байт, а на буфер конечной точки из 64 байт. Там более-менее понятно ЧТО делается, но не совсем понятно КАК. И главное - как убрать оттуда обчный UART и пользоваться остальным самому. По идее мне бы сейчас хватило только putchar/getchar (ну даже одного putblockбы сейчас хватило, без прерываний, мне толко посылать пакет сейчас надо). Колбеки - это и есть обработчики прерываний, только "отсортированные" по событиям для удобства пользователя. CDC_BulkOut() - обработчик прерываний приема (Out - относительно хоста) CDC_BulkIn() - обработчик прерываний передачи Запуск передачи производится в функции VCOM_Serial2Usb() вызовом USB_WriteEP(...), после этого, если у нас передается меньше 65 байт, в колбеке CDC_BulkIn() надо остановить передачу установкой признака CDC_DepInEmpty = 1, иначе продолжить передачу. Прием полностью происходит через колбек CDC_BulkOut. Чтобы порт на машине появился, не забываем про инициализацию в начале. USB_Init(); // USB Initialization USB_Connect(TRUE); // USB Connect while (!USB_Configuration); // wait until USB is configured Спасибо за ответ, Евгений. Инициализация конечно есть, но если убираю в основном цикле вызов тех трех процедур - винда VCOM не видит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Allregia 9 25 января, 2012 Опубликовано 25 января, 2012 · Жалоба Еще интересны вопрос - попробовал ихний пример на разных скоростях уарта, что с физическим портом на РС, что просто затычку 2-3 на разьем уарта демоборды. 230400 - ОК 460800 и 921600 - фигвам. Отчего это? Может это ограничение стандартного виндусового драйвера витруального СОМ-порта? Тогда понятно. почему у PL/CP/FTDI драйвер не просто .inf а еще и .sys/.exe И народ, реально помогите пожалуства, встал проест из-за третьестепенной (по сравнению с остальным) вещи! Нужен стек USB CDC без всяких уартов МК, чтобы у меня было putchar/putstring/getchar Pleeeeeease! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Bass 0 27 января, 2012 Опубликовано 27 января, 2012 · Жалоба Allregia, почитай USB in a NutShell, там достаточно доходчиво все описано (тут переведено http://microsin.ru/content/view/1107/44). Сразу многое прояснится. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Allregia 9 27 января, 2012 Опубликовано 27 января, 2012 · Жалоба Allregia, почитай USB in a NutShell, там достаточно доходчиво все описано (тут переведено http://microsin.ru/content/view/1107/44). Сразу многое прояснится. Я это уже читал, и другое тоже. А на практике - переделать этот прмер для своих целей (убрать УАРТ) пока не получается. Как только что-то трога, так перестает инициализироваться и видеться как виртСОМ в компе. И еще - почему-то под отладчиком (J-Link на демоборде) творится какой=то балаган, брейкпойнтов не слушается, если руками остановить - то в непонятном месте останавдливаети по шагам или не идел или идет какая-то хрень. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
shista 0 27 января, 2012 Опубликовано 27 января, 2012 · Жалоба И еще - почему-то под отладчиком (J-Link на демоборде) творится какой=то балаган, брейкпойнтов не слушается, если руками остановить - то в непонятном месте останавдливаети по шагам или не идел или идет какая-то хрень. Посмотрите, что там с оптимизацией. Поставте -O0. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Allregia 9 27 января, 2012 Опубликовано 27 января, 2012 · Жалоба Стоит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
toweroff 1 28 января, 2012 Опубликовано 28 января, 2012 · Жалоба а под чем отлаживаетесь? под кейлом я очень долго бодался с lpc29 и jlink ну никак они не срастаются, и дрова, и кейл перебрал... с юлинком пошло нормально война производителей? ;) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Allregia 9 28 января, 2012 Опубликовано 28 января, 2012 · Жалоба Ну написанно же было в самом первом сообщении - Keil и J-Link. Но вобще, я делал несколько проектов с тем-же Кейлом и тем-же JLinkом, и все было нормально - и брейки, и пошаговое, и просмотр переменных. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EugenyAM 0 30 января, 2012 Опубликовано 30 января, 2012 · Жалоба Успешно использую в проектах на LPC2478 и STM32F103 виртуальный COM из тех самых примеров... Правда все это прикручено под ОС TN-Kernel с использованием очередей. Видимо придется писать статью про то, как с этим работать, учитывая проявляющийся интерес. Под LPC2478 была реализована библиотека последовательных интерфейсов на 4 UART и 1 VCOM, причем обращения из программы унифицированы и все равно с каким портом работать - виртуальным или реальным. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Allregia 9 31 января, 2012 Опубликовано 31 января, 2012 · Жалоба Успешно использую в проектах на LPC2478 и STM32F103 виртуальный COM из тех самых примеров... Правда все это прикручено под ОС TN-Kernel с использованием очередей. Видимо придется писать статью про то, как с этим работать, учитывая проявляющийся интерес. Было бы неплохо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться