Перейти к содержанию
    

Передача данных по Interrupt каналу для STM32F4

Здравствуйте! Делал проект в CubeMX для STM32F429 с передачей данных по USB. Сейчас есть две конечных точки, одна Bulk OUT и одна Interrupt IN. Изначально сгенерировал в CubeMX проект для USB CDC и переделал в дескрипторах одну конечную точку в тип Interrupt. Для передачи данных по Interrupt каналу использовал стандартную функцию

uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len)
{
 uint8_t result = USBD_OK;
 USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*)hUsbDeviceFS.pClassData;
 if (hcdc->TxState != 0){
   return USBD_BUSY;
 }
 USBD_CDC_SetTxBuffer(&hUsbDeviceFS, Buf, Len);
 result = USBD_CDC_TransmitPacket(&hUsbDeviceFS);
 return result;
}

Все заработало, только отредактировал немного функцию передачи данных низкого уровня - насколько помню, нашел это на форуме ST:

Spoiler

HAL_StatusTypeDef HAL_PCD_EP_Transmit(PCD_HandleTypeDef *hpcd, uint8_t ep_addr, uint8_t *pBuf, uint32_t len)
{
  USB_OTG_EPTypeDef *ep;
  
  ep = &hpcd->IN_ep[ep_addr & 0x7F];
  
  /*setup and start the Xfer */
  ep->xfer_buff = pBuf;  
  ep->xfer_len = len;
  ep->xfer_count = 0;
  ep->is_in = 1;
  ep->num = ep_addr & 0x7F;
  
  if (hpcd->Init.dma_enable == 1)
  {
    ep->dma_addr = (uint32_t)pBuf;  
  }
  HAL_NVIC_DisableIRQ(OTG_HS_IRQn);//add 17042017
  __HAL_LOCK(hpcd); 
  
  if ((ep_addr & 0x7F) == 0 )
  {
    USB_EP0StartXfer(hpcd->Instance , ep, hpcd->Init.dma_enable);
  }
  else
  {
    USB_EPStartXfer(hpcd->Instance , ep, hpcd->Init.dma_enable);
  }
  
  __HAL_UNLOCK(hpcd);
  HAL_NVIC_EnableIRQ(OTG_HS_IRQn);//add 17042017   
  return HAL_OK;
}

 

После этого никаких проблем с передачей данных по Interrupt не наблюдалось, но всегда глодало сомнение, а правильно ли я сделал. Каких то примеров нигде не нашел, везде bulk и иногда изохронные.

Недавно же при испытаниях на ЭСР выяснилось что иногда передача данных по Interrupt прекращается и никак не удается возобновить ее работу, кроме как перезагрузкой прибора. Причем перестает работать именно передача по Interrup, вторая конечная точка нормально работает.

Здесь хотелось бы узнать, может кто-то делал передачу по Interrupt или находил адекватный пример.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...