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

 
 
> Прерывания USART
Daermon
сообщение Nov 16 2007, 06:22
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 36
Регистрация: 26-10-07
Пользователь №: 31 739



AT91rm9200 AS-9200
IAR4.42


Разрешил прерывания RXBUFF и ENDRX.
На шине тишина, а прерывания эти срабатывают! В чем может быть дело?


//== Обработчик прерываний
static __arm __irq void IRQ1_RS232()
{
unsigned int status;
unsigned int status1;
//----------------------------------
AT91C_BASE_AIC->AIC_IVR = 0 ; /* enter interrupt in protected mode */
DBGU.PrintString("\n\rINTERUPT_USART1\n\r");

status = (AT91C_BASE_US1->US_CSR) ;
status1 = (AT91C_BASE_US1->US_IMR);
status &=status1;
//
//* Disable all interrupts
// AT91C_BASE_US1->US_IDR = (0xFFFFFFFF);

if( status & AT91C_US_TXEMPTY ){DBGU.PrintString("\n\rAT91C_US_TXEMPTY\n\r");}
if( status & AT91C_US_RXBUFF )
{
RxBuffer[count++] = AT91F_US_GetChar(AT91C_BASE_US1);
if(count==5)
{
count=0;
for(int i=0;i<10;i++)
RxBuffer[i]=0;
}
DBGU.PrintString("\n\rAT91C_US_RXBUFF\n\r");
}
if( status & AT91C_US_TXBUFE ){DBGU.PrintString("\n\rAT91C_US_TXBUFE\n\r");}
if( status & AT91C_US_TIMEOUT ){DBGU.PrintString("\n\rAT91C_US_TIMEOUT\n\r");}
if( status & AT91C_US_ENDTX ){DBGU.PrintString("\n\rAT91C_US_ENDTX\n\r");}
if( status & AT91C_US_ENDRX )
{
RxBuffer[count++] = AT91F_US_GetChar(AT91C_BASE_US1);
if(count==5)
{
count=0;
for(int i=0;i<10;i++)
RxBuffer[i]=0;
}
}
if( status & AT91C_US_ITERATION ){;}
if( status & AT91C_US_NACK ){;}
if( status & AT91C_US_RIIC ){;}
if( status & AT91C_US_DSRIC ){;}
if( status & AT91C_US_DCDIC ){;}
if( status & AT91C_US_CTSIC ){;}
AT91C_BASE_US1->US_CR = AT91C_US_RSTSTA;
AT91C_BASE_AIC->AIC_EOICR = 0 ; /* unstack one level */
}

status = (AT91C_BASE_US1->US_CSR) ;
Эта операция не чистит статус рег.
можно опять вызвать
status = (AT91C_BASE_US1->US_CSR) ;
и статус снова будет тем же
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Daermon
сообщение Nov 16 2007, 12:29
Сообщение #2


Участник
*

Группа: Новичок
Сообщений: 36
Регистрация: 26-10-07
Пользователь №: 31 739



Не индексирую массив потому что просто хочу перезаписать старые значения новыми. масив char RxBuffer [250];

я так понимаю что вызовом AT91F_US_ReceiveFrame (AT91C_BASE_US1,RxBuffer,5, 0,0 );
я инизиализирую прием в адрес RxBuffer пяти байт. Но почему то этого не происходит...

может нужно очистить PDC но как это сделать простая перейинициализация не помагает...


А как без прерываний сделать чтение через PDC ?

inline void AT91F_US_ResetRx (
AT91PS_USART pUSART) // \arg pointer to a USART controller
{
//* Reset receiver
pUSART->US_CR = AT91C_US_RSTRX;
//* Re-Enable receiver
pUSART->US_CR = AT91C_US_RXEN;
}


делаю резет перед AT91F_US_ReceiveFrame (AT91C_BASE_US1,RxBuffer,5, 0,0 );

И все работает smile.gif))

Сообщение отредактировал Daermon - Nov 16 2007, 12:09
Go to the top of the page
 
+Quote Post
VSt&
сообщение Nov 16 2007, 17:50
Сообщение #3


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

Группа: Свой
Сообщений: 101
Регистрация: 3-08-06
Из: Екатеринбург
Пользователь №: 19 275



алгоритм работы с последовательной периферией посредством DMA:
1) при инициализации периферии обнуляем все указатели и счетчики PDC, выключаем обмен TXTDIS, RXTDIS
2) в приложении, для того, чтобы принять блок данных, выполняем следующую последовательность действий:
2.1) устанавливаем указатель(и) и счетчик(и) PDC на некоторую заранее определенную область памяти, память должна быть некешируемой
2.2) включаем нужные прерывания - ENDRX, ENDTX, RXBUFF, TXBUFE и др. - в IMR (AIC сконфигурирован заранее)
2.3) разрешаем обмен TXTEN, RXTEN
2.4) занимаемся далее своими делами, ожидая прерывания
3) хендлер прерывания выключает обмен, при необходимости устанавливает новые указатели и счетчики, и снова разрешает обмен - либо играет глобальными флагами( sad.gif )


вроде ничего не напутал
p.s. не увлекайтесь иаровскими макросами - в первый раз лучше написать лично с указанием регистров и битов
Go to the top of the page
 
+Quote Post



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

 


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


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