Проблему локализовал.
Если во время приема девайсом данных от некого источника и передачи их по USB на ПК мы перезагружаем приложение, то приложение повторно балгополучно открывает девайс и производит в него запись команд, но девайс не отвечает. Дело в том, что при перезагрузке приложения в FIFO UDP контролера остаются несчитанные данные, а при запуске приложения сначала запрашивается серийный номер девайса, но так как у нас в FIFO в этот момент неизвестно что и неизвестно какого размера, то происходит сбой - readfile считывает неизвестно что.
Поэтому я хочу при закрытии приложения, по комнаде "Turn Off" сбрасывать конечную точку IN с помощью регистра UDP_RSTEP, но перед этим необходимо послать хосту Stall и дождаться подтверждения. Привожу код команды "Turn Off":
Код
__ramfunc void Turn_off()
{
AT91C_BASE_SYS->PIOA_IDR = 0xffffffff;
//посылаем Stall хосту и ждем подтверждения
pUdp->UDP_CSR[0] |= AT91C_UDP_FORCESTALL;
while(!(pUdp->UDP_CSR[0] & AT91C_UDP_ISOERROR));
pUdp->UDP_CSR[0] &= ~(AT91C_UDP_FORCESTALL | AT91C_UDP_ISOERROR);
while (pUdp->UDP_CSR[0] & (AT91C_UDP_FORCESTALL | AT91C_UDP_ISOERROR));
//Сброс конечной точки
AT91C_BASE_UDP->UDP_RSTEP |= AT91C_UDP_EPINT1;
AT91C_BASE_UDP->UDP_RSTEP &= ~AT91C_UDP_EPINT1;
Видимо я что-то упустил, так как в таком виде проблему решить всерано не удалось.