Цитата(aaarrr @ Dec 12 2007, 17:44)

Хоть бы написали, что Вы видите в UDP_ISR. Прерываний от EP2 быть не должно.
Выложите исходник, тогда можно будет что-то посоветовать.
Часть кода, отвечающая за инициализацию UDP (USB_ini()) и программа обработки прерываний от UDP (irq_USB()). Прверял, что прерывание возникло именно от ep2 таким образом: к выводам контроллерам прицепил светодиоды, а программу - "мигалку" вставлял после условий if, определяющих чему равен UDP_ISR.
Код
//Программа обработки прерывания от USB-модуля
unsigned int irq_USB()
{
int sio;//источник прерывания (ep0,1,2)
sio=regUDP->UDP_ISR&0x7;
if(sio==0x1){enumer();}//если прерывание возникло от ep0
else {
if(sio==0x2) //если прерывание возникло от ep1
{
if(rt==0)//начальная посылка от хоста(рег. режима и ком. слова)
{
read_FIFO();
rt++;
}
else { //передача данных от хоста устройству
read_FIFO();
if(rt==12) //если принято все 12 пакетов с данными, то
//необходимо начать передачу данных ОУ
{
trans_RT();//передача данных ОУ
}
rt++; //подсчитываем количество пакетов с данными от хоста,
//их д.б. 12 по количеству подадресов ОУ
}
if(TMode<=8) {Mmode = 1;}
Mmode=TMode;
switch (mode)
{
case 1: rec_RT(); break; //прием данных от ОУ
case 256: MT(); break; //Монитор
default: break;
}
}
else {regUDP->UDP_CSR[2]=0; ct=0;}//если прерывание возникло от ep2
//- подтвержение, что хост принял данные
}
return(0);
}
//------------------------------------------------------------------------------
//Инициализация UDP
void USB_ini()
{
AT91C_BASE_AIC->AIC_IECR |= (1<<AT91C_ID_UDP);
regUDP->UDP_IER=0x7;//разрешение прерывания от EP0...EP2
regUDP->UDP_TXVC=0x0;//разрешение работы трансивера UDP
regUDP->UDP_CSR[0]=regUDP->UDP_CSR[0]&0x8000;//ep0 - control,on,DIR=0(in)
regUDP->UDP_CSR[1]=regUDP->UDP_CSR[1]&0x8200;//ep1 - bulk in,on
regUDP->UDP_CSR[2]=regUDP->UDP_CSR[2]&0x8600;//ep2 - bulk out,on
AT91C_BASE_AIC->AIC_SVR[AT91C_ID_UDP] = (unsigned int)irq_USB();//Запись адр. ф-ии обр. прерыв.
//от USB
}
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
void main()
{
clock_ini();
PIO_ini();
rt=0;
ct=0;
USB_ini();
while(1){} //ожидание прерывания от USB-модуля
}