Easyelectronics.ru

Электроника для всех
Текущее время: 22 сен 2019, 13:25

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



JLCPCB – Прототипы печатных плат за $2/10pcs (Любой цвет!)
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

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

Зарегистрирован: 22 авг 2011, 17:36
Сообщения: 254
Делаю девайс на 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
Сообщения: 1432
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 часов


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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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

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