Dima1060 0 11 августа, 2021 Опубликовано 11 августа, 2021 · Жалоба Здравствуйте! Делал проект в 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 года, возможно какие то баги были поправлены за это время. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться