Разобрался с зависанием в функции прерывания USB_ISR.
Попадая в цикл
while (isr = pUDP->UDP_ISR) { висит там до тех пор пока isr != 0
Код
void USB_ISR (void) /* __irq */{
DWORD isr, csr, bkm, n;
while (isr = pUDP->UDP_ISR) {
/* End of Bus Reset Interrupt */
if (isr & AT91C_UDP_ENDBUSRES) {
USB_Reset();
pUDP->UDP_ICR = AT91C_UDP_ENDBUSRES;
}
...
}
итог5е приходит прерывание AT91C_UDP_WAKEUP, обработки которого нет в цикле и сброса его не ведется, проблема решается добавлением pUDP->UDP_ICR = AT91C_UDP_WAKEUP;
AT91C_UDP_WAKEUP - приходит в момент подключения или отключения USB разъёма, но не всегда.
Но основная проблема ещё не решена. Тормозит редкость возникновения ошибки.
Неужели никто не сталкивался с такой проблемой?