Данные в конечную точку записывать после примерно такой проверки:
Код
while ( !(pUdp->UDP_CSR[EP_IN] & AT91C_UDP_TXCOMP) );
pUdp->UDP_CSR[EP_IN] &= ~(AT91C_UDP_TXCOMP);
while (pUdp->UDP_CSR[EP_IN] & AT91C_UDP_TXCOMP);
Первая строчка - дожидаемся отправки предыдущих данных.
Вторая строчка - сбрасываем флаг отправки
Третья строчка - дожидаемся сброса этого флага (USB и проц работают на разных частотах, поэтому флаг сбрасывается "не сразу")
Ну или полный код отправки пакета (пакет может быть и больше размера конечной точки):
Код
uint AT91F_UDP_Write(AT91PS_HID pHid, const char *pData, uint length)
{
AT91PS_UDP pUdp = pHid->pUdp;
uint cpt = 0;
// Send the first packet
cpt = MIN(length, EP_IN_SIZE);
length -= cpt;
while (cpt--) pUdp->UDP_FDR[EP_IN] = *pData++;
pUdp->UDP_CSR[EP_IN] |= AT91C_UDP_TXPKTRDY;
while (length) {
// Fill the second bank
cpt = MIN(length, EP_IN_SIZE);
length -= cpt;
while (cpt--) pUdp->UDP_FDR[EP_IN] = *pData++;
// Wait for the the first bank to be sent
//while ( !(AT91S_UDP_EP[EP_IN].CSR & AT91C_UDP_TXCOMP))
while ( !(pUdp->UDP_CSR[EP_IN] & AT91C_UDP_TXCOMP) )
if ( !AT91F_UDP_IsConfigured(pHid) ) return length;
pUdp->UDP_CSR[EP_IN] &= ~(AT91C_UDP_TXCOMP);
//AT91S_UDP_EP[EP_IN].CSR &= ~(AT91C_UDP_TXCOMP);
while (pUdp->UDP_CSR[EP_IN] & AT91C_UDP_TXCOMP);
//while (AT91S_UDP_EP[EP_IN].CSR & AT91C_UDP_TXCOMP);
pUdp->UDP_CSR[EP_IN] |= AT91C_UDP_TXPKTRDY;
}
// Wait for the end of transfer
return length;
}
З.Ы. Выдрано откуда-то из примеров Atmel.