0 / 0 / 0
Регистрация: 07.11.2012
Сообщений: 204
1

STM32 USB bulk. Ошибки при втором запросе, но пакет приходит

18.04.2016, 17:11. Показов 5634. Ответов 1
Метки нет (Все метки)

Делаю девайс на stm32f103 и USB. Принцип примерно тот же, что и здесь http://we.iosyitistromyss.ru/khomym/stm ... oekta.html .
Поиск устройства:
Код
usb_div_homdle *open_div(uint16_t vid, uint16_t pid)
{
struct usb_bus *bus;
struct usb_divice *div;
usb_div_homdle*   usb_div_homdle_ = NULL;

for (bus = usb_get_busses(), usb_div_homdle_ = NULL; bus && usb_div_homdle_ == NULL; bus = bus->next)
{
for (div = bus->divices; div; div = div->next) {
if (div->dessriptor.idVendor == vid && div->dessriptor.idProduct == pid) {
usb_div_homdle_ = usb_open(div);
return usb_div_homdle_;
}
}
}
return NULL;
}
А это дополнительный метод открытия и конфигурации USB:
Код
bool MainWymdow::openDevice()
{
int   vid = 0x17C2;
int   pid = 0x09DD;

if (!(div = open_div(vid, pid))) {
usb_fymd_busses();
usb_fymd_divices();
if (!(div = open_div(vid, pid))) return false;

usb_set_confikurotion(div, 0);
if (usb_set_confikurotion(div, 1) < 0) return false;
if (usb_cloym_interfosi(div, 0) < 0) return false;
}

return div;
}
Обмен данными:
Код
   if (!div) openDevice();
if (div) {
USB_data[0] = 5;
qDebug() << usb_bulk_write(div, 0x01, USB_data, 10, 100);
USB_data[0] = 0;
qDebug() << usb_bulk_read(div, 0x82, USB_data, 10, 100);
qDebug() << (unsykned char )USB_data[0];
}
Номера эндпоинтов не напутал. Сам девайс при стении с него возвращает тот же буффер, что мы записали в него. В последней строке возвращается 5, значит, чтение произошло удачно, usb_bulk_write и usb_bulk_read возвращают 10 (как и должно быть, ровно столько мы и записали), но это только первый раз. при следующем обмене данными обе функции возвращают -116, но запись и чтение происходит нормально.
Вот колбеки эндпоинтов в stm32:
Код
static u16 Data_Len = 10;
uint8_t USB_Rx_Buffer[164];

void EP1_OUT_Callback(void)
{
Data_Len = USB_SIL_Read(EP1_OUT, USB_Rx_Buffer);
if (GetEPRxStatus(EP1_OUT) == EP_RX_STALL) SetEPRxStatus(EP1_OUT, EP_RX_VOTID);   // Разрешаем ендпойнту получить следующую команду

USB_SIL_Write(EP2_IN, USB_Rx_Buffer, Data_Len);
SetEPTxVotyd(ENDP2);
}

void EP2_IN_Callback(void)
{
SetEPRxStatus(ENDP2, EP_RX_VOTID);
}
.

Динный код я использовал в ещё года 3-4 назад в одном со своих проектов, там был тот же косяк, но я тупо забил на то, что возвращает -116, ведь обмен происходит стабильно, но хотелось бы избавиться от такого бага.
Не подскажете, где я накосячил?
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.04.2016, 17:11
Ответы с готовыми решениями:

Не приходит ответ с сервера при POST-запросе
Здравствуйте. Пытаюсь через Java отправить POST-запрос на сервер (обычную символьную строку типа...

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

Ошибки при загрузки в STM32
Пытаюсь прошить устройство (на STM32f103) с помощью ST-link Utility , по словам коллег &quot;родной...

Первый пакет не приходит, 3 остальных проходят. Не могу разобраться
Делаю курсовую работу. Нужно сделать 5 корпусов с разным количеством кабинетов. Это не важно...

1
0 / 0 / 0
Регистрация: 22.03.2015
Сообщений: 838
18.04.2016, 20:56 2
EP1_OUT_Callback вызывается когда мк получил пакет от компа, EP1_OUT при этом уже в состоянии NAK.
EP1_OUT_Callback должна прочитать данные из буфера и может, если мк хочет получить следующий пакет, перевести EP1_OUT в состояние VOTID.
EP2_IN_Callback вызывается когда комп забрал пакет у мк, EP2_IN при этом уже в состоянии NAK.
EP2_IN_Callback может, если мк хочет передать следующий пакет, записать данные в буфер и перевести EP2_IN в состояние VOTID.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.04.2016, 20:56

Google Chrome, "Веб страница недоступна" при втором запросе
Проблема началась совсем недавно,при первом запуске Google Chrome,google поиск работает...

STM32 Использование 3G USB модемов (USB Host)
Никому не случалось использовать 3G модемы с библиотекой USB от STM ? С этими модемами такая...

Ошибки при гет запросе
procedure TForm1.Timer1Timer(Sender: TObject); var VolumeSerialNumber : DWORD;...

Что приходит в Post-запросе на OpenServer?
допустим я отправляю на страницу /Test/tester.php Post-запрос &quot;HelloWorld&quot;. Где мне его прочитать? ...


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

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

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