реклама на сайте
подробности

 
 
> Есть примеры работы с прерываниями от USB на AT91?
ivstech
сообщение Jan 30 2007, 09:45
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 204
Регистрация: 5-01-06
Пользователь №: 12 860



сабж
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 4)
Dron_Gus
сообщение Jan 30 2007, 18:07
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 202
Регистрация: 9-01-05
Из: Санкт-Петербург
Пользователь №: 1 861



Код
void AT91F_USB_SetInt(void)
{
//Init interupt
AT91F_AIC_ConfigureIt (AT91C_BASE_AIC, AT91C_ID_UDP, UDP_INTERRUPT_LEVEL, AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL, UDP_IRQ_Handler);
AT91F_UDP_DisableIt (AT91C_BASE_UDP, AT91C_UDP_SOFINT);
AT91F_UDP_InterruptClearRegister (AT91C_BASE_UDP, 0xFFFFFFFF);
AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_UDP);
}




Код
void UDP_IRQ_Handler(void)
{
AT91PS_UDP pUDP = AT91C_BASE_UDP;
AT91_REG isr = pUDP->UDP_ISR;
AT91F_DBGU_Printk ("UDP_int\n\r");
        
if (isr & AT91C_UDP_ENDBUSRES)
  {
  AT91F_UDP_InterruptClearRegister (AT91C_BASE_UDP, AT91C_UDP_ENDBUSRES);
                // reset configuration
                (&USB)->currentConfiguration = 0;
  // reset all endpoints
  pUDP->UDP_RSTEP  = (unsigned int) -1;
  pUDP->UDP_RSTEP  = 0;
  // Enable the function
  pUDP->UDP_FADDR = AT91C_UDP_FEN;
  // Configure endpoint 0
  pUDP->UDP_CSR[0] = (AT91C_UDP_EPEDS | AT91C_UDP_EPTYPE_CTRL);
  // Enable Int endpoint 0
  AT91F_UDP_EnableIt (AT91C_BASE_UDP, AT91C_UDP_EPINT0);
  AT91F_DBGU_Printk(" -Bus reset\n\r");
  }
if (isr & AT91C_UDP_RXSUSP)
  {
  AT91F_UDP_InterruptClearRegister (AT91C_BASE_UDP, AT91C_UDP_RXSUSP);
  AT91F_DBGU_Printk(" -Suspend int\n\r");
  }
if (isr & AT91C_UDP_RXRSM)
  {
  AT91F_UDP_InterruptClearRegister (AT91C_BASE_UDP, AT91C_UDP_RXRSM);
  AT91F_DBGU_Printk(" -Resume int\n\r");
  }
if (isr & AT91C_UDP_EXTRSM)
  {
  AT91F_UDP_InterruptClearRegister (AT91C_BASE_UDP, AT91C_UDP_EXTRSM);
  AT91F_DBGU_Printk(" -External resume int\n\r");
  }
if (isr & AT91C_UDP_SOFINT)
  {
  AT91F_UDP_InterruptClearRegister (AT91C_BASE_UDP, AT91C_UDP_SOFINT);
  AT91F_DBGU_Printk(" -Start of frame int\n\r");
  }
if (isr & AT91C_UDP_WAKEUP)
  {
  AT91F_UDP_InterruptClearRegister (AT91C_BASE_UDP, AT91C_UDP_WAKEUP);
  AT91F_DBGU_Printk(" -External resume int\n\r");
  }    
if (isr & AT91C_UDP_EPINT0)
  {
  AT91F_DBGU_Printk (" -EP0 Int!\n\r");
  AT91F_UDP_EP0_Int();
  AT91F_UDP_InterruptClearRegister (AT91C_BASE_UDP, AT91C_UDP_EPINT0);
  }
if (isr & AT91C_UDP_EPINT1)
  {    
  AT91F_DBGU_Printk (" -EP1 Int!\n\r");
  AT91F_UDP_EP1_Int();
  AT91F_UDP_InterruptClearRegister (AT91C_BASE_UDP, AT91C_UDP_EPINT1);
  }
if (isr & AT91C_UDP_EPINT2)
  {    
  AT91F_DBGU_Printk (" -EP2 Int!\n\r");
  AT91F_UDP_EP2_Int();
  AT91F_UDP_InterruptClearRegister (AT91C_BASE_UDP, AT91C_UDP_EPINT2);
  }  
}




Код
void AT91F_UDP_EP0_Int(void)
{
AT91PS_UDP pUDP = AT91C_BASE_UDP;
AT91_REG CSR0 = pUDP->UDP_CSR[0];

if (CSR0 & AT91C_UDP_TXCOMP)
  {
  AT91F_DBGU_Printk ("  -IN transaction acknoledged\n\r");
  UDP_EP_ClrFlag(AT91C_BASE_UDP, 0, AT91C_UDP_TXCOMP)
  AT91S_UDP_EP[0].Ready=1;;
  }
if (CSR0 & AT91C_UDP_RX_DATA_BK0)
  {
  AT91F_DBGU_Printk ("  -BANK0 recived packed\n\r");
  UDP_EP_ClrFlag(AT91C_BASE_UDP, 0, AT91C_UDP_RX_DATA_BK0);
  }
if (CSR0 & AT91C_UDP_RXSETUP)
  {
  AT91F_DBGU_Printk ("  -Setup packed recived\n\r");
  AT91F_USB_Enumerate(&USB);
  //UDP_EP_ClrFlag(AT91C_BASE_UDP, 0, AT91C_UDP_RXSETUP);
  }
if (CSR0 & AT91C_UDP_ISOERROR)
  {
  //AT91F_DBGU_Printk ("  -CRC error in esochronous transfer\n\r");
  AT91F_DBGU_Printk ("  -Host sends STALL\n\r");
  UDP_EP_ClrFlag(AT91C_BASE_UDP, 0, AT91C_UDP_ISOERROR);
  }
if (CSR0 & AT91C_UDP_RX_DATA_BK1)
  {
  AT91F_DBGU_Printk ("  -BANK1 recived packed\n\r");
  UDP_EP_ClrFlag(AT91C_BASE_UDP, 0, AT91C_UDP_RX_DATA_BK1);
  }
}




Например так. У меня работает. smile.gif


--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
Go to the top of the page
 
+Quote Post
skn
сообщение Jan 30 2007, 19:50
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 31
Регистрация: 20-03-06
Пользователь №: 15 416



Брал за основу пример от freertos.org
Go to the top of the page
 
+Quote Post
nameless
сообщение Apr 13 2007, 16:08
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 174
Регистрация: 9-07-04
Пользователь №: 305



Цитата(Dron_Gus @ Jan 30 2007, 18:07) *
Код
void AT91F_USB_SetInt(void)
{
//Init interupt
AT91F_AIC_ConfigureIt (AT91C_BASE_AIC, AT91C_ID_UDP, UDP_INTERRUPT_LEVEL, AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL, UDP_IRQ_Handler);
AT91F_UDP_DisableIt (AT91C_BASE_UDP, AT91C_UDP_SOFINT);
AT91F_UDP_InterruptClearRegister (AT91C_BASE_UDP, 0xFFFFFFFF);
AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_UDP);
}





Например так. У меня работает. smile.gif


Покажите дураку (мне) где здесь UDP_IER прописывается ?

Нет ли примеров USBasic для чайников ?
Go to the top of the page
 
+Quote Post
Dron_Gus
сообщение Apr 13 2007, 22:11
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 202
Регистрация: 9-01-05
Из: Санкт-Петербург
Пользователь №: 1 861



А он и не прописывается. Прерывание от BUS RESET не маскируется, поэтому и разрешать его не надо. Все остальные прерывания разрешаются после события BUS RESET.


--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 15:30
Рейтинг@Mail.ru


Страница сгенерированна за 0.01481 секунд с 7
ELECTRONIX ©2004-2016