Спасибо за файлик, поставил его... Ничего не изменилось... Блин, теперь даже не знаю куда смотреть.
Может быть хоть у Вас будет идея почему данный код работает на одной машине и не работает на другой (usbser, как мы выяснили тут не при чем...)
Вот моя функция передачи данных хосту:
Код
static uint AT91F_UDP_Write(AT91PS_CDC pCdc, const char *pData, uint length)
{
AT91PS_UDP pUdp = pCdc->pUdp;
// проверяем, готов ли юсб к передаче
if (pUdp->UDP_CSR[AT91C_EP_IN] & AT91C_UDP_TXPKTRDY) {
return 0;
}
pUdp->UDP_FDR[AT91C_EP_IN] = 0x73; // хотим передать символ "t"
pUdp->UDP_CSR[AT91C_EP_IN] |= AT91C_UDP_TXPKTRDY; // готовы отправлять
while ( !(pUdp->UDP_CSR[AT91C_EP_IN] & AT91C_UDP_TXCOMP) ); // ждем пока нам не вернут TXCOMP
pUdp->UDP_CSR[AT91C_EP_IN] &= ~(AT91C_UDP_TXCOMP); // обнуляем TXCOMP
}
Первое использование этой функции происходит нормально. При повторном ее использовании не приходит бит TXCOMP, и программа не выходит из цикла.
В программе я никак не настраивал и вообще не использовал блок управления прерываниями AIC. Может ли проблема быть в этом?