Цитата(Bulat @ Dec 29 2007, 10:06)

Как правильно воспользоваться этой стандартной прошивкой, чтобы считывать и записывать данные в конечные точки? Может я свой код не туда добавил, вроде кроме как в AT91F_UDP_IsConfigured(AT91PS_CDC pCdc) и некуда, она же прерывания обрабатывает или я не прав?
AT91F_UDP_IsConfigured не обрабатывает прерывания.
Сконфигурируйте в main прерывания от EP0, что то типа этого:
if (HID.IsConfigured(&HID)) {
HID.pUdp->UDP_ICR = 0xff00;
AT91F_UDP_DisableIt ( HID.pUdp, 0xFFFF);
AT91F_UDP_EnableIt ( HID.pUdp, AT91C_UDP_EPINT2);
AT91F_AIC_ConfigureIt ( AT91C_BASE_AIC, AT91C_ID_UDP, UDP_INTERRUPT_LEVEL,AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE, udp_c_irq_handler);
AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_UDP);}
Обработка прерывания:
__ramfunc __arm void udp_c_irq_handler(void){
AT91PS_UDP pUdp = HID.pUdp;
u_int packetSize, nbBytesRcv = 0, currentReceiveBank = HID.currentRcvBank;
pUdp->UDP_CSR[AT91C_EP_OUT] &= ~(AT91C_UDP_TXCOMP | AT91C_UDP_RXSETUP | AT91C_UDP_ISOERROR );
while (length_in) {
if ( pUdp->UDP_CSR[AT91C_EP_OUT] & (AT91C_UDP_RX_DATA_BK0 | AT91C_UDP_RX_DATA_BK1) ) {
packetSize = MIN(pUdp->UDP_CSR[AT91C_EP_OUT] >> 16, length_in);
length_in -= packetSize;
if (packetSize < AT91C_EP_OUT_SIZE)
length_in = 0;
while(packetSize--)
data_in[nbBytesRcv++] = pUdp->UDP_FDR[AT91C_EP_OUT];
pUdp->UDP_CSR[AT91C_EP_OUT] &= ~(currentReceiveBank);
if (currentReceiveBank == AT91C_UDP_RX_DATA_BK0)
currentReceiveBank = AT91C_UDP_RX_DATA_BK1;
else
currentReceiveBank = AT91C_UDP_RX_DATA_BK0;
}
}
// Write_ack(); //Если надо.
HID.currentRcvBank = currentReceiveBank;
}