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

 
 
> Работа USART при прерывании, не выставляется бит TXRDY
maug
сообщение May 23 2007, 02:40
Сообщение #1


Участник
*

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



Попробую кратко объяснить суть проблемы.
US1 настроен на прием пакета по TIMEOUT (по прерыванию)
Код
void init_usart1()
{
    *AT91C_PIOA_PDR = (1<<21)|   (1<<22);
     PMC_PCER = (0x1<<AT91C_ID_US1);

   US1_CR = AT91C_US_RSTRX |        
                   AT91C_US_RSTTX |        
                   AT91C_US_RXDIS |        
                   AT91C_US_TXDIS;  

     US1_MR = AT91C_US_USMODE_NORMAL |  
                     AT91C_US_CLKS_CLOCK    |  
                     AT91C_US_CHRL_8_BITS   |  
                     AT91C_US_PAR_NONE      |  
                     AT91C_US_NBSTOP_1_BIT;  

     US1_BRGR = (MCK/16/BAUD_RATE);                

     US1_CR = AT91C_US_RXEN  |   // Receiver Enable    
              AT91C_US_TXEN;           // Transmitter Enable

              
     *AT91C_US1_PTCR = AT91C_PDC_RXTEN;

     *AT91C_US1_RTOR = 0x04;  

                    
      AIC_SMR7 = AT91C_AIC_SRCTYPE_INT_EDGE_TRIGGERED | USART_INTERRUPT_LEVEL;
      AIC_SVR7 = (unsigned int) US1_CIrqHandler;
    
      US1_IDR = 0xFFFFFFFF;
      US1_IER =  AT91C_US_ENDRX |
                        AT91C_US_OVRE | AT91C_US_PARE | AT91C_US_FRAME |
                 AT91C_US_TIMEOUT;  

    

      US1_CR = AT91C_US_STTTO;

      *AT91C_US1_RPR = (unsigned int)Buf_RX;
      *AT91C_US1_RCR = len_Buf_RX;
    
     AIC_ICCR = (0x1 << AT91C_ID_US1);
     AIC_IECR = (0x1 << AT91C_ID_US1);
     AIC_ISCR = (0x1 << AT91C_ID_US1);
        
}


DBGU настроен на передачу пакета (без прерывания)

Код
void init_DBGU()
{
    
*AT91C_PIOA_PDR = (1<<9)|  
           (1<<10);

DBGU_CR=AT91C_US_RSTRX |
                  AT91C_US_RSTTX |
                  AT91C_US_RXDIS |
                  AT91C_US_TXDIS;

DBGU_MR =  AT91C_US_USMODE_NORMAL |  // Normal Mode
                    AT91C_US_CLKS_CLOCK    |  // Clock = MCK
                    AT91C_US_CHRL_8_BITS   |  // 8-bit Data  
                    AT91C_US_PAR_NONE      |  // No Parity  
                    AT91C_US_NBSTOP_1_BIT;    // 1 Stop Bit  

DBGU_BRGR = (MCK/16/BAUD_RATE_DBGU);                    // Baud Rate Divisor

DBGU_CR = AT91C_US_RXEN  |          // Receiver Enable    
                   AT91C_US_TXEN;           // Transmitter Enable


При возникновению прерывания по TIMEOUT в теле обработчика вызываю функцию передачи байта по DBGU.
Код
#pragma interrupt_handler US1_CIrqHandler
void US1_CIrqHandler(void)
{
  unsigned int  status;
  status = US1_CSR;

if (( status & AT91C_US_RXRDY)) {
   countTX=US1_RHR;
}

if (( status & AT91C_US_TIMEOUT)) {
  *AT91C_US1_RPR = (unsigned int)Buf_RX;
  *AT91C_US1_RCR = len_Buf_RX;
    US1_CR = AT91C_US_STTTO;
}


if (( status & AT91C_US_ENDRX)) {
    *AT91C_US1_RPR = (unsigned int)Buf_RX;
    *AT91C_US1_RCR = len_Buf_RX;
}

  Write_ByteDBGU(0x77);

   US1_CR = AT91C_US_RSTSTA;
   AIC_EOICR = status;
}


Ну и соответственно функция передачи байта
Код
int Write_ByteDBGU (char byte){
while (!(DBGU_SR & AT91C_US_TXRDY));
return (DBGU_THR = byte);                
}


В результате программа виснет как выяснилось не устанавливается бит TXRDY порта DBGU, т.е. как я понимаю порт просто не передает байт и соответственно не освобождает буфер.
Пробовал вызвать функцию Write_ByteDBGU() из прерывания TIMER0 та же история.
В чем причина понять не могу? Програмирую на ICCARM.

Сообщение отредактировал maug - May 23 2007, 02:41
Go to the top of the page
 
+Quote Post



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

 


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


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