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

 
 
> SPI at91sam7s, как правильно выйти из прерывания?
SavageForest
сообщение Jul 8 2010, 04:59
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 2-12-09
Пользователь №: 54 010



есть проблема. SPI на выдачу работает нормально, но как только создаю прерывание по появлению данных в RDR регистре все зависает по окончанию выполнения функции, вектор которой прописан в регистре AIC_SVR для AT91C_ID_SPI c нулевым приоритетом.
по идее нужно указать точку окончания команды прерывания записав в AIC_EOICR соответствующий бит и сбросить команды прерывания записью бита в AIC_ICCR. вроде все сделал как описано в мануале, но один фиК после выполнения команды прерывания МК зависает и чегото там ждет, вот только чего???

код инициализации прерывания:
Код
AIC_ConfigureIT(AT91C_ID_SPI, 0, ISR_SPI);
*AT91C_SPI_IER  = AT91C_SPI_RDRF;
AIC_EnableIT(AT91C_ID_SPI);


код вызываемой функции:
CODE
void ISR_SPI(void)
{
unsigned int status;
// *AT91C_SPI_IDR = AT91C_SPI_RDRF;
status = dwSPITemp = (*AT91C_SPI_SR & 0xff);

if (((status & AT91C_SPI_RDRF) != 0))
{

dwSPITemp = *AT91C_SPI_RDR; // dwSPITemp (UINT32)

*AT91C_AIC_EOICR = 0xffffffff; // на всякий случай все регистры обнуляю
*AT91C_AIC_ICCR = 0xffffffff;

// AIC_ConfigureIT(AT91C_ID_SPI, 0, ISR_SPI);
// *AT91C_SPI_IER = AT91C_SPI_RDRF;
// AIC_EnableIT(AT91C_ID_SPI);
}
}


как видно, пробовал заново сконфигурировать прерывание и вырубать прерывание на момент выполнения функции. результат один - стопорится и все тут =(.
подскажите пожалуйста где ошибка и куда копать. может как новичок гдето делаю "глобальную" ошибку?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
DpInRock
сообщение Jul 20 2010, 12:53
Сообщение #2


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



__irq __arm void ISR_SPI(void)

Писать в EOICR надо.

Код
Vectors         LDR     PC,Reset_Addr        
                LDR     PC,Undef_Addr
                LDR     PC,SWI_Addr
                LDR     PC,PAbt_Addr
                LDR     PC,DAbt_Addr
                NOP                           ; Reserved Vector
;               LDR     PC,IRQ_Addr
                LDR     PC,[PC,#-0xF20]       ; Vector From AIC_IVR
;               LDR     PC,FIQ_Addr
                LDR     PC,[PC,#-0xF20]       ; Vector From AIC_FVRVectors


И не дай бог убирать закомментированное в стартапе.


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 04:39
Рейтинг@Mail.ru


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