Interrupt AT91SAM7x

Gast #3019325
Lesenswert?

Hallo zusammen,

ich bin auf der Suche nach einem Beispielprogramm für CAN-Interrupt 
(GNU).
ich benutze das EVAL-Board von OLIMEX-SAM7-EX256, als 
Entwicklungsumgebung benutze ich auch (Eclipse, Yagarto, Open-OCD).
Ich versuche die CAN-Schnittstelle zu betreiben. Das Senden funktioniert 
super. Beim Empfangen siehe ich Daten auf der Leitung aber die Interrupt 
wird nicht ausgelöst.

Danke im Voraus
Gast #3019407
Lesenswert?

Hallo gerhard,
Vielen Dank erstma;-)
Anbei mein Init_Code.
Kannst du mir bitte sagen was ich hier falsch mache.

Danke im Voraus



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;
  //  //enable WAKEUP Int
  //  AT91C_BASE_CAN->CAN_IER = AT91C_CAN_WAKEUP;

  //disable Reception Mailbox 0-7 interrupt
  //AT91C_BASE_CAN->CAN_IDR = AT91C_CAN_MB1; //| 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_CAN->CAN_IER = AT91C_CAN_WAKEUP;
  AT91C_BASE_AIC->AIC_IECR = 1 << AT91C_ID_CAN;      //Enable Interrupt

  //enable WAKEUP Int




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


AT91C_BASE_CAN->CAN_IER = AT91C_CAN_MB1 ;//| AT91C_CAN_MB2 | 
AT91C_CAN_MB3 | AT91C_CAN_MB4 | AT91C_CAN_MB5;


   // Clear and trigger Transfer
   AT91C_BASE_CAN->CAN_TCR = AT91C_CAN_MB1;// | AT91C_CAN_MB2 | 
AT91C_CAN_MB3 | AT91C_CAN_MB4 | AT91C_CAN_MB5;;
   AT91C_BASE_CAN->CAN_MB1.CAN_MB_MCR = AT91C_CAN_MTCR;

 AT91C_BASE_CAN->CAN_MR = AT91C_CAN_CANEN; //
Gast #3019484
Lesenswert?

hallo gast,
ich kann dir bei deinem problem leide rnicht helfen da ich das 
can-interface noch nie benutzt habe.
Ich würde mir mal das beispiel ansehen, da sollte die initialisierung 
entsprechend codiert sein.

gruss
gerhard
Gast #3019759
Lesenswert?

Hallo Gerhard,

das ist ja ein Beispiel für den internen Transfer. Ich bekomme meine 
Daten von einer Labview Oberfläsche. Die Daten kann ich mit dem 
Oszillator sehen. Ich weiß nicht warum die Interrupt sich nicht auslöst.

Gruß
Moris

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