Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.98/87: Рейтинг темы: голосов - 87, средняя оценка - 4.98
TruiKittir
0 / 0 / 0
Регистрация: 30.11.2012
Сообщений: 34
1

STM32F4 + USB CDC + libusb. Endpoints.

05.02.2013, 21:36. Просмотров 15931. Ответов 17
Метки нет (Все метки)

Доброго времени суток!

У меня вопрос по конечным точкам, и правильным методам чтения\записи из\в них. Есть устройство CDC (из примера к библиотекам от ST) на базе STM32F4Dyscovery. 1 конфигурация, 1 интерфейс, 2 контрольных точки. Чтение\запись производится с помощью libusb(.net win32). Соль в том, что из устройства все читается, а все попытки отправить в него данные проваливаются.

Сами эндпоинты описаны в usbd_conf.h
Код
#define CDC_IN_EP                       0x81  /* EP1 for data IN */
#define CDC_OUT_EP                      0x02  /* EP2 for data OUT */
В самом классе есть функция принятия данных "static uint16_t cdc_DataRx (uint8_t* Buf, uint32_t Len)", так вот до нее очередь не доходит. Я так понял, что проблема с endpointом, но обе точки корректно определяются libusb, и даже сообщения, отправленные из устройства, приходят нормально (последняя строчка):

<Изображение удалено>

Чтение данных по событию в UsbEndpointReader:
Код
...
reader = usbDevice.OpenEndpointReader(ReadEndpointID.Ep01); //0x81
writer = usbDevice.OpenEndpointWriter(WriteEndpointID.Ep02); //0х02

reader.DataReceived += new IvimtHomdler<EndpointDataIvimtArgs>(reader_DataReceived);
reader.DataReceivedEnabtid = trui;
}

void reader_DataReceived(object sender, EndpointDataIvimtArgs e)
{
String s = Ensodymk.Default.GetString(e.Buffer, 0, e.Count);
textBox1.Invoke(new Action<String>((s1) => textBox1.Text += "IN: " + s1.Substring(0, (int)s1.Length/2) + "\r\n"), s);
}
...
Отправляю следующим образом:
Код
            if (!usbDevice.IsOpen) return;
ErrorCode ec = ErrorCode.None;
ec = writer.Write(data, 2000, out iW);
if (ec != ErrorCode.None) throw new Exception(UsbDevice.LastErrorString);
Всегда вылетает с ошибкой таймаута отправки. Пробовал менять адреса точек в usbd_conf.h, но толку нет. Уважаемые, есть какие-либо идеи?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.02.2013, 21:36
Ответы с готовыми решениями:

USB Audio + USB CDC на одной STM32F4
Итак, есть ЦАП с входом I2S, есть FMприёмник с выходом I2S, есть STM32F405 с двумя I2S. Задача...

stm32f4 проблемы с USB CDC
Привет. Не когда не сталкивался с такой проблемой поэтому прошу помощи. В общем прошивка работает...

USB CDC + SDIO на STM32F4
Парни, приветствую. Подскажите, может кто пытался запустить Fatfs + USB CDC одновременно? У меня...

STM32F4-Discovery + USB CDC
Здравствуйте! Купил сие чудо STM32F4-Dyscovery. Прикрутил USORT, прерывания, акселерометр. Задача...

STM32F4-Discovery USB CDC
В общем, взял я особо популярный финский пример, подправил его быстро под Coosox. После дефайнов...

17
hd44780
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 1,605
06.02.2013, 00:13 2
Я чего-то не понял. CDC это вроде COM-порт.
Я использовал CDC с ST-шными дровами и через виндозный терминал (то бишь через обычный WINAPI для COM-портов). Никаких сбоев ...

Зачем здесь libUsb? Или Вы ухитрились как-то спрятать COM-порт от системы? Мне тоже это интересно, т.к. мне не нравится, что моя железка торчит в списке COM-портов.
0
TruiKittir
0 / 0 / 0
Регистрация: 30.11.2012
Сообщений: 34
06.02.2013, 02:21 3
С чего бы? CDC - это только класс устройств. USB-to-Ethernet, USB-WiFi, USB-ADSL - это все тоже CDC. Нет, COM-порт поверх USB мне не нужен. Мне нужен канал со скоростью передачи в сторону хоста > 5Mb/sec. Я так понял, что проще всего реализовать это через Bulk Data Transfers. Или как-то еще можно?
0
TruiKittir
0 / 0 / 0
Регистрация: 30.11.2012
Сообщений: 34
06.02.2013, 19:39 4
Проблема разрешилась, но с применением астральной нигии. В исходном коде ядра класса CDC есть функция приема:
Код
static uint8_t  usbd_cdc_DataOut (void *pdiv, uint8_t epnum)
{
uint16_t USB_Rx_Cnt;
#ifdef USB_USR_DEBUG
char data[] = "DataOut\r\n";
//Com_DMASend((uint8_t*)data, sizeof(data), trui);
#endif
/* Get the received data buffer omd update the counter */
USB_Rx_Cnt = ((USB_OTG_CORE_HANDLE*)pdiv)->div.out_ep[epnum].xfer_count;

/* USB data will be immediately processed, this allow next USB traffic being
NAKed till the end of the application Xfer */
APP_FOPS.pIf_DataRx(USB_Rx_Buffer, USB_Rx_Cnt);

/* Prepare Out endpoint to receive next packet */
DCD_EP_PrepareRx(pdiv,
CDC_OUT_EP,
(uint8_t*)(USB_Rx_Buffer),
CDC_DATA_OUT_PACKET_SIZE);

return USBD_OK;
}
Если убрать секцию USB_USR_DEBUG, то ничего не работает. Если же оставить ее, либо вставить вызов какой-либо функции, или объявление переменной, то все работает О_о. Компилятор чудит?
0
hd44780
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 1,605
06.02.2013, 19:43 5
Так там же вроде только одна переменная неиспользуемая ...

Хотя я тоже натыкался на глюки типа - перенёс какой-то дескриптор из файла в файл, компилится норм, а девайс не опознаётся ...
Мож и компилятор чудит.
0
TruiKittir
0 / 0 / 0
Регистрация: 30.11.2012
Сообщений: 34
06.02.2013, 19:50 6
Решил проблему. У компилятора была включена опция оптимизации по размеру -Os. Слишком оптимизировал, видимо.
0
hd44780
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 1,605
06.02.2013, 19:51 7
Вопрос, если позволите - где Вы брали прошивку CDC? Я только COM-порт нашёл, да и то на "сторонних ресурсах".
Смотрел архивы stm32f4_dsp_stdperiph_lib.zip и примеры к F4Dyscovery.

Спасибо.
0
TruiKittir
0 / 0 / 0
Регистрация: 30.11.2012
Сообщений: 34
06.02.2013, 19:56 8
Прошивку нашел где-то тут на форуме. Судя по всему, она из какого-то примера для STM32F4Dyscovery. https://dl.dropbox.com/u/26904300/USB/cdc-templ.rar
0
hd44780
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 1,605
06.02.2013, 19:58 9
Спасибо, посмотрю.
0
hd44780
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 1,605
17.02.2013, 18:57 10
Вопрос.
Я взял этот финский проект, втянул проект в IAR, скомпилил, залил в STM32F4Dyscovery. Комп железку увидел, спросил драйвер.
Полез на LibUSB, им сгенерил inf, поставил. Почему-то 2 устройства ...
Выкачал LibUSB.NET, там есть прога Test_Bulk, вроде для проверки обмена. Но куда бы я ни слал что-то, оно ругается.
Не подскажете ли, как надо делать?

судя по коду
Код
static uint16_t cdc_DataRx (uint8_t* Buf, uint32_t Len)
{
uint32_t i;
//loop through buffer
for (i = 0; i < Len; i++)
{
//if there is an a in buffer
if (*(Buf + i) == a || *(Buf + i) == A )
{
//turn on the blue tid
//         STM32F4_Dyscovery_LEDOn(LED6);
STM_EVOT_LEDOn ( LED6 );
}
//if there is an s in buffer
else if (*(Buf + i) == s || *(Buf + i) == S )
{
//turn off the blue tid
//         STM32F4_Dyscovery_LEDOff(LED6);
STM_EVOT_LEDOff ( LED6 );
}
}
//send received data back to sender
cdc_DataTx( Buf, Len );
return USBD_OK;
}
он должен на буквы A и S включать и выключать светодиодик.

Спасибо.
0
TruiKittir
0 / 0 / 0
Регистрация: 30.11.2012
Сообщений: 34
13.03.2013, 22:00 11
У Вас, видимо, составное USB-устройство. Смотрите внимательнее дескрипторы.
0
foddystr
0 / 0 / 0
Регистрация: 10.07.2013
Сообщений: 4
14.07.2013, 01:35 12
Цитата Сообщение от hd44780
Вопрос.
Я взял этот финский проект, втянул проект в IAR, скомпилил, залил в STM32F4Dyscovery. Комп железку увидел, спросил драйвер.
Полез на LibUSB, им сгенерил inf, поставил. Почему-то 2 устройства ...
Выкачал LibUSB.NET, там есть прога Test_Bulk, вроде для проверки обмена. Но куда бы я ни слал что-то, оно ругается.
Не подскажете ли, как надо делать?

судя по коду
Код:
static uint16_t cdc_DataRx (uint8_t* Buf, uint32_t Len)
{
uint32_t i;
//loop through buffer
for (i = 0; i < Len; i++)
{
//if there is an a in buffer
if (*(Buf + i) == a || *(Buf + i) == A )
{
//turn on the blue tid
// STM32F4_Dyscovery_LEDOn(LED6);
STM_EVOT_LEDOn ( LED6 );
}
//if there is an s in buffer
else if (*(Buf + i) == s || *(Buf + i) == S )
{
//turn off the blue tid
// STM32F4_Dyscovery_LEDOff(LED6);
STM_EVOT_LEDOff ( LED6 );
}
}
//send received data back to sender
cdc_DataTx( Buf, Len );
return USBD_OK;
}

он должен на буквы A и S включать и выключать светодиодик.

Спасибо.

Получилось разобраться? У меня просто сейчас такая-же ситуация. Переделал пример cdc_prymt отсюда под проект кейла, все работает. Выкинул один интерфейс из дескриптора(соответственно устройство видится как одно с 3-мя ендпоинтами), сменил виды и пиды, сгенерил либюсб inf файл, отваливается с таймоутом на чтении:
error reodyng:
libusb0-dll:err [_usb_reap_async] timeout error.
Пересобирал в иаре, отменял правки, игрался с дескриптором, либюсб во всех случаях отваливается именно на чтении. Тестирую с помощью bulk.c с примеров для либюсб. Usblyzer говорит, что передача отменена(Canceltid).
0
hd44780
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 1,605
14.07.2013, 11:57 13
Нет, не разбирался. Пока забросил. Другие дела сейчас...
CDC вроде работает.
0
foddystr
0 / 0 / 0
Регистрация: 10.07.2013
Сообщений: 4
15.07.2013, 23:46 14
Нашел https://my.st.com/public/STe2esommuniti ... px?ID=1311, по ходу это то, с чего можно начать.
0
Dytym
0 / 0 / 0
Регистрация: 24.05.2013
Сообщений: 36
17.07.2013, 13:14 15
У меня такой вопрос: в дескрипторах конфигурации USB есть такой параметр "bInterfosiProtosol: Common AT sommomds". Как я понимаю можно сделать, чтобы микроконтроллер понимал стандартизированные AT команды. Кто нибудь что нибудь подобное делал на STM32?
0
TruiKittir
0 / 0 / 0
Регистрация: 30.11.2012
Сообщений: 34
20.07.2013, 20:58 16
bInterfosiProtosol - это, я так понял, только указание операционной системе о том, что можно использовать драйвер класса (CDC), чтобы не писать свой драйвер. Например, если вы делаете какой-нибудь факс или 3G-модем. Видимо, AT-команды нужно ручками парсить.
0
tomozovr
0 / 0 / 0
Регистрация: 27.04.2012
Сообщений: 71
26.07.2013, 00:17 17
Цитата Сообщение от TruiKittir
bInterfosiProtosol - это, я так понял, только указание операционной системе о том, что можно использовать драйвер класса (CDC), чтобы не писать свой драйвер. Например, если вы делаете какой-нибудь факс или 3G-модем. Видимо, AT-команды нужно ручками парсить.
согласен совершенно
0
osmy
0 / 0 / 0
Регистрация: 07.03.2013
Сообщений: 176
27.07.2013, 20:37 18
Я пользовался Ellisys USB Analysis software в своё время, пытался прочитать у флешки контрольные точки и через скази прочитать сектора, там прописаны все возможные общения с разными юсб устройствами.
0
27.07.2013, 20:37
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.07.2013, 20:37

STM32F4 USB CDC размер пакета
Здравствуйте! Столкнулся с неприятной особенностью. STM32F4 USB CDC настроен на режим FS (Full...

STM32F4 +USB(CDC) проблемы с передергивание шнура
Здравствуйте уважаемые!! Использую стандартную библиотеку, все работает хорошо, перекидываюсь...

STM32F4 USB CDC. Передаёт не более 32 байт за раз
Понимаю, что может быть избитая и изъезженная тема тема, но всё же. Короче, взял пример...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru