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

 
 
 
Reply to this topicStart new topic
> AT91: прерывания от UDP, использование маски
ivstech
сообщение Jan 29 2007, 06:42
Сообщение #1


Местный
***

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



Разрешаю в IMR прерывание только от конечной точки 1, все остальные запрещаю (проверяю установки просмотром регистров в среде IAR). Почему-то срабатывает и от ENDPOINT0 тоже. Из-за чего такое может быть?
Go to the top of the page
 
+Quote Post
Dron_Gus
сообщение Jan 30 2007, 18:56
Сообщение #2


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

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



Функция обработки прерывания случаем не с __irq задана?

и AIC_EOICR случаем не пишете по завершению?


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


Местный
***

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



Цитата(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 устройство данные в основном принимает и проверить, как изменится скорость.
Go to the top of the page
 
+Quote Post
Dron_Gus
сообщение Jan 30 2007, 21:10
Сообщение #4


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

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



Цитата(ivstech @ Jan 30 2007, 20:12) *
Вот мой код:
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);




Судя по pdf первым делом надо проинициализировать AIC. (пункт 35.3.3)



И для синхронизации лучше использовать примерно такие макросы

Код


#define UDP_EP_ClrFlag(AT91PS_UDP, endpoint, flags) { \
  while (AT91PS_UDP->UDP_CSR[endpoint] & (flags)) \
   AT91PS_UDP->UDP_CSR[endpoint] &= ~(flags); \
  }

#define UDP_EP_SetFlag(AT91PS_UDP, endpoint, flags) { \
  while ((AT91PS_UDP->UDP_CSR[endpoint] & (flags)) != (flags)) \
   AT91PS_UDP->UDP_CSR[endpoint] |= flags; \
  }


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

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

 


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


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