CAN-Interrupt AT91SAM7

Gast #3012150
Lesenswert?

Hallo zusammen,
Ich habe eine dumme Frage für die Realisierung eines CAN-Interrupts

Ich benutze AT91sam7x mit Eclipse, yagarto, OpenOCD.
ich glaube dass die Initialisierung bei mir Stimmt, aber beim debugen 
stelle ich fest das der CAN_IMR Register leer bleibt also es wird kein 
Interrupt gelöst.



Code:


void can_protocol_init()
{
  //enable Pins
  AT91C_BASE_PIOA->PIO_ASR = AT91C_PA19_CANRX|AT91C_PA20_CANTX;
  AT91C_BASE_PIOA->PIO_PDR = AT91C_PA19_CANRX|AT91C_PA20_CANTX;
  //enable Clock
  AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_CAN;
  //init AIC-CAN
  AT91C_BASE_AIC->AIC_IDCR = 1 << AT91C_ID_CAN;

  //set baudrate
  AT91C_BASE_CAN->CAN_BR = CAN_BR_250K;


  //disable Reception Mailbox 0-7 interrupt
  AT91C_BASE_CAN->CAN_IDR = AT91C_CAN_MB0 | AT91C_CAN_MB1 | 
AT91C_CAN_MB2 | AT91C_CAN_MB3
      | AT91C_CAN_MB4 | AT91C_CAN_MB5 | AT91C_CAN_MB6 | AT91C_CAN_MB7;
  AT91C_BASE_AIC->AIC_SMR[AT91C_ID_CAN] = 0x7;      //set prior
  AT91C_BASE_AIC->AIC_SVR[AT91C_ID_CAN] = (unsigned int) 
can_interrupt_handler;
  AT91C_BASE_AIC->AIC_ICCR = 1 << AT91C_ID_CAN;// Clear Interrupt
  AT91C_BASE_AIC->AIC_IECR = 1 << AT91C_ID_CAN;//Enable Interrupt

  // Enable Reception Mailbox 1-5 interrupt
  AT91C_BASE_CAN->CAN_IER = AT91C_CAN_MB1

  //Configure MB1 for reception
  AT91C_BASE_CAN_MB1->CAN_MB_MMR    = AT91C_CAN_MOT_RXOVERWRITE;
  AT91C_BASE_CAN_MB1->CAN_MB_MAM    = MB1_RX_MSK << 18;   //reset 
acceptance
  AT91C_BASE_CAN_MB1->CAN_MB_MID    = MB1_RX_ID << 18;   //reset filter


  // Clears the MRDY Signal
    AT91C_BASE_CAN->CAN_MB1.CAN_MB_MCR = AT91C_CAN_MTCR;

    // Enable CAN in "Listen Only" mode
    AT91C_BASE_CAN->CAN_MR = AT91C_CAN_ABM | AT91C_CAN_CANEN;
    //Wait for Wakeup Flag (11 rezessive bits)
    while((AT91C_BASE_CAN->CAN_SR & AT91C_CAN_WAKEUP) != 
AT91C_CAN_WAKEUP);

}
void can_interrupt_handler()
{
  volatile unsigned int  status ;   //status

    //CHECK for enabled interrupt
    status = ((AT91C_BASE_CAN->CAN_SR) & (AT91C_BASE_CAN->CAN_IMR));
    //Disable Interrupt & Clear
    AT91C_BASE_AIC->AIC_IDCR = (0x1 << AT91C_ID_CAN)|(0x1 << 
AT91C_ID_SYS);


  //WAKEUP interrupt
  if(status & AT91C_CAN_WAKEUP)
  {
    AT91C_BASE_CAN->CAN_IDR = AT91C_CAN_WAKEUP;
  }
  //MB1 INT
  if(status &  AT91C_CAN_MB1)
  {
    can_m1_handler();
  }

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren