2019-07-15 11:01 AM
I read some related topics on this community but none of them could fixes the issue.
I'm currently trying to disable a USB OUT endpoint (following the steps from the Reference Manual) but the Global NAK Effective interrupt bit (GONAKEFF in USB_OTG_FS_GINTSTS) is never set, after I set the USB_OTG_DCTL_SGONAK bit in USB_OTG_FS_DEVICE_DCTL while the interrupt is masked (as it is supposed to be, according to the doc). Is there some thing I'm missing to disable properly the endpoint ?
Thank you in advance
2023-01-19 04:50 AM
I had same problem with STM32F7 (HAL version 1.16.0).
Found interesting comment in NuttX source code (stm32_otgdev.c)
/* Wait for the GONAKEFF interrupt that indicates that the OUT NAK
* mode is in effect. When the interrupt handler pops the OUTNAK word
* from the RxFIFO, the core sets the GONAKEFF interrupt.
*/
/* Since we are in the interrupt handler, we cannot wait inline for the
* GONAKEFF because it cannot occur until service the RXFLVL global interrupt
* and pop the OUTNAK word from the RxFIFO.
I tried to manually flush RxFifo (while in ISR) with this code and eventually got BOUTNAKEFF set (GONAKEFF is defined as BOUTNAKEFF in HAL libraries)
if ((USB_OTG_HS->GINTSTS & USB_OTG_GINTSTS_BOUTNAKEFF) == 0)
{
((USB_OTG_DeviceTypeDef *)(USB_OTG_HS_PERIPH_BASE + USB_OTG_DEVICE_BASE))->DCTL = USB_OTG_DCTL_SGONAK;
while ((USB_OTG_HS->GINTSTS & USB_OTG_GINTSTS_BOUTNAKEFF) == 0)
{
if (USB_OTG_HS->GINTSTS & USB_OTG_GINTSTS_RXFLVL)
{
uint32_t temp = USBx->GRXSTSP;
while (USB_OTG_HS->GINTSTS & USB_OTG_GINTSTS_RXFLVL)
temp = USBx->GRXSTSP;
}
}
/* ... */
((USB_OTG_DeviceTypeDef *)(USB_OTG_HS_PERIPH_BASE + USB_OTG_DEVICE_BASE))->DCTL = USB_OTG_DCTL_CGONAK;
}