Цитата(Dron_Gus @ Jan 30 2007, 21:56)

Функция обработки прерывания случаем не с __irq задана?
и AIC_EOICR случаем не пишете по завершению?
Спасибо, Dron_Gus
нет
AIC_EOICR - даже не знаю, что это такое, посмотрю
Вот этот код я поставил после End_Of_Bus_Reset (т.к. в форуме я видел след. высказывание, автора не помню)
А теперь я также взялся переделывать обработку событий под прерывания. Кстати, наткнулся на забавный момент: после обработки прерывания по событию End_Of_Bus_Reset, регистр маски прерываний UDP_IMR сбрасывается в исходное состояние. Вероятно, это баг, но о нём господа из Atmel решили умолчать. Или выдать за фичу. Позднее
Вот мой код:
AT91F_UDP_DisableIt (AT91C_BASE_UDP, ~AT91C_UDP_EPINT1);
AT91F_AIC_ConfigureIt( AT91C_BASE_AIC, AT91C_ID_UDP, 0x07, AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL, &UDP_c_irq_handler);
AT91F_UDP_DisableIt (AT91C_BASE_UDP, ~AT91C_UDP_EPINT1);
AT91F_UDP_EnableIt (AT91C_BASE_UDP, AT91C_UDP_EPINT1);
AT91F_AIC_EnableIt(AT91C_BASE_AIC, AT91C_ID_UDP);
сама процедура
__ramfunc __arm void UDP_c_irq_handler(void)
{
AT91PS_UDP pUdp = AT91C_BASE_UDP;
int packetSize;
if ( pUdp->UDP_CSR[AT91C_EP_OUT] & currentReceiveBank ) {
packetSize = pUdp->UDP_CSR[AT91C_EP_OUT] >> 16;
while(packetSize--)
push_rx_buf(&usb_buf, 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;
}
AT91C_BASE_UDP->UDP_ICR=AT91C_UDP_EPINT1; // или 0xFFFFFFFF;
}
Да, если обрабатывать все прерывания, то маскировать ничего не надо. Я хотел использовать их только для ENDPOINT1, т.к. мое CDC устройство данные в основном принимает и проверить, как изменится скорость.