Евгений_222
Jun 22 2007, 08:13
Проблема такая , нужно отсылать\принимать данные по SSC через определенный интервал, для осчета интервалов использую интервальный таймер, инициализация следующая:
для SSC -
void SSC_Init (void) {
AT91PS_SSC pSSC = AT91C_BASE_SSC;
//* Configure PIO controllers to periph mode
AT91F_SSC_CfgPIO ();
// Enable the clock
AT91F_PMC_EnablePeriphClock(AT91C_BASE_PMC, 1<<AT91C_ID_SSC);
// SSC Configure
AT91F_SSC_Configure(pSSC, MCK,SSC_BaudRate,SSC_clock_rx,SSC_mode_rx,SSC_clock_tx,SSC_mode_tx);
// Enable SSC
AT91F_SSC_EnableIt (pSSC,AT91C_SSC_RXRDY|AT91C_SSC_ENDTX);
//Set Usart IRQ Handler
AT91F_AIC_ConfigureIt(AT91C_BASE_AIC,AT91C_ID_SSC,AT91C_AIC_PRIOR_HIGHEST,
AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL,SSC_IRQ_Handler);
//Interrupt Sources
//pSSC->SSC_PTCR = (AT91C_SSC_RXEN|AT91C_SSC_TXEN);
AT91F_AIC_EnableIt(AT91C_BASE_AIC,AT91C_ID_SSC);
//pSSC->SSC_CR =AT91C_SSC_TXDIS;
}
для PIT-
void InitSysTimer(void)
{
AT91PS_PITC pPITC = AT91C_BASE_PITC;
unsigned int mask;
AT91F_PITC_CfgPMC ();
AT91F_PITInit (pPITC,2000,MCK/16);
AT91C_BASE_AIC->AIC_EOICR = 0x0;
AT91F_AIC_ConfigureIt (AT91C_BASE_AIC, //base adr
AT91C_ID_SYS, //int number
AT91C_AIC_PRIOR_HIGHEST, //priority
AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE, //int source type
ih_fromPIT //handler
);
AT91F_AIC_Trig (AT91C_BASE_AIC,AT91C_ID_SYS);
AT91F_AIC_EnableIt(AT91C_BASE_AIC,AT91C_ID_SYS);
AT91F_PITEnableInt (pPITC);
mask = AT91F_PITGetPIVR (pPITC);
mask=mask;
}
по отдельности прерывания обрабатываются нормально, вместе либо от одного либо от другого смотря что первым настраивается.
Кучу времени уже убил, не могу разобраться.
Помогите плззз.
Да забыл использую AT91SAM7S64 компилятор IAR
SpiritDance
Jun 22 2007, 08:18
Трудно понять в чем проблема только по инциализации.
А приоритеты разные прерываниям ставить не пробовали?
Евгений_222
Jun 22 2007, 09:15
Похоже дело в обработчике прерывания на SSC, он срабатывает 2 раза и зацикливается, похоже не выходит из обработчика
void SSC_IRQ_Handler(void)
{
AT91PS_SSC pSSC=AT91C_BASE_SSC;
unsigned int status,mask;
mask = pSSC->SSC_IMR;
status=pSSC->SSC_SR;
if (status&AT91C_SSC_ENDTX) {
//--------------
}
if (status&AT91C_SSC_RXRDY) {
//-----------------------
}
}
Без прерывания данные передаются и принимаются нормально
Похоже дело в обработчике прерывания на SSC, он срабатывает 2 раза и зацикливается, похоже не выходит из обработчика
void SSC_IRQ_Handler(void)
{
AT91PS_SSC pSSC=AT91C_BASE_SSC;
unsigned int status,mask;
mask = pSSC->SSC_IMR;
status=pSSC->SSC_SR;
if (status&AT91C_SSC_ENDTX) {
//--------------
}
if (status&AT91C_SSC_RXRDY) {
//-----------------------
}
}
Без прерывания данные передаются и принимаются нормально
AlexBoy
Jun 22 2007, 12:09
Цитата(Евгений_222 @ Jun 22 2007, 12:15)

Похоже дело в обработчике прерывания на SSC, он срабатывает 2 раза и зацикливается, похоже не выходит из обработчика
...
Без прерывания данные передаются и принимаются нормально
А контроллеру прерываний говоришь что прерывание закончено?
*AT91C_AIC_EOICR = 0; // Признак завершения обработчика
это должно быть в конце каждого хандлера.
SpiritDance
Jun 25 2007, 07:42
Это как раз должно быть в общем хандлере в стартапе судя по всему.
А если общего обработчика нет, функции обработчиков должны быть описаны как прерывания.
Евгений_222
Jun 26 2007, 03:43
Как я понимаю функция
AT91F_AIC_ConfigureIt(AT91C_BASE_AIC,AT91C_ID_SSC,8,
AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL,SSC_IRQ_Handler);
указывает handler для каждого прерывания.
Каждый обработчик прерывания у меня заканчивается записью
AT91C_BASE_AIC->AIC_EOICR =0;
(в одном забыл но сейчас исправил).
И все равно работать не хотят.
Виснет когда при инициализации SSC включаю функцию
AT91F_AIC_EnableIt(AT91C_BASE_AIC,AT91C_ID_SSC);
без нее нормально только прерывания не срабатывают.
strannyi
Aug 1 2007, 07:03
Аналогичная проблема.
Приходится по окончании обработчика прерывания сбрасывать SSC
Мож кто нить знает как решить проблему?
Dron_Gus
Aug 1 2007, 21:10
Цитата(Евгений_222 @ Jun 26 2007, 07:43)

Каждый обработчик прерывания у меня заканчивается записью
AT91C_BASE_AIC->AIC_EOICR =0;
Как уже сказал
SpiritDance все зависит от общего хандлера. Если у Вас и там и там запись в AT91C_BASE_AIC->AIC_EOICR, то могут быть проблемы.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.