Shuuura 0 21 декабря, 2005 Опубликовано 21 декабря, 2005 · Жалоба Пытаюсь переделать образец с AT91.com для работы через прерывания. В половине случаев при старте возникает Spurious Interrupt. Есть предположение что как-то неправильно включаю превывание от endpoint0. Посмотрите, может кто сталкивался void UDP_interrupt() { AT91_REG isr = pUDP->UDP_ISR; isr &= pUDP->UDP_IMR; if (isr & AT91C_UDP_ENDBUSRES) { pUDP->UDP_ICR = AT91C_UDP_ENDBUSRES; // reset all endpoints AT91C_BASE_UDP->UDP_RSTEP = (unsigned int)-1; AT91C_BASE_UDP->UDP_RSTEP = 0; // Enable the function pUDP->UDP_FADDR = AT91C_UDP_FEN; //__disable_interrupt(); AT91C_BASE_UDP->UDP_CSR[0] = (AT91C_UDP_EPEDS | AT91C_UDP_EPTYPE_CTRL); AT91C_BASE_UDP->UDP_IER = (AT91C_UDP_EPINT0); // __enable_interrupt(); } if (isr & AT91C_UDP_EPINT0) { pUDP->UDP_ICR = AT91C_UDP_EPINT0; AT91F_CDC_Enumerate(); } }; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VslavX 0 21 декабря, 2005 Опубликовано 21 декабря, 2005 · Жалоба Пытаюсь переделать образец с AT91.com для работы через прерывания. В половине случаев при старте возникает Spurious Interrupt. Есть предположение что как-то неправильно включаю превывание от endpoint0. Посмотрите, может кто сталкивался void UDP_interrupt() { AT91_REG isr = pUDP->UDP_ISR; isr &= pUDP->UDP_IMR; if (isr & AT91C_UDP_ENDBUSRES) { Помнится в UDP_IMR нету битика AT91C_UDP_ENDBUSRES - сброс шины событие немаскируемое. Соответственно, Ваш обработчик после 'isr & pUDP->UDP_IMR' событие сброса не видит -> ложное прерывание. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Shuuura 0 22 декабря, 2005 Опубликовано 22 декабря, 2005 · Жалоба Разобрался, может кому интересно: В образеце не сбрасывался флаг AT91C_UDP_RX_DATA_BK0, поэтому прерывание генерилось постоянно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться