diff --git a/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pcd.c b/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pcd.c index 2e0786c..79204ab 100644 --- a/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pcd.c +++ b/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pcd.c @@ -1406,6 +1406,7 @@ static HAL_StatusTypeDef PCD_WriteEmptyTxFifo(PCD_HandleTypeDef *hpcd, uint32_t uint32_t fifoemptymsk = 0; ep = &hpcd->IN_ep[epnum]; + #if 0 len = ep->xfer_len - ep->xfer_count; if (len > ep->maxpacket) @@ -1435,6 +1436,37 @@ static HAL_StatusTypeDef PCD_WriteEmptyTxFifo(PCD_HandleTypeDef *hpcd, uint32_t ep->xfer_count += len; } + #else + /* dpgeorge: modified above loop to: + * - allow to write the packet in the case it exactly fills the FIFO + * - recompute len32b before each check of this value against FIFO free space + */ + for (;;) + { + len = ep->xfer_len - ep->xfer_count; + if (len <= 0U) + { + /* Finished sending all data */ + break; + } + if (len > ep->maxpacket) + { + len = ep->maxpacket; + } + + len32b = (len + 3U) / 4U; + if (len32b > (USBx_INEP(epnum)->DTXFSTS & USB_OTG_DTXFSTS_INEPTFSAV)) + { + /* No room left in FIFO */ + break; + } + + USB_WritePacket(USBx, ep->xfer_buff, epnum, len, hpcd->Init.dma_enable); + ep->xfer_buff += len; + ep->xfer_count += len; + } + #endif + if(len <= 0) { fifoemptymsk = 0x1 << epnum;