Forum: Mikrocontroller und Digitale Elektronik CAN-Interrupt AT91SAM7


von Mosti (Gast)


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();
  }

von Mosti (Gast)


Lesenswert?

und keine Idee warum das Ding nicht funktioniert

von Mosti (Gast)


Lesenswert?

????

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.