This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

My usart interrupt occure only one time!!

Hi.
who can help me !!
my interrupt occure only one time. I dont know why?? can any body help me why my program dosent work correctly?
my startup is SAM7.s

thise is my code:

#include "at91sam7x256.h"
#include "lib_at91sam7x256.h"
#include "delay.h"
void Usart0IrqHandler(void);
int kk=70;

int main (void)
{

           volatile AT91PS_USART pUSART0 = AT91C_BASE_US0;
           int rx;
           unsigned int rxok;
           int errorcounter;


        *AT91C_PMC_PCER=0xC0000040;             //Peripheral Clock Enable
        *AT91C_PIOA_ASR=0X0000003;
        *AT91C_PIOA_BSR=0X0000000;
        *AT91C_PIOA_PDR=0x00000003;             //Disable I/O,PA5=RXD0,PA6=TXD0
        *AT91C_US0_IDR =0xFFFFFFFF;                             //ALL OFF USART INTERRUPT DISABLE
        *AT91C_US0_CR=0x000000AC;                               //RESET RX & TX
        *AT91C_US0_BRGR=0x139;                                  //BARD RATE:9600
        *AT91C_US0_TTGR=0x00000100;                         //SET TIME GARD=0

        AT91F_PDC_Open(AT91C_BASE_PDC_US0);
        *AT91C_US0_MR=0X8C0;                             //8bit,No,1Bit Stop,Asaynchron mode
        *AT91C_US0_CR=0x50;                                     //ENABLE RX & ENABLE tx
        *AT91C_US0_IER =0x01;               //rxbufer full interrupt is set
        *AT91C_AIC_IDCR=0x40;                           //DISABLE THE INTERRUOT ON THE INTERRUPT CONTROLLER
     AT91C_AIC_SVR[AT91C_ID_US0] = (unsigned int)Usart0IrqHandler; // Set the USART0 IRQ handler address in AIC
         AT91C_AIC_SMR[AT91C_ID_US0] =(0x00000007);
        *AT91C_AIC_IECR=0x40;
        *AT91C_AIC_FFDR=0XFFFFFFFF;
        while(1){
    *AT91C_US0_CR=0x100;
         rxok=*AT91C_US0_CSR;

        *AT91C_US0_IER =0x4;
        while(rxok==0x1a1b){
         rxok=*AT91C_US0_CSR;
     delay_ms(10);
         errorcounter=errorcounter+1;
         if (errorcounter==100)
           {
           *AT91C_US0_CR=0xc;                     // resettx/resetrx
           errorcounter=0;
           }
          }

  }
 return 0;
 }
 void Usart0IrqHandler(void){

        int rx;
        int i;
        volatile AT91PS_AIC pAIC = AT91C_BASE_AIC;


        unsigned int rxok;
        int errorcounter;
        errorcounter=0;

        kk=kk+1;
        rxok=*AT91C_US0_CSR;
        if (rxok && 0x1){
         rx=(*AT91C_US0_RHR & 0xff);
         *AT91C_US0_THR=kk;//rx&0xff;
        }
        else
         while(rxok==0x1a1b){
         rxok=*AT91C_US0_CSR;
     delay_ms(10);
         errorcounter=errorcounter+1;
         if (errorcounter==1000)
           {
           *AT91C_US0_CR=0xc;                     // resettx/resetrx
           errorcounter=0;
           }
         };

        *AT91C_US0_CR=0x2100;
        *AT91C_US0_IDR =0x4;
         rxok=*AT91C_US0_CSR;

        *AT91C_AIC_EOICR =0x00;


        return;
 }