реклама на сайте
подробности

 
 
> LPC17xx USB CDC ?
Allregia
сообщение Jan 22 2012, 16:58
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763



Не работал раньше с 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, попроще? Типа нажал кнопку - отправил байт, пришел байт - зажег светодиод ?
Я волшебное слово знаю - "пожалуста" sm.gif
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
EugenyAM
сообщение Jan 23 2012, 09:56
Сообщение #2


Участник
*

Группа: Свой
Сообщений: 73
Регистрация: 14-10-08
Из: Omsk
Пользователь №: 40 929



Здесь логика работы похожа на работу с 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 - Jan 23 2012, 10:00
Go to the top of the page
 
+Quote Post
Allregia
сообщение Jan 24 2012, 14:14
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763



Цитата(EugenyAM @ Jan 23 2012, 11:56) *
Здесь логика работы похожа на работу с 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 не видит.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 29th July 2025 - 05:38
Рейтинг@Mail.ru


Страница сгенерированна за 0.01373 секунд с 7
ELECTRONIX ©2004-2016