Добрый день!
Кто нибудь реализовывал одновременно Bulk In + Interrupt In transfer в Cube? Я сгенерировал проект для CDC Virtual com port, добавил Interrupt In endpoint. Собрался передавать данные и не пойму как это сделать.
Есть стандартная функция
Код
uint8_t CDC_Transmit_HS(uint8_t* Buf, uint16_t Len)
{
uint8_t result = USBD_OK;
USBD_CDC_SetTxBuffer(hUsbDevice_1, Buf, Len);
result = USBD_CDC_TransmitPacket(hUsbDevice_1);
return result;
}
Добавить в нее номер эндпойнта некуда. Но это не главная беда. Внутренние функции устанавливают некий буфер
Код
uint8_t USBD_CDC_SetTxBuffer (USBD_HandleTypeDef *pdev,
uint8_t *pbuff,
uint16_t length)
{
USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*) pdev->pClassData;
hcdc->TxBuffer = pbuff;
hcdc->TxLength = length;
return USBD_OK;
}
и данные
Код
uint8_t USBD_CDC_TransmitPacket(USBD_HandleTypeDef *pdev)
{
USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*) pdev->pClassData;
if(pdev->pClassData != NULL)
{
if(hcdc->TxState == 0)
{
/* Tx Transfer in progress */
hcdc->TxState = 1;
/* Transmit next packet */
USBD_LL_Transmit(pdev,
CDC_IN_EP,
hcdc->TxBuffer,
hcdc->TxLength);
return USBD_OK;
}
else
{
return USBD_BUSY;
}
}
else
{
return USBD_FAIL;
}
}
Как я понял, пока не завершится одна передача, совать другую нельзя. То есть если я начал Interrupt In transfer, то придется ждать минимум 1 мс пока он завершится и все это время я не смогу ничего отправить по Bulk In? Можно это как то обойти?