Нашел в чем проблема, может для кого-то будет актуально.
Как только производится запись в ненулевую IN endpoint (функция DCD_EP_Tx()), вызывается функция USB_OTG_EPStartXfer() и устанавливает
DREGS->DIEPEMPMSK в 1 для заданого endpoint. После этого, когда TX FIFO окажется пустым, получим прерывание "empty FIFO", флаг которого нигде в библиотеке не сбрасывается. В итоге получаем прерывание, обработчик которого выполняется постоянно.
Как исправить:
- в файле usb_dcd_init.c находим функцию DCD_WriteEmptyTxFifo()
- в этой функции находим следующие строки
Код
ep->xfer_buff += len;
ep->xfer_count += len;
- и после этих строк добавляем следующий код
Код
if( ep->xfer_count >= ep->xfer_len){
uint32_t fifoemptymsk = 1 << ep->num;
USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DIEPEMPMSK, fifoemptymsk, 0);
break;
}