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) ;
и статус снова будет тем же