Easyelectronics.ru

Электроника для всех
Текущее время: 16 фев 2019, 00:21

Часовой пояс: UTC + 5 часов




Начать новую тему Ответить на тему  [ Сообщений: 2 ] 
Автор Сообщение
 Заголовок сообщения: STM32 USB bulk. Ошибки при втором запросе, но пакет приходит
СообщениеДобавлено: 19 апр 2016, 17:58 
Старожил

Зарегистрирован: 22 авг 2011, 17:36
Сообщения: 251
Делаю девайс на stm32f103 и USB. Принцип примерно тот же, что и здесь http://we.easyelectronics.ru/khomin/stm ... oekta.html .
Поиск устройства:
Код:
usb_dev_handle *open_dev(uint16_t vid, uint16_t pid)
{
   struct usb_bus *bus;
   struct usb_device *dev;
   usb_dev_handle*   usb_dev_handle_ = NULL;

   for (bus = usb_get_busses(), usb_dev_handle_ = NULL; bus && usb_dev_handle_ == NULL; bus = bus->next)
   {
      for (dev = bus->devices; dev; dev = dev->next) {
         if (dev->descriptor.idVendor == vid && dev->descriptor.idProduct == pid) {
            usb_dev_handle_ = usb_open(dev);
            return usb_dev_handle_;
         }
      }
   }
   return NULL;
}

А это дополнительный метод открытия и конфигурации USB:
Код:
bool MainWindow::openDevice()
{
   int   vid = 0x17C2;
   int   pid = 0x09DD;

   if (!(dev = open_dev(vid, pid))) {
      usb_find_busses();
      usb_find_devices();
      if (!(dev = open_dev(vid, pid))) return false;

      usb_set_configuration(dev, 0);
      if (usb_set_configuration(dev, 1) < 0) return false;
      if (usb_claim_interface(dev, 0) < 0) return false;
   }

   return dev;
}

Обмен данными:
Код:
   if (!dev) openDevice();
   if (dev) {
      USB_data[0] = 5;
      qDebug() << usb_bulk_write(dev, 0x01, USB_data, 10, 100);
      USB_data[0] = 0;
      qDebug() << usb_bulk_read(dev, 0x82, USB_data, 10, 100);
      qDebug() << (unsigned 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_VALID);   // Разрешаем ендпойнту получить следующую команду

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

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

Данный код я использовал в ещё года 3-4 назад в одном со своих проектов, там был тот же косяк, но я тупо забил на то, что возвращает -116, ведь обмен происходит стабильно, но хотелось бы избавиться от такого бага.
Не подскажете, где я накосячил?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: STM32 USB bulk. Ошибки при втором запросе, но пакет приходит
СообщениеДобавлено: 19 апр 2016, 21:43 
Старожил

Зарегистрирован: 27 мар 2015, 01:22
Сообщения: 1338
EP1_OUT_Callback вызывается когда мк получил пакет от компа, EP1_OUT при этом уже в состоянии NAK.
EP1_OUT_Callback должна прочитать данные из буфера и может, если мк хочет получить следующий пакет, перевести EP1_OUT в состояние VALID.
EP2_IN_Callback вызывается когда комп забрал пакет у мк, EP2_IN при этом уже в состоянии NAK.
EP2_IN_Callback может, если мк хочет передать следующий пакет, записать данные в буфер и перевести EP2_IN в состояние VALID.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 2 ] 

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: PRC


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB