Перейти к содержанию
    

LPC17xx USB CDC ?

Не работал раньше с 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, попроще? Типа нажал кнопку - отправил байт, пришел байт - зажег светодиод ?

Я волшебное слово знаю - "пожалуста" :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я использовал библиотеку LPCUSB от Bertrik Sikken.

Вся логика работы очень проста - usbSerialInit(); VCOM_putchar(); VCOM_getchar();

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Здесь логика работы похожа на работу с 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

Изменено пользователем EugenyAM

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Здесь логика работы похожа на работу с 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 не видит.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Еще интересны вопрос - попробовал ихний пример на разных скоростях уарта, что с физическим портом на РС, что просто затычку 2-3 на разьем уарта демоборды.

230400 - ОК

460800 и 921600 - фигвам. Отчего это?

Может это ограничение стандартного виндусового драйвера витруального СОМ-порта? Тогда понятно. почему у PL/CP/FTDI драйвер не просто .inf а еще и .sys/.exe

 

 

И народ, реально помогите пожалуства, встал проест из-за третьестепенной (по сравнению с остальным) вещи! Нужен стек USB CDC без всяких уартов МК, чтобы у меня было putchar/putstring/getchar

 

Pleeeeeease!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Allregia, почитай USB in a NutShell, там достаточно доходчиво все описано (тут переведено http://microsin.ru/content/view/1107/44). Сразу многое прояснится.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Allregia, почитай USB in a NutShell, там достаточно доходчиво все описано (тут переведено http://microsin.ru/content/view/1107/44). Сразу многое прояснится.

Я это уже читал, и другое тоже. А на практике - переделать этот прмер для своих целей (убрать УАРТ) пока не получается.

Как только что-то трога, так перестает инициализироваться и видеться как виртСОМ в компе.

И еще - почему-то под отладчиком (J-Link на демоборде) творится какой=то балаган, брейкпойнтов не слушается, если руками остановить - то в непонятном месте останавдливаети по шагам или не идел или идет какая-то хрень.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И еще - почему-то под отладчиком (J-Link на демоборде) творится какой=то балаган, брейкпойнтов не слушается, если руками остановить - то в непонятном месте останавдливаети по шагам или не идел или идет какая-то хрень.

 

Посмотрите, что там с оптимизацией. Поставте -O0.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а под чем отлаживаетесь?

под кейлом я очень долго бодался с lpc29 и jlink

ну никак они не срастаются, и дрова, и кейл перебрал...

с юлинком пошло нормально

война производителей? ;)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну написанно же было в самом первом сообщении - Keil и J-Link.

Но вобще, я делал несколько проектов с тем-же Кейлом и тем-же JLinkом, и все было нормально - и брейки, и пошаговое, и просмотр переменных.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Успешно использую в проектах на LPC2478 и STM32F103 виртуальный COM из тех самых примеров... Правда все это прикручено под ОС TN-Kernel с использованием очередей. Видимо придется писать статью про то, как с этим работать, учитывая проявляющийся интерес. Под LPC2478 была реализована библиотека последовательных интерфейсов на 4 UART и 1 VCOM, причем обращения из программы унифицированы и все равно с каким портом работать - виртуальным или реальным.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Успешно использую в проектах на LPC2478 и STM32F103 виртуальный COM из тех самых примеров... Правда все это прикручено под ОС TN-Kernel с использованием очередей. Видимо придется писать статью про то, как с этим работать, учитывая проявляющийся интерес.

 

Было бы неплохо!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...