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

 
 
> 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
Ответов
aaarrr
сообщение Jul 8 2010, 08:37
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(SavageForest @ Jul 8 2010, 08:59) *
подскажите пожалуйста где ошибка и куда копать. может как новичок гдето делаю "глобальную" ошибку?

Что прописано в стартапе (вектор прерывания, "обертки")?
Go to the top of the page
 
+Quote Post
SavageForest
сообщение Jul 12 2010, 04:25
Сообщение #3


Участник
*

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



Цитата(aaarrr @ Jul 8 2010, 12:37) *
Что прописано в стартапе (вектор прерывания, "обертки")?

там стандартный атмеловский код из примеров:
CODE
void AIC_ConfigureIT(
unsigned int source,
unsigned int mode,
void (*handler)(void))
{
// Disable the interrupt first
AT91C_BASE_AIC->AIC_IDCR = 1 << source;

// Configure mode and handler
AT91C_BASE_AIC->AIC_SMR[source] = mode;
AT91C_BASE_AIC->AIC_SVR[source] = (unsigned int) handler;

// Clear interrupt
AT91C_BASE_AIC->AIC_ICCR = 1 << source;
}

ничего нового я туда не придумывал, да и не вижу особой надобности... может конечно и ошибаюсь.
возможно у SPI по умолчанию отключено прерывание на прием при установке режима "Мастер"?
но с другой стороны, если мастер не получил данных(т.е. в RDR все нули), то и прерывания не будет. не так-ли?

среда: Кейл 4, RTX-либы, атмеловские примеры.
Go to the top of the page
 
+Quote Post



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

 


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


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