Цитата(Понедельник @ Oct 3 2007, 16:38)

переписал, как вы советовали, теперь зависает на проверке TXCOMP перед отправкой последних 2 байт
Вот кусок, у меня работает.
//*----------------------------------------------------------------------------
//* \fn AT91F_USB_SendData
//* \brief Send Data through the control endpoint
//*----------------------------------------------------------------------------
__arm static void AT91F_USB_SendData(AT91PS_UDP pUdp, const char *pData, u_int length){
u_int cpt = 0;
AT91_REG csr;
do { cpt = MIN(length, 8);
length -= cpt;
while (pUdp->UDP_CSR[0] & AT91C_UDP_TXPKTRDY)
if ( pUdp->UDP_ISR & AT91C_UDP_RXSUSP ) return;
while (cpt--) pUdp->UDP_FDR[0] = *pData++;
if (pUdp->UDP_CSR[0] & AT91C_UDP_TXCOMP) {
pUdp->UDP_CSR[0] &= ~(AT91C_UDP_TXCOMP);
while (pUdp->UDP_CSR[0] & AT91C_UDP_TXCOMP);
}
pUdp->UDP_CSR[0] |= AT91C_UDP_TXPKTRDY;
do {
csr = pUdp->UDP_CSR[0];
// Data IN stage has been stopped by a status OUT
if (csr & AT91C_UDP_RX_DATA_BK0) {
pUdp->UDP_CSR[0] &= ~(AT91C_UDP_RX_DATA_BK0);
return;
}
} while ( !(csr & AT91C_UDP_TXCOMP) );
} while (length);
if (pUdp->UDP_CSR[0] & AT91C_UDP_TXCOMP) {
pUdp->UDP_CSR[0] &= ~(AT91C_UDP_TXCOMP);
while (pUdp->UDP_CSR[0] & AT91C_UDP_TXCOMP);
}
}